Сравнение двух изображений - Обнаружение яйца в гнезде - PullRequest
0 голосов
/ 10 декабря 2011

У меня есть веб-камера прямо над куриным гнездом.Эта камера снимает изображения и загружает их в папку на сервере.Я хотел бы определить, было ли на этом изображении отложено яйцо.

Я думаю, что лучшим способом было бы сравнить контраст, поскольку яйцо будет гораздо более отражающим, чем гнездо из соломы.(Камера имеет инфракрасный порт, поэтому изображение частично серого цвета)

Я бы хотел сделать это в .NET, если это возможно.

1 Ответ

2 голосов
/ 11 декабря 2011

Попробуйте изменить размер изображения до меньшего размера, возможно, 10 x 10 пикселей. Это усредняет любые мелкие неприятные детали.

Const  N As Integer = 10
Dim newImage As New Bitmap(N, N)
Dim fromCamera As Image = Nothing ' Get image from camera here
Using gr As Graphics = Graphics.FromImage(newImage)
    gr.SmoothingMode = SmoothingMode.HighSpeed
    gr.InterpolationMode = InterpolationMode.Bilinear
    gr.PixelOffsetMode = PixelOffsetMode.HighSpeed
    gr.DrawImage(fromCamera, New Rectangle(0, 0, N, N))
End Using

Примечание: вам не нужно высокое качество, но вам нужно хорошее усреднение. Возможно, вам придется проверить различные настройки качества.

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


РЕДАКТИРОВАТЬ (в ответ на комментарий):

Ваш код хорошо структурирован и имеет смысл. Вот некоторые мысли:

Рассчитать значение серого из значения цвета с помощью:

Dim grayValue = c.R * 0.3 + c.G * 0.59 + c.B * 0.11

... вместо сравнения трех цветовых компонентов по отдельности. Разные веса обусловлены тем, что мы воспринимаем зеленый сильнее, чем красный, а красный сильнее, чем синий. Опять же, нам не нужны красивые миниатюры, нам нужен хороший контраст. Поэтому вы можете также провести здесь некоторые эксперименты. Может быть, достаточно использовать только красный компонент. В зависимости от условий освещения один цветовой компонент может дать лучший контраст, чем другие. Я бы порекомендовал сделать серое преобразование частью создания миниатюр и записать миниатюры в файл или на экран. Это позволит вам поиграть с различными настройками (размер миниатюры, параметры изменения размера, преобразование цвета в серый и т. Д.) И визуально сравнить (промежуточные) результаты. Создание растрового изображения (bmp) с результатом (end-) - очень хорошая идея.

Оператор Using делает для вас Dispose(). Он делает это даже в том случае, если исключение должно произойти до End Using (здесь задействован скрытый Try Finally).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...