我有以下图像,它是扫描的打印纸,带有4张图像。我在同一张纸上打印了4张图像以节省打印资源:
但是,现在我需要逐个图像提取图像,并为每个图像创建一个单独的图像文件。使用Python,Matlab或任何其他编程语言有没有简便的方法?
最佳答案
这是在Python / OpenCV中执行此操作的一种方法。但是,这要求图片侧面的颜色必须与背景颜色充分不同。如果是这样,则可以对图像进行阈值处理,然后获取轮廓并使用其边界框裁剪出每个图像。
输入:
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()
形态清洗后的阈值图像:
裁剪的图片:
关于python - 从白色背景中提取前景图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62720286/