如何找到缺失部分的图像轮廓?

How to find contour of an image with missing part?

杂货账单:

由于图像的某些顶部和底部缺少最大的轮廓,即无法裁剪主帐单。该代码在完整的票据图像的情况下运行良好,但无法处理缺失的顶点图像。

代码:

imgContours = img.copy() # COPY ORIGNAL IMAGE
imgBigContour = img.copy() # COPY ORIGNAL IMAGE
_, contours,_ = cv2.findContours(imgThreshold, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # FIND ALL CONTOURS
cv2.drawContours(imgContours, contours, -1, (0, 255, 0), 10) # DRAW ALL DETECTED CONTOURS

# FIND THE BIGGEST COUNTOUR
biggest, maxArea = utlis.biggestContour(contours) # FIND THE BIGGEST CONTOUR
if biggest.size != 0:
    biggest=utlis.reorder(biggest)
    cv2.drawContours(imgBigContour, biggest, -1, (0, 255, 0), 20) # DRAW THE BIGGEST CONTOUR
    imgBigContour = utlis.drawRectangle(imgBigContour,biggest,2)
    pts1 = np.float32(biggest) # PREPARE POINTS FOR WARP
    pts2 = np.float32([[0, 0],[widthImg, 0], [0, heightImg],[widthImg, heightImg]]) # PREPARE POINTS FOR WARP
    matrix = cv2.getPerspectiveTransform(pts1, pts2)
    imgWarpColored = cv2.warpPerspective(img, matrix, (widthImg, heightImg))

正如评论中的一位人士所建议的那样,即使用 cv2.copyMakeBorder() 它有效。因此,关于上述参考代码的正确语法是:

img = cv2.copyMakeBorder(img, 10, 10, 10, 10, cv2.BORDER_CONSTANT)

实际上它所做的是在每边添加一个 10 像素的黑色边框。此外,当我们使用 cv2.findContour() 时,它实际上检测到之前没有计算的最大的(包括之前的小的)。