OpenCV 4基础篇| OpenCV图像的裁切
创始人
2025-01-10 08:03:43
0

目录

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

1. Numpy切片

语法结构:

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 代码示例

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() 

1

2. cv2.selectROI()

2.1 语法结构

cv2.selectROI(windowName, img, showCrosshair=None, fromCenter=None):#可以通过鼠标选择感兴趣的矩形区域(ROI) 
  • windowName:选择的区域被显示在的窗口的名字
  • img:要在什么图片上选择ROI
  • showCrosshair:是否在矩形框里画十字线.
  • fromCenter:是否是从矩形框的中心开始画

2.2 注意事项

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

2.3 代码示例

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() 

1

3. Pillow.crop

3.1 语法结构

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 代码示例

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() 

11

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

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)) 

1

5. 总结

  • Numpy切片和Pillow.crop()都是非交互式的裁剪方法,适用于在代码中直接指定裁剪区域。
  • cv2.selectROI()是一个交互式的裁剪方法,允许用户通过图形界面选择ROI。

相关内容

热门资讯

一秒了解新全游房卡领取码/新猴... 一秒了解新全游房卡领取码/新猴王大厅房卡在哪里购买!游戏中心打开微信,添加客服【113857776】...
全攻略普及,微信链接金花房卡怎... 大圣大厅是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:44346008许多玩家在游戏中会购买房卡来...
ia攻略/如何购买金花房卡雷霆... 微信游戏中心:雷霆大厅房卡在哪里买打开微信,添加客服微信【88355042】,进入游戏中心或相关小程...
推荐一款!金花房卡怎么购买雷霆... 雷霆大厅是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:【3329006910】或QQ:332900...
终于发现!微信牛牛房卡如何购买... 微信游戏中心:牛牛房卡,添加微信【71319951】,进入游戏中心或相关小程序,搜索“微信牛牛房卡”...
秒懂百科新西楚房卡多少米/天蝎... 第二也可以在游戏内商城:在游戏界面中找到 “微信金花,斗牛链接房卡”“商城”选项,选择房卡的购买选项...
正版授权!金花房卡专卖店宝马系... 今 日消息,宝马系列/随意玩房卡添加微信33549083 苹果今日发布了 iOS 16.1 正式版更...
玩家推荐,购买斗牛房卡联系方式... 斗牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:15984933许多玩家在游戏中会购买房卡来享受...
IA解析/牛牛房卡官网天蝎大厅... 天蝎大厅房卡更多详情添加微:33549083、 2、在商城页面中选择房卡选项。 3、根...
终于发现!炸金花从哪里买房卡,... 微信游戏中心:炸金花房卡,添加微信【56001354】,进入游戏中心或相关小程序,搜索“微信炸金花房...
一秒了解新云游房卡到哪里买/天... 一秒了解新云游房卡到哪里买/天蝎大厅房卡客服!微信房卡充值 添加房卡批售商:微【113857776】...
正版授权!游戏推荐牛牛房卡出售... 玄灵大厅是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:【3329006910】或QQ:332900...
玩家必备攻略,微信斗牛房卡怎么... 微信斗牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:160470940许多玩家在游戏中会购买房卡...
终于发现!微信牛牛房卡购买联系... 微信游戏中心:牛牛房卡,添加微信【66336574】,进入游戏中心或相关小程序,搜索“微信牛牛房卡”...
玩家须知新荣耀房卡怎么弄/新猴... 玩家须知新荣耀房卡怎么弄/新猴王大厅房卡在哪里购买! 微信牛牛房卡客服微信号微信游戏中心打开微信,添...
科技实测!牛牛房卡哪里有卖的新... 今 日消息,新神兽/青龙大厅房卡添加微信33549083 苹果今日发布了 iOS 16.1 正式版更...
推荐一款!金花微信链接市场价格... 推荐一款!金花微信链接市场价格表战皇大厅/微信链接房卡价格一览表战皇大厅是一款非常受欢迎的游戏,咨询...
居家必备,牛牛链接房卡那里有卡... 卡贝大厅是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:15984933许多玩家在游戏中会购买房卡来...
实测分享美人房卡怎么得/王者大... 第二也可以在游戏内商城:在游戏界面中找到 “微信金花,斗牛链接房卡”“商城”选项,选择房卡的购买选项...
终于发现!微信里面炸金花链接房... 微信游戏中心:炸金花房卡,添加微信【71319951】,进入游戏中心或相关小程序,搜索“微信炸金花房...