Image processing 放大黑线的阈值
给定一个图像(如下面给出的图像),我需要将其转换为二值图像(仅黑白像素)。这听起来很简单,我已经尝试了两个阈值函数。问题是我无法使用这两个函数中的任何一个来获得完美的边。任何帮助都将不胜感激 我尝试过的过滤器是,RGB和HSV空间中的欧几里德距离 示例图像: 这里是在运行RGB阈值过滤器之后。(在此之后,40%的人会受到更多的影响) 这里是在运行HSV阈值过滤器之后。(在30%的情况下,由于噪音,路径变得几乎看不见,但显然无法使用) 我使用的代码非常简单。将输入图像更改为适当的颜色空间,并用黑色检查欧几里德距离Image processing 放大黑线的阈值,image-processing,colors,Image Processing,Colors,给定一个图像(如下面给出的图像),我需要将其转换为二值图像(仅黑白像素)。这听起来很简单,我已经尝试了两个阈值函数。问题是我无法使用这两个函数中的任何一个来获得完美的边。任何帮助都将不胜感激 我尝试过的过滤器是,RGB和HSV空间中的欧几里德距离 示例图像: 这里是在运行RGB阈值过滤器之后。(在此之后,40%的人会受到更多的影响) 这里是在运行HSV阈值过滤器之后。(在30%的情况下,由于噪音,路径变得几乎看不见,但显然无法使用) 我使用的代码非常简单。将输入图像更改为适当的颜色空间,并
sqrt(R*R + G*G + B*B)
因为我在比较黑色(0,0,0)您可能希望将其作为三步操作来完成
您的问题似乎是扫描图像上的照明变化,这表明局部自适应阈值方法将提供更好的结果 Sauvola方法基于原始图像窗口中像素的平均值和标准偏差计算二值化像素的值。这意味着,如果图像的某个区域通常较暗(或较亮),则将针对该区域调整阈值,并且(可能)在二值化图像中提供较少的暗斑点或褪色线 我还发现了Shafait等人的一种方法,它以更高的时间效率实现了Sauvola方法。缺点是您必须计算原始图像的两个整数图像,一个为8位/像素,另一个可能为64位/像素,这可能会带来内存限制问题
这两种方法我都没有试过,但看起来确实很有希望。我通过粗略的谷歌搜索找到了两者的Java实现。在HSV颜色空间的V通道上运行自适应阈值应该会产生出色的结果。最好的结果来自大于11x11大小的窗口,不要忘记为阈值选择一个负值 自适应阈值基本上是:
if (Pixel value + constant > Average pixel value in the window around the pixel )
Pixel_Binary = 1;
else
Pixel_Binary = 0;
由于噪声和光照变化,您可能需要自适应局部阈值,这也要感谢比克的回答 因此,我尝试了以下步骤:
- 将其转换为灰度
- 对于平均值或中值局部阈值,我使用10作为窗口大小,10作为截距常数,得到了这张图像(较小的值也可能有用): 请参考:如果您需要更多 关于这种技术的信息
- 为了确保阈值处理工作正常,我对其进行了骨架处理,以查看是否有换行。此骨架可能是进一步处理所需的骨架
- 要获得剩余的噪声,您只需在骨架化图像中找到最长的连接组件
祝你好运。你试过霍夫函数和噪声过滤器吗?我相信你可以很好地利用matlab的imnoise(..),其实不是,因为当我增加阈值时,很多图像会因为阴影而完全变黑。我想噪音过滤器不能消除这些。。我可能错了。试着用边缘检测或者用hough变换来寻找线条。我是在android平台上写这篇文章的。所以如果你们能推荐一个好的图书馆。。我不想手工编写所有这些算法。显然,请看这个问题:我是在Android平台上写的,所以你能给我指一个好的库来帮我处理这些操作吗?你指定的内核会使图像模糊,而不会检测边缘。哦,对不起,@Zaphod是对的:那是一个平滑内核;这里有一些简单的5x5内核,但是有一个很好的解释为什么这样做,还有一些常见的内核。另外:我不确定Android是否有内置的,但作为一种基于Java的语言,如果你能访问图像的像素,编写卷积是非常简单的。创建一个与图像像素阵列大小相同的阵列,对图像进行卷积,将结果放入新阵列中,然后根据新阵列进行阈值处理。当您已经开始使用大部分灰色图像时,无需转换为HSV-只需从R、G、B中选择噪声最小的通道,通常为绿色。