栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

OpenCV python(二)图像预处理:改变图像大小 && 提取感兴趣区域
  • 一、改变图像大小
    • 1、获取图像宽、高、通道数
    • 2、resize函数
    • 3、案例
  • 二、ROI感兴趣区域
    • 1、感兴趣区域的定义
    • 2、opencv-python中的ROI提取
    • 3、案例
  • 三、结合应用:深度学习数据增强方法之一

一、改变图像大小 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)  # 等待时间

效果如下所示:

通过以上操作,可增加深度学习数据集的数据量,且在训练时进行图像裁剪(通常为随机裁剪),可防止训练出现过拟合。

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1033118.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号