优化 OpenCV 掩码边缘

我正在扫描旧照片,我想自动化从扫描仪的(嘈杂的)纯白色背景中提取照片的过程,以便我有一张透明的照片。程序的这一部分现在可以工作了,但我还有一个小问题。


现在可以准确地检测(和提取)照片,但它会在整个照片周围的背景中留下小而清晰的黑色边框。我试图对透明蒙版应用高斯模糊,但这不会使黑色平滑(并且它使照片的边框看起来“模糊”)。


这是我必须提取照片并生成透明蒙版的代码:


# Load the scan, and convert it to RGBA.

original = cv2.imread('input.jpg')

original = cv2.cvtColor(original, cv2.COLOR_BGR2BGRA)


# Make the scan grayscale, and apply a blur.

image = cv2.cvtColor(original, cv2.COLOR_BGR2GRAY)

image = cv2.GaussianBlur(image, (25, 25), 0)


# Binarize the scan.

retval, threshold = cv2.threshold(image, 50, 255, cv2.THRESH_BINARY)


# Find the contour of the object.

contours, hierarchy = cv2.findContours(threshold, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)


largestContourArea = -1

largestContour = -1


for contour in contours:

    area = cv2.contourArea(contour)


    if area > largestContourArea:

        largestContourArea = area

        largestContour = contour


# Generate the transparency mask.

mask = numpy.zeros(original.shape, numpy.uint8)


cv2.drawContours(mask, [ largestContour ], -1, (255, 255, 255, 255), -1)


# Apply the transparency mask.

original = cv2.multiply(mask.astype(float) / 255.0, original.astype(float))


cv2.imwrite('output.png', original)

我有一个样本扫描和使用样本扫描的上述代码的结果。如您所见,照片周围有一个轻微的黑色边框,我想将其删除。


FFIVE
浏览 192回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python