缩放的参数选择如下:
import cv2
import matplotlib.pyplot as plt
pic = cv2.imread('flower-631765_1280.jpg')
pic1 = cv2.resize(pic, (400, 100), interpolation=cv2.INTER_CUBIC)
cv2.imshow('picture',pic) #第一个参数的图片的名称,必须要有
cv2.imshow('resized picture',pic1)
cv2.waitKey(0) #必须要有
cv2.destroyAllWindows()
显示结果为:
需要非常注意的2点是:
此外在图片显示的过程中,通常会伴随几个其他的函数,他们分别是:
因为我们的程序是顺序执行,如果没有cv2.waitKey()函数,图像不会显示(也许是一闪而过,我们人眼观察不到),cv2.waitKey()函数是一个键盘绑定函数(相当于让程序在这里挂起暂停执行),他接受一个单位为毫秒的时间,它等待指定时间的键盘事件,在指定时间内发生了键盘事件,程序继续执行,否则必须等到时间结束才能继续执行,参数如果为0表示等待无限长的事件。
cv2.destroyAllWindows()用来销毁所有已经创建的窗口,它配合cv2.waitKey(0)使用的过程是:首先显示图片,然后由于cv2.waitKey(0)的存在,程序被挂起,一直处于显示图片的过程中。这时候如果发生了键盘事件,比如按下esc,那么程序继续执行,运行到cv2.destroyAllWindows()就会销毁所有的窗口
如果需要销毁指定窗口使用cv2.destroyWindow()函数,他接受一个表示窗口名字的名字。
在这里我们直接用cv2.imshow()创建的窗口是自动适应图片大小的,不能缩放,如果我们想放大缩小窗口,必须单独用cv2.namedWindow(),并通过flag参数指定窗口模式为cv2.WINDOW_NORMAL,默认为cv2.WINDOW_AUTOSIZE.
上述代码中我们是弹出两个窗口,那如果要在一个窗口中显示两种图片呢?代码如下:
import matplotlib.pyplot as plt
plt.figure()
plt.subplot(1,2,1)
plt.imshow(pic)
plt.title('picture')
plt.axis('off') #不显示坐标轴
plt.subplot(1,2,2)
plt.imshow(pic1)
plt.title('resize picture')
plt.axis('off') #不显示坐标轴
这时候可能发现花的颜色变了,原因是plt显示图片要求的格式为是RGB格式,而前面我们说了cv2读取的格式是BGR
这时在代码前添加两行代码,交换通道即可。这里只是交换了通道的位置,他们的shape仍为(高,宽,通道数)
pic = pic[:, :, (2, 1, 0)] #交换通道
pic1 = pic1[:, :, (2, 1, 0)] #交换通道
import cv2
pic = cv2.imread('flower-631765_1280.jpg')
cv2.imshow('picture',pic) #第一个参数的图片的名称,必须要有
k = cv2.waitKey(0)
if k == 27: # 按下esc时,退出
cv2.destroyAllWindows()
elif k == ord('s'): # 按下s键时保存并退出
cv2.imwrite('456.png',pic)
cv2.destroyAllWindows()