我有一个样本图像,如下所示:
可能有一条或多条水平线分隔文字部分。我希望得到4块文本,看起来像:
水平线可能接近文字,外部矩形并不总是在那里。
我尝试了以下内容 - 门槛 - Erode&膨胀 - FindContours
由于水平线靠近文字,因此没有干净的方法可以侵蚀和扩张以获得线条上方和下方的文字。有时它会起作用,有时它不会取决于文本行的紧密程度。
我读到使用直方图可以识别水平线,并且始终识别文本块。有关如何做到这一点的任何指示?
答案 0 :(得分:1)
检测hougLines - >黑掉线 - > Dialate。
import cv2
import numpy as np;
im = cv2.imread("im.png")
im_gray=cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(im_gray,127,255,cv2.THRESH_BINARY_INV)
edges = cv2.Canny(im_gray,50,150,apertureSize = 3)
minLineLength = 100
maxLineGap = 100
lines = cv2.HoughLinesP(edges,1,np.pi/180,100,minLineLength,maxLineGap)
for line in lines:
for x1,y1,x2,y2 in line:
cv2.line(thresh,(x1,y1),(x2,y2),(0),5)
kernel = np.ones((3,3),np.uint8)
thresh = cv2.dilate(thresh,kernel,iterations = 10)
_,contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
minArea=5000 #nothing
for cnt in contours:
area=cv2.contourArea(cnt)
if(area>minArea):
rect = cv2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
box = np.int0(box)
cv2.drawContours(im,[box],0,(0,0,255),2)
cv2.imshow("thresh", im)
cv2.imwrite('so_result.jpg',im)
cv2.waitKey(0)