增强涂黑区域以使其中的文本可读的最佳方法是什么?
What is the best approach to enhance blacked out areas to make the text inside them readable.?
我正在尝试增强通过扫描数字化的旧手绘地图,这个过程导致图像中的一些区域变黑,使得其中的文本很难阅读。
我使用 MATLAB 尝试了自适应直方图均衡化和其他几种基于直方图的方法,但没有任何结果给我想要的结果。我可能可以使用自适应直方图均衡化来减轻较深的灰色阴影并使其看起来更好一些,但这对文本没有真正的帮助。
具体来说,我尝试了 adapthisteq()
不同的变体,这是 MATLAB 中可用的函数。
像这样:
A = adapthisteq(I,'NumTiles',X,'clipLimit',0.01,'Distribution','uniform');
...并且还尝试通过查看图像直接更改像素值,如下所示:
I(10 > I & I > 0) = 0;
I(30 > I & I > 10) = 10;
I(255 > I & I > 30) = 255;
我可以增强图像并获得只有黑色和白色的最终结果,其中线条和文本(基本上所有信息)变成黑色 (0),灰色和较白区域的阴影变成白色 ( 255 或 1)?
这可能吗?如果不是,我什至可以接近它或尽可能接近所需结果的最佳解决方案是什么。感谢任何帮助。
这是原始图片的样子:
下面是我尝试使用自适应直方图均衡化解决方案后的结果:
听起来像是使用自适应阈值的经典案例。一般意义上的自适应阈值通过查看局部图像像素邻域、计算平均强度并查看是否有一定百分比的像素超过该平均强度来工作。如果是,我们将输出设置为白色,如果不是,我们将其设置为黑色。
一种经典方法是使用 Bradley-Roth 算法。
如果你想看到算法的解释,你可以看看我之前写的关于它的答案:
但是,如果您想了解它的要点,请先拍摄图像的 integral image 灰度版本。积分图像很重要,因为它允许您以 O(1)
复杂度计算 window 内的像素总和。然而,积分图像的计算通常是O(n^2)
,但你只需要做一次。使用积分图像,您扫描大小为 s x s
的像素邻域,并检查平均强度是否小于此 s x s
window 内实际平均值的 t%
然后这是分类为背景的像素。如果它更大,则它被归类为前景的一部分。这是自适应的,因为阈值处理是使用局部像素邻域而不是使用全局阈值完成的。
在这个post:上,有我写的MATLAB代码,它是Bradley-Roth算法的一个实现,所以非常欢迎你使用它。
但是,对于您的图像,我用来获得一些不错结果的参数是 s = 12
和 t = 25
。
经过运行算法后,我得到这张图片:
请注意,它并不完美...但是您可以开始看到一些以前没有看到的文本。特别是在底部,我看到了 Lemont Library - Built 1948...我们之前在原始图像中看不到它。
尝试一下代码和参数,阅读算法,然后自己尝试一下。
希望对您有所帮助!
我正在尝试增强通过扫描数字化的旧手绘地图,这个过程导致图像中的一些区域变黑,使得其中的文本很难阅读。
我使用 MATLAB 尝试了自适应直方图均衡化和其他几种基于直方图的方法,但没有任何结果给我想要的结果。我可能可以使用自适应直方图均衡化来减轻较深的灰色阴影并使其看起来更好一些,但这对文本没有真正的帮助。
具体来说,我尝试了 adapthisteq()
不同的变体,这是 MATLAB 中可用的函数。
像这样:
A = adapthisteq(I,'NumTiles',X,'clipLimit',0.01,'Distribution','uniform');
...并且还尝试通过查看图像直接更改像素值,如下所示:
I(10 > I & I > 0) = 0;
I(30 > I & I > 10) = 10;
I(255 > I & I > 30) = 255;
我可以增强图像并获得只有黑色和白色的最终结果,其中线条和文本(基本上所有信息)变成黑色 (0),灰色和较白区域的阴影变成白色 ( 255 或 1)?
这可能吗?如果不是,我什至可以接近它或尽可能接近所需结果的最佳解决方案是什么。感谢任何帮助。
这是原始图片的样子:
下面是我尝试使用自适应直方图均衡化解决方案后的结果:
听起来像是使用自适应阈值的经典案例。一般意义上的自适应阈值通过查看局部图像像素邻域、计算平均强度并查看是否有一定百分比的像素超过该平均强度来工作。如果是,我们将输出设置为白色,如果不是,我们将其设置为黑色。
一种经典方法是使用 Bradley-Roth 算法。
如果你想看到算法的解释,你可以看看我之前写的关于它的答案:
但是,如果您想了解它的要点,请先拍摄图像的 integral image 灰度版本。积分图像很重要,因为它允许您以 O(1)
复杂度计算 window 内的像素总和。然而,积分图像的计算通常是O(n^2)
,但你只需要做一次。使用积分图像,您扫描大小为 s x s
的像素邻域,并检查平均强度是否小于此 s x s
window 内实际平均值的 t%
然后这是分类为背景的像素。如果它更大,则它被归类为前景的一部分。这是自适应的,因为阈值处理是使用局部像素邻域而不是使用全局阈值完成的。
在这个post:
但是,对于您的图像,我用来获得一些不错结果的参数是 s = 12
和 t = 25
。
经过运行算法后,我得到这张图片:
请注意,它并不完美...但是您可以开始看到一些以前没有看到的文本。特别是在底部,我看到了 Lemont Library - Built 1948...我们之前在原始图像中看不到它。
尝试一下代码和参数,阅读算法,然后自己尝试一下。
希望对您有所帮助!