使用python从验证码图像中删除行

使用python从验证码图像中删除行,python,numpy,opencv,image-processing,Python,Numpy,Opencv,Image Processing,我有验证码图像作为附加在这个问题 我正在尝试提取图像中的文本。我下面的代码能够使除文本和行以外的所有区域都变成白色 import cv2 from PIL import Image import numpy as np image1 = Image.open("E:\\python\\downloaded\\captcha.png").convert('L') image2 = Image.open("E:\\python\\downloaded\\captcha.png").convert

我有验证码图像作为附加在这个问题

我正在尝试提取图像中的文本。我下面的代码能够使除文本和行以外的所有区域都变成白色

import cv2
from PIL import Image
import numpy as np

image1 = Image.open("E:\\python\\downloaded\\captcha.png").convert('L')
image2 = Image.open("E:\\python\\downloaded\\captcha.png").convert('L')
pix = image1.load()
for column in range(0, image1.height):
        for row in range(0, image1.width):
            if pix[row, column] >= 90:
                pix[row, column] = 255
cv2.imshow("1", np.array(image2))
cv2.imshow("2", np.array(image1))
cv2.waitKey(0)
但我正试图删除与文本交叉的那条线,但它似乎不起作用。我尝试了下面的代码部分,这是在StackOverflow的其他问题上发布的。但它不起作用

def消除零点(自、向量):
如果v!=0,则返回枚举(向量)中(dex,v)的[(dex,v)]
def获取线路位置(自身、img):
sumx=img.和(轴=0)
列出不带零的零=自消零(sumx)
min1,min2=heapq.nsmalest(2,不带零的列表,key=itemgetter(1))
如果val==min1[1]或val==min2[1],则枚举(sumx)中[dex,val]的l=[dex]
mindex=[l[0],l[len(l)-1]]
cols=img[:,mindex[:]]
col1=cols[:,0]
col2=cols[:,1]
没有0的col1\u=自消零(col1)
没有0的col2\u=自消零(col2)
线条长度=len(没有0的col1)
dex1=col1_无_0[四舍五入(len(col1_无_0)/2)][0]
dex2=col2_无_0[四舍五入(len(col2_无_0)/2)][0]
p1=[dex1,mindex[0]]
p2=[dex2,mindex[1]]
返回p1,p2,行长度
def拆卸管路(自身、p1、p2、LL、img):
m=(p2[0]-p1[0])/(p2[1]-p1[1]),如果p2[1]=p1[1]其他np.inf
w、 h=len(img),len(img[0])
x=列表(范围(h))
y=列表(映射(λz:int(np.圆形(p1[0]+m*(z-p1[1])),x))
img\u已删除\u行=列表(img)
对于范围内的指数(h):
i、 j=y[dex],x[dex]
i=int(i)
j=int(j)
rlist=[]

当i>=0、i=0和i时,您可以使用CV2函数,如阈值、放大、按位和按位,而不是从验证码中删除不需要的行

import numpy as np
import cv2

img = cv2.imread('captcha.jpg',0)

horizontal_inv = cv2.bitwise_not(img)
masked_img = cv2.bitwise_and(img, img, mask=horizontal_inv)
masked_img_inv = cv2.bitwise_not(masked_img)

kernel = np.ones((5,5),np.uint8)
dilation = cv2.dilate(masked_img_inv,kernel,iterations = 3)

ret,thresh2 = cv2.threshold(dilation,254,255,cv2.THRESH_BINARY_INV) 
thresh2=cv2.bitwise_not(thresh2)

cv2.waitKey(0)
cv2.destroyAllWindows()

我的方法基于这样一个事实,即线条比字符细。在本例中,我使用模糊、阈值和形态学来去除字符之间的线条。结果是:

导入cv2
将numpy作为np导入
image=cv2.imread('captcha.png')
图像=cv2。模糊(图像,(3,3))
ret,image=cv2.threshold(image,90255,cv2.THRESH_二进制);
图像=cv2.扩张(图像,np.一((3,1),np.单位8))
图像=cv2.腐蚀(图像,np.ones((2,2),np.uint8))
cv2.imshow(“1”,np.数组(图像))
cv2.等待键(0)

谢谢。这在某种程度上是可行的。但是我们仍然有一些噪音,因为tesseract无法正确确定文本的线条。我们有没有更好的方法来改进这一点?为了进一步处理,您可以执行轮廓区域过滤+纵横比过滤。使用
cv2.findContours()
查找轮廓,并使用最小阈值面积和纵横比条件删除任何噪声轮廓
import numpy as np
import cv2

img = cv2.imread('captcha.jpg',0)

horizontal_inv = cv2.bitwise_not(img)
masked_img = cv2.bitwise_and(img, img, mask=horizontal_inv)
masked_img_inv = cv2.bitwise_not(masked_img)

kernel = np.ones((5,5),np.uint8)
dilation = cv2.dilate(masked_img_inv,kernel,iterations = 3)

ret,thresh2 = cv2.threshold(dilation,254,255,cv2.THRESH_BINARY_INV) 
thresh2=cv2.bitwise_not(thresh2)

cv2.waitKey(0)
cv2.destroyAllWindows()