从白色背景中提取前景图像

2024-04-18 22:25:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的图像,这是一张扫描打印纸,有4张图像。为了节省打印资源,我在同一张纸上打印了4幅图像:

Printed images that were scanned later 但是,现在我需要逐个图像提取图像,并为每个图像创建一个单独的图像文件。有没有什么简单的方法可以用Python、Matlab或其他编程语言实现这一点


Tags: 方法图像图像文件资源编程语言matlab节省
1条回答
网友
1楼 · 发布于 2024-04-18 22:25:00

在Python/OpenCV中有一种方法可以做到这一点。但它要求图片侧面的颜色与背景颜色有足够的差异。如果是这样,可以对图像设置阈值,然后获取轮廓并使用其边界框裁剪出每个图像

  • 读取输入
  • 基于背景颜色的阈值
  • 反转阈值,使背景为黑色
  • 应用形态学打开和关闭来填充图片区域并去除噪声
  • 获取外部轮廓
  • 对于每个轮廓,获取其边界框,裁剪输入图像并将其保存到磁盘

输入:

enter image description here

import cv2
import numpy as np

# read image
img = cv2.imread('4faces.jpg')

# threshold on background color
lowerBound = (230,230,230)
upperBound = (255,255,255)
thresh = cv2.inRange(img, lowerBound, upperBound)

# invert so background black
thresh = 255 - thresh

# apply morphology to ensure regions are filled and remove extraneous noise
kernel = np.ones((7,7), np.uint8)
thresh = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
kernel = np.ones((11,11), np.uint8)
thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)

# get contours
contours = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if len(contours) == 2 else contours[1]

# get bounding boxes and crop input
i = 1
for cntr in contours:
    # get bounding boxes
    x,y,w,h = cv2.boundingRect(cntr)
    crop = img[y:y+h, x:x+w]
    cv2.imwrite("4faces_crop_{0}.png".format(i), crop)
    i = i + 1


# save threshold
cv2.imwrite("4faces_thresh.png",thresh)

# show thresh and result    
cv2.imshow("thresh", thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()

形态学清理后的阈值图像:

enter image description here

裁剪图像:

enter image description here

enter image description here

enter image description here

enter image description here

相关问题 更多 >