我认为最好的方法是比较对比度,因为鸡蛋比秸秆巢更具反光性。 (相机具有红外线,因此图像部分为灰度)
如果可能,我想在.NET中执行此操作。
答案 0 :(得分:2)
尝试将图像调整为较小的尺寸,可能是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
...而不是分别比较三种颜色成分。不同的权重是由于我们认为绿色强于红色和红色强于蓝色。同样,我们不想要一个美丽的缩略图,我们想要一个良好的对比度。因此,您可能也想在这里做一些实验。可能只使用红色成分就足够了。根据照明条件,一种颜色成分可能会产生比其他成分更好的对比度。我建议,制作缩略图创建的灰色转换部分,并将缩略图写入文件或屏幕。这将允许您使用不同的设置(缩略图的大小,调整参数,颜色到灰度转换等)并直观地比较(中间)结果。使用(end-)结果创建位图(bmp)是一个非常好的主意。
Using
语句为您执行Dispose()
。即使在End Using
之前发生异常(包含隐藏的Try Finally
),它也会这样做。