Python 从图像中删除角色之间的小垂直线

Python 从图像中删除角色之间的小垂直线,python,opencv,image-processing,computer-vision,Python,Opencv,Image Processing,Computer Vision,我想删除所有水平线和垂直线。我可以删除水平线,但在删除小垂直线的同时,原始文本也受到影响。这是我正在使用的代码: image = cv2.imread('opt/doc/uploads/img1.png') result = image.copy() blur = image.copy() gray = cv2.cvtColor(blur,cv2.COLOR_BGR2GRAY) thresh = cv2.threshold(gray, 0,255, cv2.THRESH_BINARY_INV |

我想删除所有水平线和垂直线。我可以删除水平线,但在删除小垂直线的同时,原始文本也受到影响。这是我正在使用的代码:

image = cv2.imread('opt/doc/uploads/img1.png')
result = image.copy()
blur = image.copy()
gray = cv2.cvtColor(blur,cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0,255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]

rows,cols = thresh.shape
horizontalsize = int(cols // 30)
verticalsize = int(rows // 30)

# Remove horizontal lines
horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (horizontalsize,1))
remove_horizontal = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, horizontal_kernel)
cnts = cv2.findContours(remove_horizontal, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    cv2.drawContours(result, [c], -1, (255,255,255), 3)                        


# Remove vertical lines
vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1,20))        
remove_vertical = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, vertical_kernel)
cnts = cv2.findContours(remove_vertical, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    cv2.drawContours(result, [c], -1, (255,255,255),3)

cv2.imwrite('result.png', result)
PFB 2输入图像:

上述两幅图像的PFB输出图像分别为:


另一种方法是使用轮廓区域进行过滤,以“忽略”线条,只提取所需的文本字符,而不是尝试检测水平/垂直线条。一个限制是它不会检测到连接到水平/垂直线的文本

导入cv2
将numpy作为np导入
image=cv2.imread('1.png')
掩码=np.one(image.shape,dtype=np.uint8)*255
灰色=cv2.CVT颜色(图像,cv2.COLOR\u BGR2GRAY)
thresh=cv2.阈值(灰色,0,255,cv2.thresh\u二进制\u INV+cv2.thresh\u OTSU)[1]
cnts=cv2.找到的孔(阈值,cv2.外部,cv2.链近似,简单)
如果len(cnts)==2个其他cnts[1],则cnts=cnts[0]
对于碳纳米管中的碳:
面积=cv2。轮廓面积(c)
如果面积小于1000:
x、 y,w,h=cv2.boundingRect(c)
遮罩[y:y+h,x:x+w]=图像[y:y+h,x:x+w]
cv2.imshow('thresh',thresh)
cv2.imshow(“面具”,面具)
cv2.waitKey()

可能重复Hi Sachin我在删除小垂直线时遇到问题。每当我试图删除小垂直线时,原始文本也会受到影响,删除水平线时没有问题。Hi@Nathance如果有水平线,您的解决方案工作正常,但在某些情况下,我会有只包含垂直线而不包含水平线的图像。那我怎么才能去掉那些垂直线。你可以创建一个特殊的垂直内核来移除线条,另一个过滤器是使用轮廓区域进行过滤我已经尝试使用垂直内核来移除垂直线条,但在这种方法中,它也会篡改角色(它也会移除角色的垂直线条),比如D、F、H、I、M等有垂直线条的角色(上面的PFA图像)。如果我对垂直线使用轮廓区域过滤器,那么它也会删除轮廓区域小于垂直线或与垂直线相同的字符。尝试使用形态学操作,例如
cv2.MORPH\u CLOSE
来填充断开的字符
import cv2
import numpy as np

image = cv2.imread('1.png')
mask = np.ones(image.shape, dtype=np.uint8) * 255
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    area = cv2.contourArea(c)
    if area < 1000:
        x,y,w,h = cv2.boundingRect(c)
        mask[y:y+h, x:x+w] = image[y:y+h, x:x+w]

cv2.imshow('thresh', thresh)
cv2.imshow('mask', mask)
cv2.waitKey()