python【笔记】:opencv库(一) 输入输出图像

来源:互联网 发布:百度联盟和淘宝联盟 编辑:程序博客网 时间:2024/06/05 20:13

  • opencv库一 输入输出图像
    • 导入模块
    • 读取图像
    • 图像输出
      • 用 opencv 输出
      • 用 matplotlib 输出
    • 综合例子

opencv库(一): 输入输出图像

1 导入模块

数字图像数据可以用矩阵来表示,因而我们可以采用矩阵理论和矩阵算法对数字图像进行分析和处理。
opencv 库依赖与 numpy 库的矩阵运算,所以两者需要同时加载。
matplotlib 库不是必须加载的,但是很多时候我们需要用到这个强大的图像处理模块。

import cv2import numpy as npimport matplotlib.pyplot as plt

2 读取图像

原始图像:

img1.png

img = cv2.imread('img1.png')

img 实际上是一个3维矩阵:

print(type(img)) # <class 'numpy.ndarray'>print(img.shape) # (219, 218, 3)print(img.ndim)# 3

彩色图像有 RGB 三个通道,所以我们可以将这个三维矩阵分成三个部分。


3 图像输出

opencv 输出

# opencv 设置窗口 图像输出 窗口关闭 cv2.namedWindow('image', cv2.WINDOW_NORMAL)cv2.imshow('image',img)cv2.waitKey(0)cv2.destroyAllWindows() # 等价于cv2.destroyWindow('image')
  • cv2.namedWindow() 其实可以不需要,但是如果图片尺寸比较大,输出的图像会装不下电脑屏幕。该命令第一个参数是输出的窗口的名称。
  • cv2.imshow() 是图像输出的命令,第一个参数为输出的窗口的名称,第二个参数是读取的图像变量。
  • cv2.waitKey(0) 是等待按键关闭窗口的时间,传递的数值单位为毫秒,设置成 0 的话是无限等待。
  • cv2.destroyAllWindows() 是关闭窗口命令。若需要指定关闭某个窗口,可以使用 cv2.destroyWindow('image_name')

matplotlib 输出

img = cv2.imread('img1.png')b,g,r = cv2.split(img)img2 = cv2.merge([r,g,b])plt.imshow(img2)plt.show()

需要注意的是, opencvcv2.imread() 命令读取到的三原色顺序为blue,green,red ,用 opencv 展示出来的是图像正确的颜色;而一般而言,三原色的顺序为RGB,所以我们如果用 matplotlib 显示图像,需要重组矩阵以正确显示图像的颜色。参见此处:stack overflow

命令实现:

b,g,r = cv2.split(img)img2 = cv2.merge([r,g,b])

我们可以用下面的语句看看拆分的矩阵是什么:

print(b)print('\n')print(b.shape)print('\n')print(np.all(b==img[:,:,0]))

输出结果为:
重组图像矩阵

上面的命令表明:
- 我们可以通过 img 矩阵的切片得到RGB矩阵,比如 img[:,:,0] 得到 blue 通道
- img.shape 或者 b.shape 的第一个数字代表图像的高度,第二个数字代表图像的宽度。


测试以下命令:

img = cv2.imread('img1.png')b,g,r = cv2.split(img)img2 = cv2.merge([r,g,b])plt.subplot(221)plt.title('BRG')plt.imshow(img)plt.xticks([]), plt.yticks([])  # to hide tick values on X and Y axisplt.subplot(222)plt.title('RGB')plt.xticks([]), plt.yticks([]) plt.imshow(img2)plt.subplot(223)plt.imshow(img, interpolation = 'bicubic')plt.title('BRG+interpolation')plt.subplot(224)plt.imshow(img2, interpolation = 'bicubic')plt.title('RGB+interpolation')plt.show()

输出结果:

BRG / RGB

说明:
第一幅图片以 BRG 显示图像,第二幅以 RGB 正常显示图像;
第三、四幅图片经过插值之后,消除了图像锯齿。

4 综合例子

来自官网的一个例子:

img = cv2.imread('img1.png')cv2.imshow('image',img)k = cv2.waitKey(0) & 0xFF # 32位的电脑该命令为 k = cv2.waitKey(0) if k == 27:         # wait for ESC key to exit    cv2.destroyAllWindows()elif k == ord('s'): # wait for 's' key to save and exit    cv2.imwrite('img_from_cv2.png',img)     cv2.destroyAllWindows()

该命令可以实现按 Esc 键关闭窗口,按 s 键保存图片


来源:OpenCV-Python Tutorials » Gui Features in OpenCV » Getting Started with Images

原创粉丝点击