OpenCV自动裁剪图片

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
实时计算 Flink 版,5000CU*H 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 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()
目录
相关文章
|
3月前
|
计算机视觉
Opencv学习笔记(十二):图片腐蚀和膨胀操作
这篇文章介绍了图像腐蚀和膨胀的原理、作用以及使用OpenCV实现这些操作的代码示例,并深入解析了开运算和闭运算的概念及其在图像形态学处理中的应用。
230 1
Opencv学习笔记(十二):图片腐蚀和膨胀操作
|
3月前
|
计算机视觉 Python
Opencv学习笔记(二):如何将整个文件下的彩色图片全部转换为灰度图
使用OpenCV库将一个文件夹内的所有彩色图片批量转换为灰度图,并提供了相应的Python代码示例。
48 0
Opencv学习笔记(二):如何将整个文件下的彩色图片全部转换为灰度图
|
3月前
|
计算机视觉 Python
Opencv学习笔记(一):如何将得到的图片保存在指定目录以及如何将文件夹里所有图片以数组形式输出
这篇博客介绍了如何使用OpenCV库在Python中将图片保存到指定目录,以及如何将文件夹中的所有图片读取并以数组形式输出。
278 0
Opencv学习笔记(一):如何将得到的图片保存在指定目录以及如何将文件夹里所有图片以数组形式输出
|
8月前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——1.13图片冷白皮(美白)处理
OpenCV这么简单为啥不学——1.13图片冷白皮(美白)处理
83 0
|
8月前
|
存储 编解码 监控
OpenCV这么简单为啥不学——2.1、imwrite逐帧保存图片
OpenCV这么简单为啥不学——2.1、imwrite逐帧保存图片
162 0
|
8月前
|
人工智能 Linux API
OpenCV这么简单为啥不学——1.1、图像处理(灰度图、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化)
OpenCV这么简单为啥不学——1.1、图像处理(灰度图、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化)
117 0
|
3月前
|
计算机视觉
Opencv错误笔记(一):通过cv2保存图片采用中文命名出现乱码
在使用OpenCV的cv2模块保存带有中文命名的图片时,直接使用cv2.imwrite()会导致乱码问题,可以通过改用cv2.imencode()方法来解决。
216 0
Opencv错误笔记(一):通过cv2保存图片采用中文命名出现乱码
|
5月前
|
计算机视觉 Windows Python
windows下使用python + opencv读取含有中文路径的图片 和 把图片数据保存到含有中文的路径下
在Windows系统中,直接使用`cv2.imread()`和`cv2.imwrite()`处理含中文路径的图像文件时会遇到问题。读取时会返回空数据,保存时则无法正确保存至目标目录。为解决这些问题,可以使用`cv2.imdecode()`结合`np.fromfile()`来读取图像,并使用`cv2.imencode()`结合`tofile()`方法来保存图像至含中文的路径。这种方法有效避免了路径编码问题,确保图像处理流程顺畅进行。
522 1
|
3月前
|
Serverless 计算机视觉
语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆
这篇文章介绍了如何使用OpenCV库通过mask图像绘制分割对象的外接椭圆。首先,需要加载mask图像,然后使用`cv2.findContours()`寻找轮廓,接着用`cv2.fitEllipse()`拟合外接椭圆,最后用`cv2.ellipse()`绘制椭圆。文章提供了详细的代码示例,展示了从读取图像到显示结果的完整过程。
79 0
语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆
|
5月前
|
存储 编解码 API
python多种方法压缩图片,opencv、PIL、tinypng、pngquant压缩图片
python多种方法压缩图片,opencv、PIL、tinypng、pngquant压缩图片
377 1