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

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

1 导入模块

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

import cv2
import numpy as np
import 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 axis

plt.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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值