openCV专栏(二):基础计算实战+色彩空间转换

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()

运行结果:
在这里插入图片描述

(二)使用秘钥加密图像

   原理:图像与手动生成的秘钥图像进行按位异或操作,实现加密,反之解密
   作用:隐藏图像
   扩展:利用简单的原理制作一个图像解码器

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()

运行结果:
在这里插入图片描述

(三)位平面分解

   原理:逐一分解灰度图每个比特位的二进制像素值,得到八个二进制图效果:从第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()

运行结果:
在这里插入图片描述

(四)色彩空间

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()

运行结果:(可以看到不同的色彩空间效果不同)
在这里插入图片描述

(五)结束语

   以上就是今天所要分享的内容了
   学习路漫漫,我们仍需负重前行……
   为此博主新创建了一个群,期待你们的加入:
   QQ群:928357277

在这里插入图片描述

欢迎加入我们的大家庭:928357277

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>