mad*_*mad 0 python matlab opencv image-processing computer-vision
我有以下图像,这是一张带有 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()
Run Code Online (Sandbox Code Playgroud)
裁剪图像: