OpenCV python(二)图像预处理:改变图像大小 && 提取感兴趣区域

一、改变图像大小

1、获取图像宽、高、通道数

具体方法如下所示:

print(img.shape[0])  # 图片高height
print(img.shape[1])  # 图片宽width
print(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)  # 等待时间

效果如下所示:
在这里插入图片描述
通过以上操作,可增加深度学习数据集的数据量,且在训练时进行图像裁剪(通常为随机裁剪),可防止训练出现过拟合

本人是一名学生,目前正在学习中,本篇文章也算是我的学习笔记,如有错误的话还请指正。

猜你喜欢

转载自blog.csdn.net/xztli/article/details/126149578