OpenCV 4基础篇| OpenCV图像的裁切

目录

  • [1. Numpy切片](#1. Numpy切片)
    • [1.1 注意事项](#1.1 注意事项)
    • [1.2 代码示例](#1.2 代码示例)
  • [2. cv2.selectROI()](#2. cv2.selectROI())
    • [2.1 语法结构](#2.1 语法结构)
    • [2.2 注意事项](#2.2 注意事项)
    • [2.3 代码示例](#2.3 代码示例)
  • [3. Pillow.crop](#3. Pillow.crop)
    • [3.1 语法结构](#3.1 语法结构)
    • [3.2 注意事项](#3.2 注意事项)
    • [3.3 代码示例](#3.3 代码示例)
  • [4. 扩展示例:单张大图裁切成多张小图](#4. 扩展示例:单张大图裁切成多张小图)
  • [5. 总结](#5. 总结)

1. Numpy切片

语法结构:

csharp 复制代码
retval = img[y:y+h, x:x+w] #对图像 img 裁剪并返回指定的矩阵区域图像。
  • img:图像数据,nparray 多维数组
  • x, y:整数,像素值,裁剪矩形区域左上角的坐标值
  • w, h:整数,像素值,裁剪矩形区域的宽度、高度
  • retval:裁剪后获得的 OpenCV 图像,nparray 多维数组

1.1 注意事项

  • Numpy 多维数组的切片是原始数组的浅拷贝,切片修改后原始数组也会改变。推荐采用 .copy() 进行深拷贝,得到原始图像的副本。
  • Numpy 数组切片,当上界或下界为数组边界时可以省略,如:img[y:, :x] 表示高度方向从 y 至图像底部(像素ymax),宽度方向从图像左侧(像素 0)至 x。

1.2 代码示例

csharp 复制代码
import cv2

imgFile = "./img/lena.jpg"
img1 = cv2.imread(imgFile, flags=1)  # flags=1 读取彩色图像(BGR)
xmin, ymin, w, h = 200, 200, 200, 200  # 矩形裁剪区域 (ymin:ymin+h, xmin:xmin+w) 的位置参数
imgCrop = img1[ymin:ymin + h, xmin:xmin + w].copy()  # 切片获得裁剪后保留的图像区域
cv2.imshow("CropDemo", imgCrop)  # 在窗口显示 彩色随机图像
cv2.waitKey(0)
cv2.destroyAllWindows()

2. cv2.selectROI()

2.1 语法结构

csharp![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/73651873cd4c48c1b36a49b34b389890.png#pic_center) 复制代码
cv2.selectROI(windowName, img, showCrosshair=None, fromCenter=None):#可以通过鼠标选择感兴趣的矩形区域(ROI)
  • windowName:选择的区域被显示在的窗口的名字
  • img:要在什么图片上选择ROI
  • showCrosshair:是否在矩形框里画十字线.
  • fromCenter:是否是从矩形框的中心开始画

2.2 注意事项

  • 由于 cv2.selectROI 是一个交互式的函数,它可能不适合用于自动化脚本或没有图形用户界面的环境。在这种情况下,你可能需要寻找其他方法来选择图像中的 ROI,例如使用固定坐标、图像分割算法等。

2.3 代码示例

csharp 复制代码
import cv2

imgFile = "img/lena.jpg"  
img1 = cv2.imread(imgFile, flags=1)  # flags=1 读取彩色图像(BGR)
roi = cv2.selectROI(img1, showCrosshair=True, fromCenter=False)
xmin, ymin, w, h = roi  # 矩形裁剪区域 (ymin:ymin+h, xmin:xmin+w) 的位置参数
imgROI = img1[ymin:ymin + h, xmin:xmin + w].copy()  # 切片获得裁剪后保留的图像区域
cv2.imshow("RIODemo", imgROI)
cv2.waitKey(0)
cv2.destroyAllWindows()

3. Pillow.crop

3.1 语法结构

csharp![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/73651873cd4c48c1b36a49b34b389890.png#pic_center) 复制代码
retval = Image.crop(left, up, right, lower) 
  • left: 整数,表示裁剪区域左上角的 x 坐标。
  • up:整数,表示裁剪区域左上角的 y 坐标。
  • right:整数,表示裁剪区域右下角的 x 坐标。这个值通常大于 left。
  • below:整数,表示裁剪区域右下角的 y 坐标。这个值通常大于 upper。
  • retval:一个新的 Image 对象,原始图像中被裁剪出来的矩形区域

3.2 注意事项

  • crop()函数接受一个包含四个数字的元组参数,表示裁剪区域的左上角和右下角的坐标。这个元组的格式是(left, upper, right, lower),其中left和upper是裁剪区域的左上角坐标,right和lower是右下角坐标。坐标的原点(0,0)通常在图像的左上角。
  • Pillow库使用坐标系的原点在左上角,x轴向右增加,y轴向下增加。这与一些其他图像处理库(如OpenCV)的坐标系原点在左下角的约定不同,需要注意坐标的顺序和方向。
  • 裁剪区域的坐标必须在图像的边界内。如果裁剪区域的坐标超出了图像的边界,将会引发一个ValueError异常。因此,在调用crop()函数之前,最好先检查裁剪区域的坐标是否有效。
  • crop()函数不会修改原始图像,而是返回一个新的裁剪后的图像对象。原始图像保持不变,如果需要保存裁剪后的图像,需要将其保存到文件或进行其他操作。

3.3 代码示例

csharp 复制代码
from PIL import Image
import matplotlib.pyplot as plt

imgFile = "./img/lena.jpg"
img = Image.open(imgFile)  # W*H
plt.rcParams['font.sans-serif'] = ['FangSong']  # 支持中文标签
plt.subplot(221), plt.title("原图"), plt.axis('off')
plt.imshow(img)  
img_c = img.crop([img.size[0] / 4, img.size[1] / 4, img.size[0] * 3 / 4, img.size[1] * 3 / 4])
plt.rcParams['font.sans-serif'] = ['FangSong']  # 支持中文标签
plt.subplot(222), plt.title("裁切之后"), plt.axis('off')
plt.imshow(img_c)  
plt.show()

4. 扩展示例:单张大图裁切成多张小图

csharp 复制代码
from PIL import Image

imgFile = "./img/lena.jpg"
img = Image.open(imgFile)
size = img.size
print(size)
# 准备将图片切割成9张小图片
weight = int(size[0] // 3)
height = int(size[1] // 3)
# 切割后的小图的宽度和高度
print(weight, height)
for j in range(3):
    for i in range(3):
        box = (weight * i, height * j, weight * (i + 1), height * (j + 1))
        region = img.crop(box)
        region.save('{}{}.png'.format(j, i))

5. 总结

  • Numpy切片和Pillow.crop()都是非交互式的裁剪方法,适用于在代码中直接指定裁剪区域。
  • cv2.selectROI()是一个交互式的裁剪方法,允许用户通过图形界面选择ROI。
相关推荐
昊叔6 小时前
AI 时代,计算思维更值钱
人工智能·语言模型·agi·vibe coding·氛围编程
老陈趣谈科技6 小时前
范式革命与全球协同:AI 医院建设的里程碑 ——《国际 AI 医院智联体共识》深度评测
人工智能·健康医疗
always_TT6 小时前
从Python_Java转学C语言需要注意什么?
java·c语言·python
2301_793804696 小时前
定时任务专家:Python Schedule库使用指南
jvm·数据库·python
绿算技术6 小时前
宝辰股份董事长莅临绿算技术调研交流
人工智能·科技·算法
imbackneverdie6 小时前
6个常用国自然课题项目查询网站,码住以备不时之需
论文阅读·人工智能·aigc·科研·国自然·ai工具·国家自然科学基金
人工智能培训7 小时前
具身智能系统集成与计算效率优化路径探析
人工智能·深度学习·神经网络·机器学习·大模型
金融RPA机器人丨实在智能7 小时前
ARC-AGI-3模型大血洗后的冷思考:企业如何利用“实在Agent”跨越AGI落地鸿沟?
人工智能·ai·agi
天上路人7 小时前
A-59F 多功能语音处理模组在本地会议系统扩音啸叫处理中的技术应用与性能分析
人工智能·神经网络·算法·硬件架构·音视频·语音识别·实时音视频
穿越世纪的风尘7 小时前
【问题解决】No module named ‘_sqlite3‘
python·centos