OpenCV自动裁剪图片
原创大约 1 分钟
背景
最近在做图片相关的项目,需要裁剪图片中的空白区域,由于需求的精度要求不是很高;经过评估OpenCV是个不错的选择
环境以及依赖package
本教程使用最新版本的OpenCV
opencv-python<=4.9.0.80
原则上其他版本也可以。
本教程使用python 3.10.13
作为开发环境 , 原则上适用于python 3.9+
本教程开发环境为windows 10
,原则上其他系统应该也可以
核心代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2024-04-26 15:30
# @Author : Jack
# @File : image_auto_crop.py
"""
image_auto_crop.py
"""
import cv2
def auto_crop(origin_image):
"""
自动裁剪图片
:param origin_image: 原始图片OpenCV格式
:return: 裁剪后的图片OpenCV格式
"""
# 图片灰度化
grey_image = cv2.cvtColor(origin_image, cv2.COLOR_BGR2GRAY)
# 图片二值化
_, binary_image = cv2.threshold(grey_image, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
# 去除图片中的小块
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
binary_image = cv2.morphologyEx(binary_image, cv2.MORPH_OPEN, kernel)
# 查找图片中的最大轮廓
contours, hierarchy = cv2.findContours(binary_image, method=cv2.CHAIN_APPROX_SIMPLE, mode=cv2.RETR_EXTERNAL)
# 获取最大轮廓
if len(contours) == 1:
# 获取最小面积矩形
img_contour = cv2.minAreaRect(contours[0])
elif len(contours) > 1:
# 获取最大面积的区域
max_area = 0
img_contour = None
for i in range(len(contours)):
candidate_contour = cv2.minAreaRect(contours[i])
contour_w, contour_h = candidate_contour[1]
if contour_h * contour_w > max_area:
img_contour = candidate_contour
max_area = contour_h * contour_w
else:
return origin_image
# 获取最小面积矩形
box = cv2.boxPoints(img_contour)
rect_x, rect_y, rect_w, rect_h = cv2.boundingRect(box)
rect_x = rect_x if rect_x > 0 else 0
rect_y = rect_y if rect_y > 0 else 0
return origin_image[rect_y:rect_y + rect_h, rect_x:rect_x + rect_w]
if __name__ == '__main__':
imageMat = cv2.imread('l1.jpg', cv2.IMREAD_COLOR)
crop_image = auto_crop(imageMat)
cv2.imshow('image', crop_image)
cv2.waitKey(0)
cv2.destroyAllWindows()