我正在尝试im p lement Epshtein's paper( 使用笔画宽度变换检测自然场景中的文字(2010) )进行文本检测在自然图像中。 第一步是边缘检测。
我在文本中得到了一些额外的边缘。我应该如何删除它们?
原始图片:
我的边缘检测:
在示例中,您可以在text'WHY HURRY'中看到额外的边缘
我在Matlab中尝试了这些步骤:
% contrast enhancement
I_adjust = imadjust(I);
% dilation & erosion
se = strel(ones(3,3));
I_dilate = imdilate(I_adjust, se);
I_final = imerode(I_dilate, se);
% gaussian smoothing
h_mask = fspecial('gaussian');
I_final = imfilter(I_final,h_mask);
figure; imshow(I_final);
BW_canny = edge(I_final,'canny');
figure; imshow(BW_canny);
根据belisarius的建议,我发现均值平移滤波器对于文本区域分割非常有效。现在我在实施笔画宽度变换时遇到了另一个问题(看看Epshtein的论文)。
笔画宽度适用于'H''Y'等字符,即使对于'S'也是如此,因为如果我们沿着渐变方向前进,相应的边缘通常是恒定的距离。
问题出现在'W'之类的字符中。对于左上边缘的第一个上行程的一部分,我们得到第二个上行链路的右边缘作为其对应的边缘。而对于另一部分,我们得到第一次上行的右边缘。这引入了'W'区域的笔划宽度的显着变化,导致根据纸张将其称为非文本区域。
有人可以建议任何解决方案吗?
答案 0 :(得分:10)
在边缘检测之前使用Mean Shift Filter
。 Mathematica中的示例:
i = Import["http://img839.imageshack.us/img839/28/whyhurry.jpg"];
iM = MeanShiftFilter[i, 2, .15, MaxIterations -> 10]
EdgeDetect[iM]
输出:
答案 1 :(得分:0)
查看edge
和Matlab documentation
您可以致电edge(I, 'canny', thresh, sigma)
以获得更多控制权。使用低边缘和高边缘阈值。我首先尝试降低高阈值:由于内部边缘没有连接到字母边缘,因此渐变幅度必须超过字母内部的高阈值。
您还可以增加sigma
以在边缘检测之前模糊图像。 (你的高斯模糊是多余的,因为edge
为你模糊图像。)