python cv2图像处理函数

加载图片并进行缩放

缩放的参数选择如下:

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读取图片后的格式为:(高,宽,通道数),上图就是(750,1280,3),这里通道数格式为BGR
  • 而resize的输入参数形式为:(宽,高,通道数)
  • resize后是失去原有比例的

此外在图片显示的过程中,通常会伴随几个其他的函数,他们分别是:

  •     cv2.waitKey()
  •     cv2.destroyAllWindows()
  •     cv2.destroyWindow()
  •     cv2.namedWindow()

因为我们的程序是顺序执行,如果没有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()

猜你喜欢

转载自blog.csdn.net/Mr_health/article/details/86215270