Image 如何删除.jpg图像文件中的所有行?

Image 如何删除.jpg图像文件中的所有行?,image,opencv,image-processing,computer-vision,imagemagick,Image,Opencv,Image Processing,Computer Vision,Imagemagick,我需要删除图像中的行,这最终是一个表。我找到了一种去除水平线和垂直线的方法: convert 1.jpg -type Grayscale -negate -define morphology:compose=darken -morphology Thinning 'Rectangle:1x80+0+0<' -negate out.jpg convert 1.jpg-类型灰度-否定-定义形态学:合成=变暗-形态学细化'矩形:1x80+0+0 您可以尝试使用检测对角线,然后使用遮罩填充轮廓

我需要删除图像中的行,这最终是一个表。我找到了一种去除水平线和垂直线的方法:

convert 1.jpg -type Grayscale -negate -define morphology:compose=darken -morphology Thinning 'Rectangle:1x80+0+0<' -negate out.jpg
convert 1.jpg-类型灰度-否定-定义形态学:合成=变暗-形态学细化'矩形:1x80+0+0

您可以尝试使用检测对角线,然后使用遮罩填充轮廓

import cv2
import numpy as np

image = cv2.imread('1.jpg')
mask = np.zeros(image.shape, np.uint8)
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
canny = cv2.Canny(gray,100,200)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
close = cv2.morphologyEx(canny, cv2.MORPH_CLOSE, kernel)
minLineLength = 10
maxLineGap = 350
lines = cv2.HoughLinesP(close,1,np.pi/180,100,minLineLength,maxLineGap)
for line in lines:
    for x1,y1,x2,y2 in line:
        cv2.line(mask,(x1,y1),(x2,y2),(255,255,255),3)

mask = cv2.cvtColor(mask,cv2.COLOR_BGR2GRAY)
cnts = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

for c in cnts:
    cv2.drawContours(image, [c], -1, (255,255,255), -1)

cv2.imshow('mask', mask)
cv2.imshow('image', image)
cv2.imwrite('image.png', image)
cv2.waitKey()

这是另一种方法。我使用Imagemagick,因为我不精通OpenCV。基本上,我对图像进行二值化。然后执行连接组件处理以隔离最大的连续黑色区域,这将是要排除的黑色线。然后用它作为遮罩,在线条上填充白色。这是带有Imagemagick的Unix语法

请注意,如果某些文本字符碰到黑线,它们将丢失

输入:

id=`convert Arkey.jpg -threshold 50% -type bilevel \
-define connected-components:verbose=true \
-define connected-components:mean-color=true \
-connected-components 4 null: |\
grep "gray(0)" | head -n 1 | sed -n 's/^ *\(.*\):.*$/\1/p'`
convert Arkey.jpg \( -clone 0 -fill white -colorize 100 \) mask.png -compose over -composite result.png

获取最大黑色区域的id号:

id=`convert Arkey.jpg -threshold 50% -type bilevel \
-define connected-components:verbose=true \
-define connected-components:mean-color=true \
-connected-components 4 null: |\
grep "gray(0)" | head -n 1 | sed -n 's/^ *\(.*\):.*$/\1/p'`
convert Arkey.jpg \( -clone 0 -fill white -colorize 100 \) mask.png -compose over -composite result.png

隔离黑线并将其放大

convert Arkey.jpg -threshold 50% -type bilevel \
-define connected-components:mean-color=true \
-define connected-components:keep=$id \
-connected-components 4 \
-alpha extract \
-morphology dilate octagon:2 \
mask.png

使用遮罩控制图像中的线条填充白色:

id=`convert Arkey.jpg -threshold 50% -type bilevel \
-define connected-components:verbose=true \
-define connected-components:mean-color=true \
-connected-components 4 null: |\
grep "gray(0)" | head -n 1 | sed -n 's/^ *\(.*\):.*$/\1/p'`
convert Arkey.jpg \( -clone 0 -fill white -colorize 100 \) mask.png -compose over -composite result.png


有关其工作原理的详细信息,请参见-处的连接组件。

我想您可以使用Hough变换找到线条,然后在黑色背景上以白色绘制线条,并使用亮显模式合成到原始线条上。回答得好。在找到线条后,您可能会寻找修补以填充线条,而不仅仅是将线条填充为白色: