OpenCV python(二)图像预处理:改变图像大小 && 提取感兴趣区域
一、改变图像大小1、获取图像宽、高、通道数2、resize函数3、案例二、ROI感兴趣区域1、感兴趣区域的定义2、opencv-python中的ROI提取3、案例三、结合应用:深度学习数据增强方法之一一、改变图像大小
1、获取图像宽、高、通道数
具体方法如下所示:
print(img.shape[0]) # 图片高heightprint(img.shape[1]) # 图片宽widthprint(img.shape[2]) # 图片通道数
2、resize函数
opencv-python提供了resize函数用于改变整体的图像大小,函数如下所示。
cv2.resize(图像 ,(w, h), fx=倍数, fy=倍数)#改变图像shape
其中(w,h)可直接更改图像大小,w指图像的宽width,h指图像的高height。
fx 和 fy则是通过倍数使图像的宽或高成倍增大或减小。
具体使用方法如下所示:
cv2.resize(img, (w, h))# 指定宽高改变图像大小cv2.resize(img, (0, 0), fx=num1, fy=num2)# 指定倍数改变图像大小# num1、num2为倍数
结合上获取图像的宽高也可通过w、h对图像大小进行倍数的改变,如下所示:
cv2.resize(img, (int(img.shape[1]*num1), int(img.shape[0]*num2)))# 指定宽高改变图像大小# num1、num2为倍数
需要注意的是图像宽高一定为整数,因此要加上int()将值改为整数,保证类型正确,否则将会出现如下错误。
Can't parse 'dsize'. Sequence item with index 0 has a wrong type
3、案例
原图分辨率为712 * 709,改变后一张图像为300 * 300,一张图像的宽高都为原图的1/2。具体程序如下所示:
import cv2 # 导入opencv库if __name__ == '__main__':while True:img = cv2.imread('img/1.jpg', 1) # 获取路径img/0.jpg的图像,图像类型为RGB图像# 此处为改变图像大小img_wh = cv2.resize(img, (300, 300)) # 通过w、h改变图像大小img_fxy = cv2.resize(img, (0, 0), fx=0.5, fy=0.5) # 通过fx、fy改变图像大小cv2.imshow("img", img)# 显示原图cv2.imshow("img_wh", img_wh) # 显示w、h改变后的图cv2.imshow("img_fxy", img_fxy) # 显示fx、fy改变后的图cv2.waitKey(1) # 等待时间
效果如下所示:
二、ROI感兴趣区域
1、感兴趣区域的定义
当我们通过摄像头或者其他方式从复杂的环境中获取到一帧图像时,图像中包含着许多我们不感兴趣的信息,如果我们对整张图像进行处理,往往非常繁琐,如果没有足够的经验则会很容易将代码写死。所以在场景和需求允许的情况下,可以尝试在图像处理前框定感兴趣的区域,这样能够有效降低程序的复杂程度,且能有效减少后续图像处理的时间。同时其也可以应用在图像处理的过程中,应需求而使用。
2、opencv-python中的ROI提取
提取ROI的方法如下所示:
img = cv2.imread()[y1:y2,x1:x2]#ROI区域
左上角坐标为(x1, y1),右下角坐标为(x2, y2)
3、案例
提取ROI前图像大小设定为600 * 600,而后提取感兴趣区域:左上角坐标为(200, 0),右下角坐标为(600, 400),即y轴上由0至400,x轴上由200至600。具体程序如下所示:
import cv2 # 导入opencv库if __name__ == '__main__':while True:img = cv2.imread('img/1.jpg', 1) # 获取路径img/0.jpg的图像,图像类型为RGB图像img = cv2.resize(img, (600, 600)) # 通过w、h改变图像大小img_ROI = img[0:400, 200:600] # 提取感兴趣区域cv2.imshow("img", img) # 显示w、h改变后的图cv2.imshow("ROI", img_ROI) # 显示感兴趣区域cv2.waitKey(1) # 等待时间
效果如下所示:
三、结合应用:深度学习数据增强方法之一
如上述程序所示,以其为基础,通过再次resize即可将图像转换为原图尺寸,具体程序如下所示,这次将图像改变为300 * 300(SSD模型图像输入大小一般为300 * 300):
import cv2 # 导入opencv库if __name__ == '__main__':while True:img = cv2.imread('img/1.jpg', 1) # 获取路径img/0.jpg的图像,图像类型为RGB图像img = cv2.resize(img, (300, 300)) # 通过w、h改变图像大小img_ROI = img[0:200, 100:300] # 提取感兴趣区域img_2 = cv2.resize(img_ROI, (img.shape[1], img.shape[0]))# 改变为原本图像大小cv2.imshow("img", img) # 显示w、h改变后的图cv2.imshow("ROI", img_ROI) # 显示感兴趣区域cv2.imshow("img_2", img_2) # 显示最终图像cv2.waitKey(1) # 等待时间
效果如下所示:
通过以上操作,可增加深度学习数据集的数据量,且在训练时进行图像裁剪(通常为随机裁剪),可防止训练出现过拟合。
本人是一名学生,目前正在学习中,本篇文章也算是我的学习笔记,如有错误的话还请指正。