Попробуйте изменить размер изображения до меньшего размера, возможно, 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
).