ПОНЯТНО О Visual Basic NET (том 2)

Как узнать цвет точки на фотографии


GetPixel и свойства R, G, B.   Задача: У вас есть фотография морского пляжа и вы хотите узнать, какого цвета зонтик вот у этой дамы слева.

Решение: Сначала вы заносите фото в компьютер и создаете объект Bitmap с этим фото. Затем, чтобы не было разницы между пикселями экрана и пикселями объекта, создаете еще один объект Bitmap с заданными размерами, как мы это делали в 12.3.4. Для наглядности нарисуйте это фото на форме. Затем вам нужно узнать координаты хоть какой-нибудь точки на зонтике. Я думаю, вы сами догадаетесь, как это сделать. Совершенно верно, методом «тыка». Здесь вам поможет маленькая окружность, которую  вы рисуете на фото и координаты которой вы наугад подбираете так, чтобы попасть в зонтик. Как только вы увидите, что окружность оказалась прямо на зонтике, можно приступать к определению цвета в ее центре. Для этого вы используете функцию  GetPixel объекта Bitmap и свойства R, G, B структуры Color:

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        Dim Гр As Graphics = Me.CreateGraphics

        Dim Фото As New Bitmap("Spacescape.JPG")

        Dim Фото1 As New Bitmap(Фото, 500, 400)

        Dim Цвет_точки As Color

        Dim x, y, Красный, Зеленый, Синий As Integer

        Гр.DrawImage(Фото1, 0, 0)

        x = InputBox("Введите горизонтальную координату точки")

        y = InputBox("Введите вертикальную координату точки")

        Гр.DrawEllipse(New Pen(Color.Yellow, 3), x - 5, y - 5, 10, 10)     'Рисуем маленькую окружность

        Цвет_точки = Фото1.GetPixel(x, y)      'Определяем  цвет заданной точки



        Красный = Цвет_точки.R                     'Количество красного

        Зеленый = Цвет_точки.G                     'Количество зеленого

        Синий = Цвет_точки.B                         'Количество синего

        Debug.WriteLine(Цвет_точки)

        Debug.WriteLine(Красный)

        Debug.WriteLine(Зеленый)

        Debug.WriteLine(Синий)


End Sub
Пояснения: Функция  GetPixel
объекта Bitmap определяет цвет пикселя с заданными координатами в объекте Bitmap. Она возвращает значение типа Color. Свойства R, G, B структуры Color являются целыми числами в диапазоне 0-255 и имеют значение количества в ней красного, зеленого и синего цвета.
Программа выдаст результаты такого вида:
Color [A=255, R=209, G=183, B=98]
209
183
98
Вам придется удовлетвориться тем, что вы узнаете содержание основных цветов в нужной точке рисунка. Имейте в виду, что программа находит цвет одной точки на зонтике, а не всего зонтика. Если зонтик хоть чуть-чуть пестрый, разные точки на зонтике имеют разный цвет и результат будет дезориентирующим. Часто пестрый узор настолько мелок, что издалека он кажется вам однородным цветом, и лишь большое увеличение позволяет обнаружить пестроту.
У структуры Color имеется также свойство A, определяющее прозрачность в том смысле, о котором мы только что говорили.
SetPixel.  Вы можете не только узнавать цвет пикселя, но и рисовать в любом месте объекта Bitmap пиксель нужного цвета. Для этого вы используете функцию  SetPixel объекта Bitmap. Так, в условиях предыдущей задачи оператор
                Фото1.SetPixel(x, y, Color.Blue)
поставил бы синюю точку в центр окружности. Только не забывайте после этого нарисовать содержимое объекта на экране, а то вы эту точку не увидите.
Вот фрагмент, рисующий на фотографии синий треугольник из пикселей:
        x0 = InputBox("Введите горизонтальную координату точки")
        y0 = InputBox("Введите вертикальную координату точки")
        For y = y0 To y0 + 100
            For x = x0 To y
                Фото1.SetPixel(x, y, Color.Blue)
            Next
        Next
        Гр.DrawImage(Фото1, 0, 0)
Задание 74.          
Определить цвет заданной точки на картинке и выдать одно из трех сообщений:
  • В этом пикселе красной краски больше, чем двух остальных.

  • В этом пикселе зеленой краски больше, чем двух остальных.

  • В этом пикселе синей краски больше, чем двух остальных.

  • Перспективы. Распознав цвет точки на картинке, вы сделали первый шаг к решению великой и не решенной до сих пор наукой задачи распознавания зрительных образов. Пожалуй, вы уже сейчас в силах написать программу, которая в большинстве случаев правильно отличит фотографию песчаной пустыни от фотографии океана. Но знаете ли вы, что не родился еще гений, способный написать программу, надежно отличающую хотя бы фотографию собаки от фотографии кошки? Потому что здесь дело не столько в цвете, сколько в форме. А это уже гораздо сложнее.
    Решение задачи распознавания образов – ключ к осуществлению величайшей и самой дерзкой мечты ученых – созданию искусственного интеллекта, электронного разума, равного человеческому или превосходящего его.

    Содержание раздела