如何使用openCV-python在白色背景上识别多张照片?
How to recognize multiple photos on a white background using openCV-python?
基本上,我用我们的打印机扫描了很多旧照片。大约四张照片适合扫描的每一页(围绕页面的四个角),白色 space 并不总是完全白色。我想使用 openCV 自动将它们裁剪成单独的照片。需要解决此问题的方法的建议,谢谢!
想过检测页面上四个矩形的形状来获取坐标还是用opencv grabCut...不知道
我试过使用 PIL,但无法正确裁剪照片,因为有些照片也有与背景相同的颜色,这会导致裁剪过早结束。
这是它的粗略草图
(除非他们是人物的真实照片)
这是一种基于照片不会相互交叉的假设的方法
- 转换为灰度和高斯模糊
- 阈值图像
- 查找轮廓并获取边界框轮廓
- 提取投资回报率
阈值图像
接下来我们使用 cv2.findContours()
获取轮廓并使用 cv2.boundingRect()
获取边界框。然后我们可以使用
提取 ROI
x,y,w,h = cv2.boundingRect(c)
ROI = original[y:y+h, x:x+w]
这是结果
照片 #1
照片#2
照片 #3
照片 #4
import cv2
image = cv2.imread('1.png')
original = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (3, 3), 0)
thresh = cv2.threshold(blurred, 230,255,cv2.THRESH_BINARY_INV)[1]
# Find contours
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
# Iterate thorugh contours and filter for ROI
image_number = 0
for c in cnts:
x,y,w,h = cv2.boundingRect(c)
cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 2)
ROI = original[y:y+h, x:x+w]
cv2.imwrite("ROI_{}.png".format(image_number), ROI)
image_number += 1
cv2.imshow('thresh', thresh)
cv2.imshow('image', image)
cv2.waitKey(0)
基本上,我用我们的打印机扫描了很多旧照片。大约四张照片适合扫描的每一页(围绕页面的四个角),白色 space 并不总是完全白色。我想使用 openCV 自动将它们裁剪成单独的照片。需要解决此问题的方法的建议,谢谢!
想过检测页面上四个矩形的形状来获取坐标还是用opencv grabCut...不知道
我试过使用 PIL,但无法正确裁剪照片,因为有些照片也有与背景相同的颜色,这会导致裁剪过早结束。
这是它的粗略草图
这是一种基于照片不会相互交叉的假设的方法
- 转换为灰度和高斯模糊
- 阈值图像
- 查找轮廓并获取边界框轮廓
- 提取投资回报率
阈值图像
接下来我们使用 cv2.findContours()
获取轮廓并使用 cv2.boundingRect()
获取边界框。然后我们可以使用
x,y,w,h = cv2.boundingRect(c)
ROI = original[y:y+h, x:x+w]
这是结果
照片 #1
照片#2
照片 #3
照片 #4
import cv2
image = cv2.imread('1.png')
original = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (3, 3), 0)
thresh = cv2.threshold(blurred, 230,255,cv2.THRESH_BINARY_INV)[1]
# Find contours
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
# Iterate thorugh contours and filter for ROI
image_number = 0
for c in cnts:
x,y,w,h = cv2.boundingRect(c)
cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 2)
ROI = original[y:y+h, x:x+w]
cv2.imwrite("ROI_{}.png".format(image_number), ROI)
image_number += 1
cv2.imshow('thresh', thresh)
cv2.imshow('image', image)
cv2.waitKey(0)