OpenCV自动裁剪图片

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
大数据开发治理平台 DataWorks,不限时长
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: OpenCV自动裁剪图片

背景

最近在做图片相关的项目,需要裁剪图片中的空白区域,由于需求的精度要求不是很高;经过评估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()
目录
相关文章
|
1月前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——1.13图片冷白皮(美白)处理
OpenCV这么简单为啥不学——1.13图片冷白皮(美白)处理
42 0
|
1月前
|
存储 编解码 监控
OpenCV这么简单为啥不学——2.1、imwrite逐帧保存图片
OpenCV这么简单为啥不学——2.1、imwrite逐帧保存图片
59 0
|
1月前
|
人工智能 Linux API
OpenCV这么简单为啥不学——1.1、图像处理(灰度图、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化)
OpenCV这么简单为啥不学——1.1、图像处理(灰度图、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化)
60 0
|
7天前
|
算法 计算机视觉
【Qt&OpenCV QGraphicsView显示OpenCV读入的图片】
【Qt&OpenCV QGraphicsView显示OpenCV读入的图片】
13 0
|
1月前
|
计算机视觉 Python 索引
【Python Opencv】图片与视频的操作
【Python Opencv】图片与视频的操作
118 0
【Python Opencv】图片与视频的操作
|
1月前
|
前端开发 API 计算机视觉
opencv绘制基本图形,在图片上添加文字
opencv绘制基本图形,在图片上添加文字
|
1月前
|
机器学习/深度学习 算法 自动驾驶
opencv python 图片叠加
【4月更文挑战第17天】
|
1月前
|
计算机视觉
opencv图片缩放与镜像
opencv图片缩放与镜像
21 0
|
1月前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——1.10、addWeighted设置图片透明度
OpenCV这么简单为啥不学——1.10、addWeighted设置图片透明度
38 0
|
1月前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——1.2、图片截取(数组截取)
OpenCV这么简单为啥不学——1.2、图片截取(数组截取)
26 0