正确填充图像中的孔

时间:2014-04-09 03:57:50

标签: java opencv

我必须找出图像的轮廓。在那之后,我想找出如何在数字字符中填入空洞,而不是在其他空间中。图像如下。

http://i.stack.imgur.com/jlLYE.jpg

实际上,如果不可能,有没有其他方法让我在java平台中使用openCV来执行此图像的分割?我希望图片只包含字符。三江源。

http://i.stack.imgur.com/kY4Dh.png

2 个答案:

答案 0 :(得分:0)

这是一个简单的方法(但我不确定它是否可以在任何地方使用。请自行测试)

注意:代码是Python,我不做Java,抱歉:(

  1. 加载灰度图像
  2. 应用Otsu的二值化
  3. 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)
    

    以下是阈值图像

    enter image description here

    现在您可以尝试两种方法:

    3A。 Median Blurring with 3x3 kernel

      

    res = cv2.medianBlur(thresh,3)

    <强>结果:

    enter image description here

    3B。 使用3x1内核(垂直)进行侵蚀。 3x1因为图像中的所有线条都更加水平。在其他图像中有垂直线,您可能需要使用3x3内核(不确定。检查它)

    kernel = np.ones((3,1))
    cls = cv2.erode(thresh, kernel)
    

    如果您认为自己也丢失了部分数字,可以在侵蚀后进行扩张,或者用形态学开放功能替换所有部分。

    结果:

    enter image description here

    最后,找到轮廓。它还会拾取预处理图像中留下的一些噪点,但您可以通过检查它们的纵横比,面积等来过滤掉它们。

答案 1 :(得分:0)

没有那么复杂的解决方案。想想图像的垂直游程长度表示:由于你只有黑色和白色,你可以认为图像的每条垂直线都是一个只包含1(黑色像素)和0(白色像素)的列表,所以你会有对于instace 01111111110000000000000111。如果你只采用每个只包含1或0的子列表的长度,这可以最小化,所以不是0000000001111111000111111111111而是0 9 7 3 12,从0开始因为我们说你总是从黑色像素的数量,并且因为在开始时你没有任何黑色像素你放一个0(这将更容易工作)。在进行此表示后,您将获取白色运行的最大值(运行实际上是白色或黑色像素的计数)和最小值(并且完成所有白色运行)。对于它们中的每一个,您会看到该值是否更接近最小的白色运行,如果是这种情况,您只需将其删除即可。

此算法应适用于给定的图像;)