我必须找出图像的轮廓。在那之后,我想找出如何在数字字符中填入空洞,而不是在其他空间中。图像如下。
http://i.stack.imgur.com/jlLYE.jpg
实际上,如果不可能,有没有其他方法让我在java平台中使用openCV来执行此图像的分割?我希望图片只包含字符。三江源。
答案 0 :(得分:0)
这是一个简单的方法(但我不确定它是否可以在任何地方使用。请自行测试)
注意:代码是Python,我不做Java,抱歉:(
import cv2 import numpy as np img = cv2.imread('test.png',0) ret, thresh = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
以下是阈值图像:
现在您可以尝试两种方法:
3A。 Median Blurring with 3x3 kernel
res = cv2.medianBlur(thresh,3)
<强>结果:强>
3B。 使用3x1内核(垂直)进行侵蚀。 3x1因为图像中的所有线条都更加水平。在其他图像中有垂直线,您可能需要使用3x3内核(不确定。检查它)
kernel = np.ones((3,1)) cls = cv2.erode(thresh, kernel)
如果您认为自己也丢失了部分数字,可以在侵蚀后进行扩张,或者用形态学开放功能替换所有部分。
结果:
最后,找到轮廓。它还会拾取预处理图像中留下的一些噪点,但您可以通过检查它们的纵横比,面积等来过滤掉它们。
答案 1 :(得分:0)
没有那么复杂的解决方案。想想图像的垂直游程长度表示:由于你只有黑色和白色,你可以认为图像的每条垂直线都是一个只包含1(黑色像素)和0(白色像素)的列表,所以你会有对于instace 01111111110000000000000111。如果你只采用每个只包含1或0的子列表的长度,这可以最小化,所以不是0000000001111111000111111111111而是0 9 7 3 12,从0开始因为我们说你总是从黑色像素的数量,并且因为在开始时你没有任何黑色像素你放一个0(这将更容易工作)。在进行此表示后,您将获取白色运行的最大值(运行实际上是白色或黑色像素的计数)和最小值(并且完成所有白色运行)。对于它们中的每一个,您会看到该值是否更接近最小的白色运行,如果是这种情况,您只需将其删除即可。
此算法应适用于给定的图像;)