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

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

谢谢
发布于 2020-10-28 19:20:31
经过一番搜索,我最终找到了一个可能的解决方案。关键问题是执行正确的图像预处理,以实现实线(与问题中的图像相反:我们需要没有间隙的线)。
这篇文章是救命稻草: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识别正确的rect;从经验证据中,我了解到我正在寻找的rect可以使用区域识别(从原始区域图像的1/6到1/3 )。最后,使用cv.boundingRect将轮廓近似为rect,然后进行裁剪:
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,但我希望能帮助到一些人。
https://stackoverflow.com/questions/64515698
复制相似问题