图像读取
- 读取图像
import cv2 #opencv的缩写为cv2
import matplotlib.pyplot as plt # matplotlib库用于绘图展示
import numpy as np # numpy数值计算工具包
# 魔法指令,直接展示图,Jupyter notebook 特有
%matplotlib inline
img = cv2.imread('01_Picture/01_cat.jpg')
print(type(img)) # img 的类型为 numpy.ndarray 类型
img # uint8 的取值范围在 0-255 之间
- 执行结果
<class 'numpy.ndarray'>
array([[[142, 151, 160],
[146, 155, 164],
[151, 160, 169],
...,
[156, 172, 185],
[155, 171, 184],
[154, 170, 183]],
[[107, 118, 126],
[112, 123, 131],
[117, 128, 136],
...,
[155, 171, 184],
[154, 170, 183],
[153, 169, 182]],
[[108, 119, 127],
[112, 123, 131],
[118, 129, 137],
...,
[154, 170, 183],
[153, 169, 182],
[152, 168, 181]],
...,
[[162, 186, 198],
[157, 181, 193],
[142, 166, 178],
...,
[181, 204, 206],
[170, 193, 195],
[149, 172, 174]],
[[140, 164, 176],
[147, 171, 183],
[139, 163, 175],
...,
[167, 187, 188],
[123, 143, 144],
[104, 124, 125]],
[[154, 178, 190],
[154, 178, 190],
[121, 145, 157],
...,
[185, 198, 200],
[130, 143, 145],
[129, 142, 144]]], dtype=uint8)
- 显示图像
# opencv 默认读取格式是 BGR 格式,matplotlib 或其他库的读取格式可能是 RGB 的
# opencv 读取并用 opencv 自带的展示函数不需要进行通道转换,但 opencv 读取后用其他库展示图片需要通道转换
# 图像显示时,可以创建多个窗口
# 第一个入口参数为展示图像窗口的名字
# 第二个入口参数为展示图像窗口中所展示的图像
img = cv2.imread('01_Picture/01_cat.jpg')
cv2.imshow('image_cat',img)
# 等待时间,毫秒级,0表示任意键终止,5000ms表示5s
cv2.waitKey(5000)
# 销毁图像窗口
cv2.destroyAllWindows()
-
执行结果
-
封装方法
# 绘图显示(封装函数)
def cv_show(name,img):
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv_show('image_cat',img)
- 读取BGR
import cv2 #opencv的缩写为cv2
import matplotlib.pyplot as plt # matplotlib库用于绘图展示
import numpy as np # numpy数值计算工具包
# 魔法指令,直接展示图,Jupyter notebook特有
%matplotlib inline
img = cv2.imread('01_Picture/01_cat.jpg')
img.shape # (h,w,c) c表示 3 通道,这个 3 通道被 opencv 读进来是 BGR 的先后顺序的 3 通道
- 执行结果
(414, 500, 3)
- 读取灰度图
img_gray = cv2.imread('01_Picture/01_cat.jpg',cv2.IMREAD_GRAYSCALE)
#img_gray = cv2.imread('01_Picture/01_cat.jpg',cv2.IMREAD_COLOR) # BGR图
img_gray # 只有一个通道,同样是 uint8 类型
- 执行结果
array([[153, 157, 162, ..., 174, 173, 172],
[119, 124, 129, ..., 173, 172, 171],
[120, 124, 130, ..., 172, 171, 170],
...,
[187, 182, 167, ..., 202, 191, 170],
[165, 172, 164, ..., 185, 141, 122],
[179, 179, 146, ..., 197, 142, 141]], dtype=uint8)
- 查看属性
print('type(img_gray):',type(img_gray))
print('img_gray.size: ',img_gray.size) # 414 × 500 = 20700
print('img_gray.dtype:',img_gray.dtype)
print('img_gray.shape:',img_gray.shape) # 只有一个通道
- 执行结果
type(img_gray): <class 'numpy.ndarray'>
img_gray.size: 207000
img_gray.dtype: uint8
img_gray.shape: (414, 500)
- 显示图片
def cv_show(name,img):
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv_show('image_cat_gray',img_gray)
# 保存图片
cv2.imwrite('01_Picture/02_cat_gray.jpg',img_gray)
-
执行结果
-
HSV颜色空间
# H - 色调(主波长)。
# S - 饱和度(纯度/颜色的阴影)。
# V - 强度
import cv2 #opencv的缩写为cv2
import matplotlib.pyplot as plt # matplotlib库用于绘图展示
import numpy as np # numpy数值计算工具包
# 魔法指令,直接展示图,Jupyter notebook特有
%matplotlib inline
hsv = cv2.imread('01_Picture/01_cat.jpg', cv2.COLOR_BGR2HSV)
cv2.imshow('hsv',hsv)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 执行结果