从二值化图像中删除要素

时间:2014-03-27 21:55:37

标签: python image-processing numpy computer-vision scikit-image

我写了一个小脚本来将黑板图片转换成我可以打印并标记的形式。

我拍的照片是这样的:

enter image description here

自动裁剪,然后将其二值化。这是脚本的输出:

enter image description here

我想从图像中删除最大的连接黑色区域。有一种简单的方法可以做到这一点吗?

我正在考虑侵蚀图像以消除文本,然后从原始的二值化图像中减去侵蚀的图像,但我不能认为这是一种更合适的方法。

3 个答案:

答案 0 :(得分:7)

当然,您可以使用findContours或floodFill获取连接组件(特定大小),并擦除它们,留下一些污点。但是,如果你想做得对,你会想到为什么你首先要有黑色区域。

您没有使用自适应阈值处理(局部自适应),这使您的输出对着色敏感。尝试不要通过运行这样的东西来获得黑色区域:

Mat img = imread("desk.jpg", 0);
Mat img2, dst;
pyrDown(img, img2);
adaptiveThreshold(255-img2, dst, 255,  ADAPTIVE_THRESH_MEAN_C,
        THRESH_BINARY, 9, 10); imwrite("adaptiveT.png", dst);
imshow("dst", dst);
waitKey(-1);

enter image description here

将来,您可能会阅读有关自适应阈值以及如何在本地采样颜色的内容。我个人发现,对图像渐变(在其两侧)正交地采样二进制颜色很有用。这样,白色和黑色的样本具有相同的尺寸,这是一个很大的问题,因为通常有更多的背景颜色偏向估计。使用SWTMSER可能会为您提供有关文本细分的更多建议。

答案 1 :(得分:2)

我试过了:

import numpy as np
import cv2

im = cv2.imread('image.png')

gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
grayout = 255*np.ones((im.shape[0],im.shape[1],1), np.uint8)
blur = cv2.GaussianBlur(gray,(5,5),1)
thresh = cv2.adaptiveThreshold(blur,255,1,1,11,2)
contours,hierarchy = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
wcnt = 0
for item in contours:
    area =cv2.contourArea(item) 
    print wcnt,area
    [x,y,w,h] = cv2.boundingRect(item)
    if area>10 and area<200:
        roi = gray[y:y+h,x:x+w]

        cntd = 0
        for i in range(x,x+w):
            for j in range(y,y+h):
                if gray[j,i]==0:
                    cntd = cntd + 1
        density = cntd/(float(h*w))

        if density<0.5:
            for i in range(x,x+w):
                for j in range(y,y+h):
                    grayout[j,i] = gray[j,i];
        wcnt = wcnt + 1

cv2.imwrite('result.png',grayout)

你必须平衡两件事,消除黑点,但要平衡,不要丢失板上的内容。我得到的输出是:

enter image description here

答案 2 :(得分:1)

这是一个Python numpy实现(使用我自己的mahotas包)该方法的最佳答案(我认为几乎相同):

import mahotas as mh
import numpy as np

进口mahotas&amp; numpy标准缩写

im = mh.imread('7Esco.jpg', as_grey=1)

加载图片&amp;转换为灰色

im2 = im[::2,::2]
im2 = mh.gaussian_filter(im2, 1.4)

下采样和模糊(用于速度和噪音消除)。

im2 = 255 - im2

反转图像

mean_filtered = mh.convolve(im2.astype(float), np.ones((9,9))/81.)

平均过滤实施&#34;手工&#34;卷积。

imc = im2 > mean_filtered - 4

您可能需要在此处调整数字4,但此图片效果很好。

mh.imsave('binarized.png', (imc*255).astype(np.uint8))

转换为8位并以PNG格式保存。

Result of algorithm