首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OCR,识别和裁剪矩形形状

OCR,识别和裁剪矩形形状
EN

Stack Overflow用户
提问于 2020-10-25 00:37:34
回答 1查看 47关注 0票数 2

在应用了cv变形之后,我最终得到了以下的binay图像:

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

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-28 19:20:31

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

这篇文章是救命稻草:Gap Filling Contours / Lines。对于我的目的,dimKernel=50,thBin=160,thDistTrans=0.07

代码语言:javascript
复制
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识别正确的rect;从经验证据中,我了解到我正在寻找的rect可以使用区域识别(从原始区域图像的1/6到1/3 )。最后,使用cv.boundingRect将轮廓近似为rect,然后进行裁剪:

代码语言:javascript
复制
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,但我希望能帮助到一些人。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64515698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档