1 回答
TA贡献1865条经验 获得超7个赞
我正在扫描旧照片,我想自动化从扫描仪的(嘈杂的)纯白色背景中提取照片的过程,以便我有一张透明的照片。程序的这一部分现在可以工作了,但我还有一个小问题。
现在可以准确地检测(和提取)照片,但它会在整个照片周围的背景中留下小而清晰的黑色边框。我试图对透明蒙版应用高斯模糊,但这不会使黑色平滑(并且它使照片的边框看起来“模糊”)。
这是我必须提取照片并生成透明蒙版的代码:
# 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)
我有一个样本扫描和使用样本扫描的上述代码的结果。如您所见,照片周围有一个轻微的黑色边框,我想将其删除。
添加回答
举报