如何仅使用形态学操作从图像中重建文本?

信息处理 图像处理 形态操作
2021-12-26 03:42:00

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

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

这甚至可能吗?

在此处输入图像描述

3个回答

如果您愿意添加/减去等形态变换的图像,您可以计算每个像素附近有多少信号像素,以及基于该数字的阈值。

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 蒙版进行卷积,你会得到这样的结果:

在此处输入图像描述

这是一个非常有趣的问题要解决!试试中值滤波器有关更多详细信息,请参阅此处此处的参考。

虽然我没有亲自模拟你的问题,但这是一个建议。我的直觉说它可能会给您带来很大的好处,因为众所周知,它可以抵抗椒盐类噪音。在您的情况下,图像的边框周围有额外的白点,它们会根据字母表的哪一侧转换为全白或全黑。这是中值滤波后的样子:

在此处输入图像描述

如果由于某种原因您仅限于使用形态学操作,那么您可以考虑使用面向关闭操作的“投票方案”。

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

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