简单来理解的话
size表示尺寸
shape代表形状
那么resize表示重绘大小,reshape表示重绘形状
既然重绘大小,那么size就会变化,其像素数量就会发生变化;
重绘形状,则是像素数量不变,只改变其外形。
那么通过,代码简单看一下吧
img=cv2.imread('lena.png')#256,256,3 ###Resize img_Resize=cv2.resize(img,(500,500)) #resize是作用于单个通道的,因此,缩放时,根据原图像的通道进行操作。 ###Reshape img_Reshape=img.reshape(128,512,3) #img.reshape((128,512,3)) #img.reshape([128,512,3]) #img.reshape(128,384) #总之是保证数量与原数量相同,怎么排列不关心。
这里需要注意的是,reshape是直接针对img进行操作,而resize,需要通过cv2的库进行操作,如果直接img.resize的话,则会报错,如果添加了refcheck和order参数,那么也得不到正确的图像结果。(从目前我的了解应该是不可以,有知道的大神可以说一下哦)
如果想直接使用img.resize,其实是可以调用PIL库的,PIL中提供的resize方法可以以不同的插值方法进行处理
Image.resize(size, resample=0)
其中:
resample表示改变图像过程用的插值方法。0:双线性插值。1:最邻近插值。2:双三次插值法。3:面积插值法。
仔细研究过resize方法过后,发现resize可以不同的方式进行缩放,同时,支持不同的插值方法,
除了上述通过(width,height)直接指定缩放大小外,还可以通过fx fy来设置其缩放倍数,此时size可置为0,如下
# x方向放大2倍;y方向放大2倍 cv2.resize(img,None,fx=2,fy=2)
同时,可以通过Interpolation参数来指定其插值方式,该参数为cv2的枚举值,取值范围为0-7(8中),除常用的最邻近插值(INTER_NEAREST)、双线性插值(INTER_LINEAR)外,还有INTER_CUBIC (三次样条插值)、INTER_AREA (区域插值)等。
而且,官方文档给出了如下定义:
To shrink an image, it will generally look best with #INTER_AREA interpolation, whereas to enlarge an image, it will generally look best with #INTER_CUBIC (slow) or #INTER_LINEAR (faster but still looks OK).
如果要缩小图像,通常推荐使用INTER_AREA插值效果最好,而要放大图像,通常使用INTER_CUBIC(速度较慢,但效果最好),或者使用INTER_LINEAR(速度较快,效果还可以)。
结论:
速度比较:INTER_NEAREST(最近邻插值)>INTER_LINEAR(线性插值)>INTER_CUBIC(三次样条插值)>INTER_AREA (区域插值)
OpenCV推荐:如果要缩小图像,为了避免出现波纹现象,通常推荐使用#INTER_AREA插值效果最好,而要放大图像,通常使用INTER_CUBIC(速度较慢,但效果最好),或者使用INTER_LINEAR(速度较快,效果还可以)。至于最近邻插值INTER_NEAREST,一般不推荐使用。
最后,贴出方法的官方定义,以及Interpolation的解释。
有需要的,源地址自取: