什么是快速和可靠的方式阈值图像可能模糊和不均匀的亮度?快速图像阈值
实施例(模糊但均匀的亮度):
因为图像是不能保证有均匀的亮度,这是不可行的使用固定的阈值。自适应阈值的作品还好,但由于模糊的它在功能产生断裂和扭曲(在这里,最重要的特点是独位):
我也用直方图均衡化尝试(使用OpenCV的equalizeHist
函数)。它增加对比度而不减少亮度差异。
我发现的最好的解决方案是将图像的形态学关闭(归功于this post)以使亮度一致,然后重新归一化,然后使用固定阈值(使用Otsu算法选择最佳阈值水平) :
这里是OpenCV的此代码的Android:
Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_ELLIPSE, new Size(19,19));
Mat closed = new Mat(); // closed will have type CV_32F
Imgproc.morphologyEx(image, closed, Imgproc.MORPH_CLOSE, kernel);
Core.divide(image, closed, closed, 1, CvType.CV_32F);
Core.normalize(closed, image, 0, 255, Core.NORM_MINMAX, CvType.CV_8U);
Imgproc.threshold(image, image, -1, 255, Imgproc.THRESH_BINARY_INV
+Imgproc.THRESH_OTSU);
这个伟大的工程,但闭合动作很慢。减小结构元素的尺寸会提高速度,但会降低精度。
编辑:基于DCS的建议,我尝试使用高通滤波器。我选择了拉普拉斯滤波器,但我希望Sobel和Scharr滤波器有类似的结果。该滤波器在不包含特征的区域中拾取高频噪声,并且由于模糊而遭受与自适应阈值类似的失真。它也需要与关闭操作一样长。下面是一个15×15滤波器的例子:
编辑2:基于AruniRC的回答中,我使用Canny边缘检测的图像上的与所述建议的参数:
double mean = Core.mean(image).val[0];
Imgproc.Canny(image, image, 0.66*mean, 1.33*mean);
我不确定如何自动自动微调参数获取连接数字。
假设brigthness变化发生在低频率,您可以尝试在高通滤波图像上设置阈值。但是,我不知道这些过滤器操作在移动设备上的速度有多快,而且我认为您需要一个相当大的内核。 – DCS 2013-03-22 08:42:35
@DCS不幸的是,我不认为高通滤波器可以工作。看到我的编辑到上面的帖子。 – 2013-03-22 22:25:37
由于您感兴趣的功能涵盖多个像素,因此如何将图像先降低至较低分辨率?然后,您可以返回并以原始分辨率获取更多细节,并使用较低分辨率的版本作为蒙版。 – 2013-03-24 03:49:17