目录
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()
2. cv2.selectroi()
2.1 语法结构
cv2.selectroi(windowname, img, showcrosshair=none, fromcenter=none):#可以通过鼠标选择感兴趣的矩形区域(roi)
windowname
:选择的区域被显示在的窗口的名字img
:要在什么图片上选择roishowcrosshair
:是否在矩形框里画十字线.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()
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()
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))
5. 总结
numpy
切片和pillow.crop()
都是非交互式的裁剪方法,适用于在代码中直接指定裁剪区域。cv2.selectroi()
是一个交互式的裁剪方法,允许用户通过图形界面选择roi。
发表评论