在使用opencv和numpy的过程中,难免会需要对图像的大小进行调整,resize、获得shape之类的操作更是家常便饭了,但是在使用opencv和numpy改变图像大小的过程中,总是发现一些奇怪的问题,困扰了我很久,今天记录一下,以防下次再犯,也为有相同困扰的童鞋提个醒! 先来看看通过opencv读取一张图像之后,shape是什么吧: 我么来读取一张宽858,长600的图像:
>>> im = cv2.imread("XXX")>>> im.shape(600, 858, 3)>>>很显然,shape的组成是这样的: (高,宽,通道数) 再来看看numpy,numpy中很多的方法都带有shape这个参数,当使用numpy来创建一幅图像的时候,总是容易将opencv和numpy的shape搞混掉,我们先看看numpy创建一个二维数组:
>>> a = np.zeros((3,5))>>> aarray([[0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.]])>>>很显然,我们传入的(3,5)作为shape的参数,而结果显示,3是行数,5是列数,即3是高度,5是宽度,那么我们使用numpy创建一幅图像时,shape就是 (高度,宽度), 如果还有通道的话,就是 (高度,宽度,通道数). 原来,numpy的shape[0:2]和opencv中通过imread读取的图像的shape[0:2]是一样的的,即 (高度,宽度). 但是在向opencv的方法中传入size参数时,又是什么样的呢? 还是用刚刚读取的图像做例子(高600,宽858),
>>> reim = cv2.resize(im,(200,400))>>> cv2.imshow("resize",reim)>>> cv2.waitKey(3000)显然,我们传入的size参数是这样解释的 200作为宽,400作为高,即size为 (宽,高),这和我们之前看到的shape里数据的顺序是不一样的!其实当我们涉及界面或者图像的size时,size中数据的排列方式一般都是 ( 宽,高) ,所以当我们想使用某些图片或者控件等的size时,请注意size和shape中数据的顺序是不一样的!