我尝试使用腐蚀,膨胀,打开和关闭,但效果不是很好。
这是否可能?
#1 楼
如果您愿意添加/减去经过形态转换的图像,则可以计算每个像素附近有多少个信号像素,并根据该数量来计算阈值。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的面具在中间有一个洞,您可以得到像这样的东西:
#2 楼
这是一个很有趣的问题!尝试使用中值过滤器。有关更多详细信息,请参见此处和此处的参考。尽管我没有动手模拟您的问题,但这是一个建议。我的直觉告诉您,它可能会给您带来极大的好处,因为众所周知,它可以抵抗盐分-胡椒粉噪声。在您的情况下,图像的边框周围有多余的白点,这些白点将转换为全白或全黑,具体取决于字母的哪一侧。这是中值滤波后的结果:
#3 楼
如果由于某种原因您仅限于使用形态学运算,则可以考虑使用面向封闭运算的“投票方案”。形态运算的一个问题是它们并未真正考虑方向性。对于中心像素,像这样的邻域
1 0 0
1 1 0
0 1 1
与像这样的邻域确实没有什么不同/>这可能会引起问题,因为您可能不希望膨胀和腐蚀受到定向偏向。因此,您可以做的一件事就是使用像这样的内核找到最合适的方向偏向的形态学运算:
0 1 0
1 1 0
1 1 0
使用5 x 5内核会更好,但是我认为这个主意很清楚。基本上,拐角检测内核的概念有点扩展,因此它是线段检测内核。您还可以使用它来找到最合适的曲线:
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 . . .
显然,这会导致产生大量内核,但是如果基本思想能够为您显示出希望,
无论如何,如果使用多个内核和某些逻辑,则在(x,y)处的每个操作都需要比传统的形态学步骤要多的计算:
在每个像素(x,y)上,应用几个形态学算子中的每一个。对于每个运算符,请计算形态运算的结果以及输入与内核的匹配程度。 (“度” =匹配的像素数)
选择与实际的开/关像素配置最匹配的内核形态结果。
必须匹配内核的大小输入的大小。您可以使用“扩展”内核来减少操作数量,而不是使用更大的内核。以下内核只是半径大于1的3 x 3内核。
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
评论
扩张似乎是消除这些模糊边缘的显而易见的第一步?是的,我认为这是我尝试的每种组合的第一步。
我认为您需要更多地定义您的问题。例如,如果您要表达的是如何使它更具可读性,那么稍微扩张就足够了。如果您想在任何失真处理之前精确地重建外观,那是不可能的,因为您的形态算法不了解所使用的特定字体的形状。
为了使其更具可读性,我用[0 1 0; 1 1 1; 0 1 0]。我正在寻找可以使文本看起来与原始文本非常接近的东西。