当前位置: 代码网 > it编程>软件设计>交互 > OpenCV 4基础篇| OpenCV图像的裁切

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

2024年08月02日 交互 我要评论
Numpy切片和都是非交互式的裁剪方法,适用于在代码中直接指定裁剪区域。是一个交互式的裁剪方法,允许用户通过图形界面选择ROI。

1. numpy切片

语法结构:

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

1.1 注意事项

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 注意事项

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 注意事项

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

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com