我想尽可能地从下图中重建文本。棘手的部分是我只想对图像使用形态学操作
我尝试使用腐蚀、膨胀、打开和关闭,但结果不是很好。
这甚至可能吗?
我想尽可能地从下图中重建文本。棘手的部分是我只想对图像使用形态学操作
我尝试使用腐蚀、膨胀、打开和关闭,但结果不是很好。
这甚至可能吗?
如果您愿意添加/减去等形态变换的图像,您可以计算每个像素附近有多少信号像素,以及基于该数字的阈值。
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 的 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