OCR,识别和裁剪矩形

Posted

技术标签:

【中文标题】OCR,识别和裁剪矩形【英文标题】:OCR, identify and crop rect shape 【发布时间】:2020-10-24 16:37:34 【问题描述】:

应用 cv 变形转换后,我得到了以下二进制图像:

如您所见,中间有一个大矩形,右边有第二个更紧的矩形。我想知道哪种方法可能是识别和裁剪右侧矩形的好方法,以实现类似的效果:

谢谢

【问题讨论】:

【参考方案1】:

经过一些搜索,我最终找到了一个可能的解决方案。关键问题是执行正确的图像预处理以获得实线(与问题中的图像相反:我们需要没有间隙的线条)。

这篇文章挽救了生命:Gap Filling Contours / Lines。 对于我来说,dimKernel=50, thBin=160, thDistTrans=0.07

def preprocessing(imm,dimKernel,thBin,thDistTrans):
  grayImage = cv.cvtColor(imm, cv.COLOR_BGR2GRAY)
  ret,binImage=cv.threshold(grayImage,thBin,255,cv.THRESH_BINARY_INV)

  structVerticale = kernelVerticale(dimKernel,1)
  im1 = cv.morphologyEx(binImage, cv.MORPH_OPEN, structVerticale)
  structOrizzontale = kernelOrizzontale(dimKernel,3)
  im2 = cv.morphologyEx(binImage, cv.MORPH_OPEN, structOrizzontale)

  result = overlaps(im1,im2)  
  out = ndi.distance_transform_edt(np.invert(result))
  out = out < thDistTrans * out.max()
  out = morphology.skeletonize(out)

  out = (out.astype(int)*255).astype("uint8")
  kernel = np.ones((3,3),np.uint8)
  out = cv.dilate(out,kernel)

  return out

然后,我需要使用 cv.findContours 识别正确的矩形;根据经验证据,我了解到我正在寻找的矩形可以使用区域(从原始区域图像的 1/6 到 1/3)来识别。最后,使用 cv.boundingRect 将轮廓近似为矩形,然后裁剪:

contours, hierarchy = cv.findContours(ris,cv.RETR_CCOMP , cv.CHAIN_APPROX_SIMPLE)
hierarchy = hierarchy[0]

aree = []
for i,figura in enumerate(contours):
    area = cv.contourArea(figura)
    aree.append([area,i])
aree.sort(reverse=True)

areaMax = (ris.shape[0]*ris.shape[1])/3
areaMin = (ris.shape[0]*ris.shape[1])/6

i = 0
while i<len(aree) and (aree[i][0]<areaMin or aree[i][0]>areaMax):
    i+=1

cnt = contours[aree[i][1]]
x,y,w,h = cv.boundingRect(cnt)

immOrg = immOrg.crop((x, y, x+w, y+h))

我确信这个解决方案远非最佳解决方案,因为我是一名业余程序员,我以前从未使用过 cv,但我希望可以帮助某人

【讨论】:

以上是关于OCR,识别和裁剪矩形的主要内容,如果未能解决你的问题,请参考以下文章

iOS Document Scanner: 矩形边缘识别(边缘检测 ) CIDetectorTypeRectangle

实战基于OpenCV的水表字符识别(OCR)

Atitit图像处理的用途

财务报表OCR自动识别方案,发票识别,票据OCR识别,OCR发票识别

TH-OCR识别算法-电子护照识别,护照识别,证件识别

OCR场景文本识别:文字检测+文字识别