如何仅使用形态学运算从图像重建文本?


16

我想从下面的图像中尽可能地重建文本。棘手的部分是我只想对图像使用形态学运算

我尝试使用腐蚀,膨胀,打开和关闭,但效果不是很好。

这有可能吗?

在此处输入图片说明


扩张似乎是消除那些模糊边缘的明显的第一步?
Paul R

是的,我认为这是我尝试的每种组合的第一步。

2
我认为您需要更多地定义您的问题。例如,如果您要表达的是如何使它更具可读性,那么稍微扩张就足够了。如果您想在任何失真处理之前准确地重建外观,那是不可能的,因为您的形态算法不了解所使用的特定字体的形状。
so12311 2011年

为了使其更具可读性,我用[0 1 0; 1 1 1; 0 1 0]。我正在寻找一种可以使文本看起来与原始文本非常接近的东西。
Jackobsen 2011年

Answers:


6

如果您愿意添加/减去经过形态转换的图像,则可以计算每个像素附近有多少个信号像素,并根据该数量来确定阈值。

img = imread('http://i.stack.imgur.com/wicpc.png');

n = false(3);n(4) = 1;
s = false(3);s(6) = 1;
w = false(3);w(2) = 1;
e = false(3);e(8) = 1;

%# note that you could convolve with a cross instead
fourNeighbourCount = imerode(img,n) + imerode(img,s) + imerode(img,w) + imerode(img,3) + img;

在此处输入图片说明

%# require at least two neighbours
img = fourNeighbourCount > 1;

在此处输入图片说明

然后,如果您在中间有一个洞的3x3蒙版进行卷积,则可以得到以下内容:

在此处输入图片说明


3

这是一个很有趣的问题!尝试中值过滤器。有关更多详细信息,请参见此处此处的参考。

尽管我没有动手模拟您的问题,但这是一个建议。我的直觉告诉您,它可能会给您带来极大的好处,因为众所周知,它可以抵抗盐分-胡椒粉类型的噪音。在您的情况下,图像的边框周围有多余的白点,这些白点将转换为全白或全黑,具体取决于字母的哪一侧。这是中值滤波后的外观:

在此处输入图片说明


1

如果由于某种原因您仅限于使用形态学运算,则可以考虑使用面向封闭运算的“投票方案”。

形态运算的一个问题是它们并没有真正考虑方向性。对于中心像素,像这样的邻域

1 0 0
1 1 0
0 1 1

真的和这样的社区没什么不同

0 1 0
1 1 0
1 1 0

这可能会引起问题,因为您可能不希望膨胀和腐蚀受到定向偏向。因此,您可以做的一件事是使用类似以下的内核来找到最合适的方向偏向形态运算:

1 1 0   1 0 0   1 0 0
0 1 0   1 1 0   1 1 0
0 1 1   0 1 1   0 1 1 . . .

使用5 x 5内核会更好,但是我认为这个主意很清楚。基本上,拐角检测内核的想法有点延伸,因此它是线段检测内核。您还可以使用它来找到最佳拟合曲线:

0 0 0 1 1
0 0 1 1 0
0 1 1 0 0 
0 0 1 1 0
0 0 0 1 1

显然,这会导致大量的内核,但是如果基本思想可行,便可以为您提供一种优化该技术的方法,以便一次找到最合适的内核。

无论如何,如果您使用多个内核和某些逻辑,则与传统的形态学步骤相比,(x,y)处的每个操作都需要更多的计算:

  1. 在每个像素(x,y)处,应用几个形态运算符。对于每个运算符,请计算形态运算的结果以及输入与内核的匹配程度。(“度” =匹配的像素数)
  2. 选择与实际开/关像素配置最匹配的内核形态结果。

内核的大小必须与输入的大小匹配。您可以使用“扩展”内核来减少操作数量,而不是使用更大的内核。以下内核只是半径大于1的3 x 3内核。

1 0 0 0 0 0 0
0 0 0 0 0 0 0
1 0 0 1 0 0 0
0 0 0 0 0 0 0
1 0 0 0 0 0 1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.