OPENCV基础操作
温馨提示:本栏目使用的版本仅供参考,其他版本也可
库 | 版本 |
---|---|
python | Python 3.9.3 |
opencv | 4.5.5 |
matplotlib | 3.4.3 |
numpy | 1.19.5 |
(一)使用matplotlib库绘制图表
简介:matplotlib是Python最常用的绘图库,提供了一整套十分适合交互式绘图的命令具。
学习任务:简单使用matplotlib库创建画布并加载图片至画布
代码:
import matplotlib.pyplot as plt #导入模块
#创建一个300*300*3的三维矩阵
img1 = np.ones((300,300,3),np.uint8)
#在img1的基础上计算并创建等大矩阵
img2 = img1*80
img3 = img1*160
img4 = img1*255
#加载图像至画布
plt.subplot(2,2,1)#在画布上创建行2,列2的四个区域,并指向区域1
plt.imshow(img1,'gray')#将img1加载至区域1
plt.title(1)#设置区域1的标题
plt.subplot(2,2,2)#在画布上创建行2,列2的四个区域,并指向区域2
plt.imshow(img2,'gray')#将img2加载至区域2
plt.title(2)#设置区域2的标题
plt.subplot(2,2,3)#在画布上创建行2,列2的四个区域,并指向区域3
plt.imshow(img3,'gray')#将img3加载至区域3
plt.title(3)#设置区域3的标题
plt.subplot(2,2,4)#在画布上创建行2,列2的四个区域,并指向区域4
plt.imshow(img4,'gray')#将img4加载至区域4
plt.title(4)#设置区域4的标题
#显示图像
plt.show()
运行结果:
(2) 用秘钥加密图像
原理:对图像和手动生成的密钥图像进行按位异或运算,实现加密,反之解密
作用:隐藏图像
扩展:使用简单原理制作图像解码器
1:加密
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('./111.jpg',0)# 0 代表读入一张灰度图像
# 2:构建秘钥图像
mask = np.random.randint(0,255,(img.shape),dtype = np.uint8)#深成一张img大小的uint8类型的矩阵
# 3:加密
maskimg = cv2.bitwise_xor(img,mask)#逻辑位异或操作
# 4:加载图片至画布
plt.subplot(121)
plt.imshow(maskimg,'gray')
plt.title("maskimg")
plt.show()
2:解密(二合一)
# 1:获取灰度图像
img = cv2.imread('./111.jpg',0)
# 2:构建秘钥图像
mask = np.random.randint(0,255,(img.shape),dtype = np.uint8)
# 3:加密
maskimg = cv2.bitwise_xor(img,mask)
# 4:加载图片至画布
plt.subplot(121)
plt.imshow(maskimg,'gray')
plt.title("maskimg")
# 二:解密
unmaskimg = cv2.bitwise_xor(maskimg,mask)
# 5:加载图片至画布
plt.subplot(122)
plt.imshow(unmaskimg,'gray')
plt.title("unmaskimg")
# 6:显示图像
plt.show()
运行结果:
(3) 位平面分解
原理:逐一分解灰度图每个比特位的二进制像素值,得到八个二进制图效果:从第0个位平面到第7个位平面分别表现了对图像的不同影响
数学处理:按位与保留当前位
扩展:可将水印图片藏于影响最小的第0位面中,增加隐蔽性
import cv2
import matplotlib.pyplot as plt
import numpy as np
"""
原理:逐一分解灰度图每个比特位的二进制像素值,得到八个二进制图效果:从第0个位平面到第7个位平面分别表现了对图像的不同影响
数学处理:按位与保留当前比特位
扩展:可将水印图片藏于任意一个位面图中,增加隐蔽性
"""
# 1:获取灰度图像
filename = './111.jpg'#保存图片路径
img = cv2.imread(filename,0)#以灰度的形式读取图片111
# 2:构建提取矩阵
x,y = img.shape#获取行 列数
construction = np.ones((x,y,8),np.uint8)#构建x行,y列,8个通道的矩阵
for i in range(8):
construction[:,:,i] = 2**i#通过八次循环给每一个通道写入一张比特位图,从低位到高位
# 3:提取位平面
for X in range(8):
"""将每个通道的表和原图进行按位与"""
construction[:,:,X] = cv2.bitwise_and(construction[:,:,X],img)
# 4:法制处理(获得黑白分明的二值图)
for X in range(8):
saveimg = construction[:,:,X]>0
construction[saveimg,X] = 255
# 5:显示图像
for i in range(8):
plt.subplot(2,4,i+1)#将画布分为两行四列,当前图像显示到第i+1个区块
plt.imshow(construction[:,:,i],cmap='gray')#把图像加载到plt画布中
plt.title(i)#设置当前图像标题
plt.show()
运行结果:
(4) 色彩空间
1:色彩空间基本内容
介绍:在处理图像的过程中,我们总是说RGB图像。在opencv中,RGB是一种比较常见的色彩空间类型,除此之外,还有一些其他的色彩空间,常见的如下:
色彩空间 | 内容 |
---|---|
GRAY | 灰度图【单一通道的图像】 |
XYZ | 更便于计算的色彩空间(常与RGB互相转换) |
Ycrcb | 加入了亮度的色彩空间 |
HSV | 人眼感知的模型[色调[0~360],饱和度[0 ~1],亮度[0 ~1]] |
HLS | 类型HSV[色调[0 ~360],亮度/明度[0 ~1],饱和度[0 ~1]] |
CIEL*a*b | 均匀色彩空间模型 |
CIEL*u*v | 适用于显示器显示和根据加色原理组合的场景 |
Bayer | 用于CCD和CMOS相机中的颜色空间 |
Bayer | 用于CCD和CMOS相机中的颜色空间 |
2:色彩空间类型转换
函数原型 | 参数 |
---|---|
cv2.cvtColor(src,code[,dstCn]) | src:输入图像 |
code:色彩空间转码【枚举】 | |
dstCn:被转码图像通道数 默认表示自动获取 | |
返回值:输出转码图像 |
import cv2
import matplotlib.pyplot as plt
import numpy as np
img = cv2.imread('./111.jpg')#读入一张RGB图
x,y,n = img.shape
All = np.ones((x,y,3,4), dtype=np.uint8)
#转为GRAY灰度色彩空间
All[:,:,0,0] = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#转为CLE XYZ色彩空间
All[:,:,:,1] = cv2.cvtColor(img,cv2.COLOR_RGB2XYZ)
#转为HSV色彩空间
All[:,:,:,2] = cv2.cvtColor(img,cv2.COLOR_RGB2HSV)
#转为BGR色彩空间
All[:,:,:,3] = cv2.cvtColor(img,cv2.COLOR_RGB2BGR)
#加载图像至画布
for X in range(4):
plt.subplot(2,2,X+1)
if X ==0:
plt.imshow(All[:,:,0,X],'gray')
continue
plt.imshow(All[:,:,:,X],'gray')
#显示画布
plt.show()
运行结果:(可以看到不同的色彩空间有不同的效果)
(5) 结论
这就是我今天想分享的全部内容
学习的路还很长,我们还要继续前行……
为此,博主新建了一个群,期待你的加入:
QQ群:928357277
欢迎加入我们的大家庭:928357277
文章出处登录后可见!
已经登录?立即刷新