由于深度学习设置的网络结构往往针对固定大小的图像进行训练和测试,因此,图像预处理阶段经常面临的操作也包括图像的缩放或裁剪。对于图像的缩放,OpenCV提供了cv2.resize函数,能够方便地实现缩放功能,使用方法如下:
Img_new=cv2.resize(img,(w, h),interpolation)
上例中,resize函数的第一个参数为原始图像文件,第二个参数为缩放后图像的大小,通过设置宽度w和高度h数值的大小,实现图像放大或缩小。第三个参数为插值选项,常用的插值选项有cv2.INTER_NEAREST、cv2.INTER_LINEAR和cv2.INTER_CUBIC,分别代表最近邻域插值、双线性插值和立方差值等插值算法。
这里简单说明一下图像缩放的原理。图像缩放分为缩小和放大,针对一张图像,缩小是根据需要缩小的目标尺寸按照一定插值算法删除其中某些像素点,所以存在像素信息丢失的现象;而放大则是按照某种插值算法在图像中增加一些像素,使图像变大到目标尺寸,涉及的各种插值算法都是为了寻找最优删除或增加像素点的方法。对于OpenCV,官方推荐缩小使用cv2.INTER_AREA算法,放大使用cv2.INTER_LINEAR算法。由于cv2.INTER_CUBIC实现相对较慢,cv2.resize函数会默认使用cv2.INTER_LINEAR插值算法。
当把一张高分辨率的图像缩小时,会降低图像分辨率,导致一些细节丢失。因此在图像预处理时,有时会通过裁剪的方法提取局部图像,这时直接读取图像坐标区间既可。使用方法如下:
Img_new=img[y1:y2,x1:x2]
需要注意的是,在定义图像区域参数,高度(y坐标)在前,宽度(x坐标)在后,上例中表示截取的图像的左上角坐标为(x1,y1),右下角坐标为(x2,y2)。在数字图像处理中,一般是以左上角为(0,0)点,即原点,向下向右为坐标轴正向。OpenCV读取图像后返回的是一NumPy矩阵对象,可以使用矩阵的下标来获取特定坐标的像素值,如(b, g,r)=image[20,20]便可得到相对于左上角距离为(20,20)点的像素值,分别代表蓝、绿、红三色的色彩值,它们组合起来便是该点的像素值。
在深度学习中,训练样本的大小是决定网络模型训练好坏的重要条件,针对同一幅图像采用随机裁剪的方法截取图像的不同区域,能够明显增加网络训练的数据量。算法首先确定需要的图片的大小,然后根据左上角坐标计算出裁剪后剩下的高与宽,之后在其中随机取得的一点作为起始点,从中截取所需的图像。具体代码如下:
import cv2
import random
img=cv2.imread("lena.jpg")(www.xing528.com)
w, h,c=img.shape
img_width_box=w∗0.2
img_height_box=h∗0.2
for_in range(6):
start_x=int(random.uniform(0,img_width_box))
start_y=int(random.uniform(0,img_height_box))
copyimg=img[start_y:start_y+200,start_x:start_x+200]
cv2. imshow("test",copyimg)
cv2. waitKey(0)
上例中可以一次生成6个从不同位置裁剪的图像,每幅图像的大小均为200×200。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。