基于OpenCV的数字图像处理 课件 项目二 提取图像中的特定色块并对图像进行加密_第1页
基于OpenCV的数字图像处理 课件 项目二 提取图像中的特定色块并对图像进行加密_第2页
基于OpenCV的数字图像处理 课件 项目二 提取图像中的特定色块并对图像进行加密_第3页
基于OpenCV的数字图像处理 课件 项目二 提取图像中的特定色块并对图像进行加密_第4页
基于OpenCV的数字图像处理 课件 项目二 提取图像中的特定色块并对图像进行加密_第5页
已阅读5页,还剩122页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

图像的加法运算数字图像运算

数字图像是由一个个像素点构成,每个像素点对应一个像素值,对像素点进行相应的加法运算和位运算,可以构造更复杂的图像。加法运算的概念

通常情况下,图像像素值取值范围在0-255之间。

图像相加,即对应像素点的像素值求和,因此要求两个相加的图像必须具有相同的形状,即相同的行数、列数、通道数,相加后的像素值可能大于255,不同的相加方法对于和大于255的像素点有不同的处理方式。图像相加有两种方式:“+”进行相加cv2.add()函数进行相加图像加法运算-使用加号进行求和使用加号运算符对两个图像相加,如果两个图像对应像素点相加的和小于等于255,则新图像的对应像素点的值取实际值,对于和大于255的像素点则进行取模运算(对256取模,确保像素值小于等于255)。设a表示图像1中某像素点的像素值,b表示图像2中对应位置的像素点b的值,则两幅图像的求和运算为:

a+b=mod(a+b,256)使用“+”对两个图像求和。图像加法运算-使用加号进行求和的案例importnumpyasnpimg1=np.random.randint(0,256,size=[2,5],dtype=np.uint8)#生成2行5列的图像img2=np.random.randint(0,256,size=[2,5],dtype=np.uint8)#生成2行5列的图像print("img1=\n",img1)print("img2=\n",img2)print("img1+img2=\n",img1+img2)【例2.1gray+gray.py】使用随机数生成两个大小相同的灰度图像,对两个图像进行相加,观察结果。首先两个图像的大小均是2行5列,加号相加生成的图像也是2行5列,由结果可以看到,img1和img2对应位置像素值相加和小于256的生成图像对应位置的值为其和,如果和大于256的,则用其和对256取模作为新图像的像素值。图像加法运算-使用加号进行求和的案例img1=[[112302574104][2237019287]]img2=[[10522713725251][179921766033]]img1+img2=[[21711629999][181115246252120]]图像加法运算-使用函数进行加法运算使用cv2.add()函数对两个图像相加,如果两个图像对应像素点相加的和小于等于255,则新图像的对应像素点的值取实际值,对于和大于255的像素点则取最大值255,规则如下公式所示:

a+ba+b≤255a+b=255a+b>255注:a表示图像1某点的像素值,b表示图像2中对应位置的像素点的值。使用cv2.add(img1,img2)对两个图像求和函数cv2.add()有三种形式:形式1:cv2.add(img1,img2),两个参数都是图像,图像大小和类型必须保持一致。形式2:cv2.add(img,数值),第一个参数是图像,第二个参数是数值,运行时会将图像中的每一个像素值均加上第二个参数的值。形式3:cv2.add(数值,img),第一个参数是数值,第二个参数是图像,运行时会将图像中的每一个像素值均加上第一个参数的值。图像加法运算-使用函数进行加法运算图像加法运算-使用函数进行加法运算的案例importnumpyasnpimportcv2img1=np.random.randint(0,256,size=[2,5],dtype=np.uint8)img2=np.random.randint(0,256,size=[2,5],dtype=np.uint8)print("img1=\n",img1)print("img2=\n",img2)img=cv2.add(img1,img2)print("img1+img2=\n",img)【例2.2gray_add_gray.py】使用cv2.add()函数求两个图像的和。图像加法运算-使用函数进行加法运算的案例img1=[[1301511825568][2459813211188]]img2=[[5223616596][173144168131136]]img1+img2=[[18217154255164][255242255142255]]由结果可以看出,如果相应像素点的和小于256,则新图像中保留两者之和,如果和大于256,则取最大值255。importnumpyasnpimportcv2img=np.random.randint(0,256,size=[2,5],dtype=np.uint8)print("img=\n",img)img1=cv2.add(img,img)img2=cv2.add(img,10)img3=cv2.add(50,img)print("img=\n",img)print("img1=\n",img1)print("img2=\n",img2)print("img3=\n",img3)【例2.3img_add_num】使用随机数生成灰度图像,将灰度图像和一个数值相加,观察结果。图像加法运算-使用函数进行加法运算的案例结果解析:将图像img和img相加,值是图像对应像素点的和,将图像和10相加,结果是每个像素点的值均增加了10,如果和大于255,则取值255,如果和小于等于255,则取实际值。img=[[177130148155163][113812444398]]img1=[[255255255255255][22616225586196]]img2=[[187140158165173][1239125453108]]img3=[[227180198205213][16313125593148]]图像加法运算-使用函数进行加法运算的案例importnumpyasnpimportcv2img=cv2.imread("image//gray_fish.jpg")result1=cv2.add(img,img)result2=img+imgcv2.imshow("original",img)cv2.imshow("result1",result1)cv2.imshow("result2",result2)cv2.waitKey()cv2.destroyAllWindows()【例2.4add_vs_+】使用两种不同的加法将两个图像进行相加,观察输出结果图像加法运算-使用函数进行加法运算的案例图(a)为原始图像,图(b)使用cv2.add()函数进行相加,因像素和大于255的均取值255,小于255的保持和不变,因此整体像素值增大,图像变亮。图(c)是通过加号相加,对于和大于255的像素点对256取模,和比原来的值变小,对于和小于256的像素值保持不变,因此图像有的位置变暗有的位置变亮。(a)

(b)

(c)图像加法运算-使用函数进行加法运算的案例图像的加权求和图像加权和就是在计算两幅图像的像素值之和时,将每幅图像的权重考虑进来,OpenCV提供了cv2.addWeighted()函数实现图像加权求和:dst=cv2.addWeighted(src1,α,src2,β,γ)

α为src1的权重

β为src2的权重

γ为亮度调节参数,不可省略。目标图像的像素值计算公式如下:dst=saturate(src1×α+src2×β+γ)saturate表示取饱和值(最大值)。图像进行加权求和时,要求src1和src2必须大小、类型相同,但是对具体是什么类型和通道没有特殊限制。可以使任意数据类型,也可以有任意数量的通道(灰度图像或彩色图像),只要二者相同即可。图像加权求和案例1importcv2importnumpyasnpimg1=np.ones((2,5),dtype=np.uint8)*20#全20矩阵img2=np.ones((2,5),dtype=np.uint8)*10#全10矩阵gamma=3img3=cv2.addWeighted(img1,0.4,img2,0.6,gamma)#20*0.4+10*0.6+3=17print(“img3=”img3)【2.5add_weighted_pixel】生成两个2*5的灰度图像,对其进行加权求和结果解析:img1中的所有像素值均为20,img2中所有像素值均为10,img1的权重是0.4,img2的权重是0.6,gamma的值为3,因此img1*0.4+img2*0.6+3=17,所以输出图像的所有像素值均为17。img3=[[1717171717][1717171717]]img1=[[2020202020][2020202020]]img2=[[1010101010][1010101010]]图像加权求和案例1图像加权求和案例2importcv2a=cv2.imread("image//girl.jpg")b=cv2.imread("image//flower.jpg")result=cv2.addWeighted(a,0.8,b,0.5,0)cv2.imshow("girl",a)cv2.imshow("flower",b)cv2.imshow("result",result)cv2.waitKey()cv2.destroyAllWindows()【例2.6add_weighted_img】将两个图像进行加权求和。图像加权求和案例2结果解析:图(a)和(b)为两个原始图像,两幅图像的大小相同,图(c)为加权求和后的输出结果,由图可见,加权求和后图像中既有女孩的图像,又有花的图像,但是因为女孩图像的权重更大,所以显示的更为清晰,同学们可以试着调整权重大小,比较输出结果。(a)

(b)

(c)谢谢!图像的逻辑运算图像逻辑运算的概念

数字图像的逻辑运算是指对两幅或多幅图像的像素值进行逐位的逻辑操作(如与、或、非、异或等),从而生成新的图像。逻辑运算是一种非常重要的运算方式,图像处理过程中经常要按照位进行逻辑运算,比如图像的加密解密、图像掩膜都需要使用图像的逻辑运算。图像的逻辑运算函数表2.1:图像的逻辑运算函数函数名基本含义运算规律cv2.bitwise_and()按位与参与运算的两个算子均为1结果为1,其余均为0cv2.bitwise_or()按位或参与运算的两个算子有一个为1,结果为1,其余结果为0cv2.bitwise_xor()按位异或参与运算的两个算子相同结果为0,两个运算数不同结果1cv2.bitwise_not()按位取反运算数为0结果为1,运算数为1结果为1按位与运算规则表2.2按位与运算规则算子1算子2运算结果规则000and(0,0)=0010and(0,1)=0100and(1,0)=0111and(1,1)=1按位与运算中,当参与运算的两个算子均为1结果为1,其余均为0按位与运算案例表2.3按位与运算案例数值十进制二进制数值16801000100数值213310000101按位与运算结果400000100

按位与运算是将两个运算数先转换为二进制,对应位进行按位与运算,再转换为十进制按位与运算函数

如果对两个图像进行按位与运算,则是将两个图像中对应的每个像素点的像素值转换为二进制,然后进行按位与运算,得到的结果为图像按位与的结果。在OpenCV中,对图像进行按位与操作的函数为:

dst=cv2.bitwise_and(src1,src2[,mask])dst:与原图src1,src2大小相同的array输出值。src1:第一个array或scalar类型的输入值。src2:第二个array或scalar类型的输入值。mask:可选操作掩码,8位单通道array。注意:src1和src2大小必须相同。按位与运算特点

任何数值N与0进行按位与得到的均是0任何数值N(这里仅考虑8位二进制,即0-255之间的值)与

255(8位二进制表示为11111111)进行按位与得到的都是N本身。数值二进制按位与操作结果十进制15810011011000000000(结果为0)000000000数值二进制按位与操作结果十进制1581001101110011011158(保持原数据不变)25511111111按位与运算特点

根据以上特点,可以构造一副掩膜图像M,掩膜图像M中只有两种数值,0和255,将掩膜图像与一副灰度图像进行按位与操作后,得到的结果图像result中:

掩膜中0对应的灰度图像全部变为0,因为0与任何数值取与均为0,即黑色。

掩膜图像中255对应的灰度图像全部保留,因为255与任何数值N取与,N值不变。图像的按位与操作案例1importcv2importnumpyasnpa=np.random.randint(0,255,(3,5),dtype=np.uint8)#生成3行5列矩阵b=np.zeros((3,5),dtype=np.uint8)#定义相同大小的全零矩阵b[0:2,0:3]=255#将第0-1行,0-2列设置为255c=cv2.bitwise_and(a,b)print("a=\n",a)print("b=\n",b)print("c=\n",c)【例2.7bitwise_and.py】使用数组演示掩膜图像的按位与运算。图像的按位与操作案例a为原始图像的像素矩阵,b为生成的掩膜图像,只有0和255两种值,c为a和b按位与操作的结果,可以看出b中255对应位置的值结果均保持不变,b中0对应位置的结果均为0。a=[[16791649582][35912716713][787811439222]]b=[[25525525500][25525525500][00000]]c=[[167916400][35912700][00000]]图像的按位与操作案例2importcv2importnumpyasnpimg=cv2.imread("image//girl.jpg")mask=np.zeros((img.shape),dtype=np.uint8)#定义相同大小的全零矩阵mask[0:130,90:210]=255#将第0-1行,0-2列设置为255result=cv2.bitwise_and(img,mask)cv2.imshow("img",img)cv2.imshow("mask",mask)cv2.imshow("result",result)cv2.waitKey()cv2.destroyAllWindows()【例2.8mask_face.py】构造掩膜图像,使用按位与操作保留图像中小女孩的面部位置。图像的按位与操作案例2结果解析:图2.3(a)为原始图像,语句mask=np.zeros((img.shape),dtype=np.uint8)生成一个与原图一样大小的全0掩膜,语句mask[0:130,90:210]=255将掩膜中对应的面部位置(第0到130行、第90到210列的位置)的像素值修改为255,如2.3(b)所示,面部位置为白色,即面部位置对应的像素值均为255,其余部分像素值均为0,语句cv2.bitwise_and(img,mask)将原图与掩膜图像进行按位与操作,结果如图2.3(C)所示,面部位置的像素值均与原图相同,而其余部分均为0,呈现黑色。(a)

(b)

(c)图像的按位或运算表2.4按位与运算规则按位或运算的规则是,只要两个算子中有一个为1,结果就为1。算子1算子2运算结果规则000or(0,0)=0010or(0,1)=0100or(1,0)=0111or(1,1)=1图像的按位或运算表2.5按位与运算案例数值十进制二进制数值16801000100数值213310000101按位与运算结果19711000101

按位或运算是先将两个运算数先转换为二进制,对应位进行按位或运算后,再转换为十进制。图像的按位或运算函数

在OpenCV中,使用cv2.bitwaise_or()来实现按位或操作,语法格式如下:

dst=cv2.bitwise_or(src1,src2[,mask])dst:与原图src1,src2大小相同的array输出值src1:第一个array或scalar类型的输入值src2:第二个array或scalar类型的输入值mask:可选操作掩码,8位单通道array图像的按位非运算表2.6按位非运算规则

按位非只有一个算子,运算规则是算子为0则运算结果为1,算子为1则运算结果为0。表2.7按位非运算案例算子十进制按位非结果1331000010101111010122

按位非运算是先将运算数先转换为二进制,对应位进行按位非运算后,再转换为十进制。算子运算结果规则01not(0)=110not(1)=0

结果可以看出,按位非的算子和结果之和等于255。按位非可以将原图中的黑色变为白色,白色变为黑色。图像的按位非运算案例importcv2importnumpyasnpimg=np.zeros((200,400),dtype=np.uint8)#定义200*400大小的全0矩阵img[0:200,0:200]=255#将左半部分设置为白色img_not=cv2.bitwise_not(img)cv2.imshow("img",img)cv2.imshow("img_not",img_not)cv2.waitKey()cv2.destroyAllWindows()【例2.9bitwise_not.py】生成一个数200*400的数组,左边一半为白色,右边一半为黑色,进行按位非操作。。图像的按位非运算案例(a)

(b)

结果解析:图(a)是原始图像,图(b)是按位取非后的图像,刚好黑白色互换,因为对0取非结果是255,对255取非结果是0。图像的按位异或运算表2.8按位异或运算规则算子1算子2运算结果规则000xor(0,0)=0011xor(0,1)=1101xor(1,0)=1110xor(1,1)=0按位异或操作的运算规则是,两个算子相同则结果为0,两个算子不同,则结果为1。谢谢!图像加密解密运算图像加密解密运算

通过将原始图像与密钥图像进行按位异或可以实现图像的加密运算,将加密后的图像再与密钥图像进行按位异或运算可以实现图像的解密运算。因此,按位异或运算可以实现图像的加密和解密。图像加密解密运算表2.9加密解密过程a(明文)b(密钥)c=xor(a,b)(密文)a=xor(c,b)0000011010111101

异或运算的规律如表2.9所示,a为明文,b为密钥,c为加密后的值,则加密过程为a与b进行按位异或操作,得到密文c,如果将密文c再与密钥b进行按位异或操作发现得到的值与a相同,因此解密过程为密文与密钥进行按位异或操作。表2.10加密过程案例运算说明十进制二进制十进制异或运算

明文10001100100

密钥12501111101

结果(密文)0001100149表2.11解密过程案例运算说明十进制二进制十进制异或运算

密文4900011001

密钥12501111101结果01100100100

将图像中每个像素点与对应的密钥进行按位异或操作可以得到加密后的图像,将加密后的图像中的每个像素点与密钥中对应的像素值进行按位异或操作可以得到原始图像。图像加密解密运算图像的加密解密运算案例importcv2importnumpyasnpimg=np.ones((3,3),dtype=np.uint8)#生成全1的原始图像key=np.random.randint(0,255,(3,3),dtype=np.uint8)#随机生成密钥encry=cv2.bitwise_xor(img,key)#图像加密print("img=",img)print("key=",key)print("encry=",encry)decry=cv2.bitwise_xor(key,encry)#将密钥与加密图像按位与操作进行图像解密print("decry=",decry)【例2.10encry_pixel.py】生成一组3*3大小的全1矩阵,然后随机生成一组大小相同的密钥,对全1矩阵进行加密解密运算。结果解析:原始图像与随机密钥按位异或操作后得到的加密图像encry与原始图像不同,加密后的图像与密钥进行按位异或操作后可以得到原始图像,同学们可以将其转换为二进制后进行验证。img=[[111][111][111]]key=[[22411592][358975][4013518]]encry=[[22511493][348874][4113419]]decry=[[111][111][111]]图像的加密解密运算案例importcv2importnumpyasnpimg=cv2.imread("image//girl.jpg")key=np.random.randint(0,255,img.shape,dtype=np.uint8)#随机生成密钥encry=cv2.bitwise_xor(img,key)#图像加密decry=cv2.bitwise_xor(key,encry)#图像解密cv2.imshow("befor",img)cv2.imshow("key",key)cv2.imshow("after_encry",encry)cv2.imshow("decry",decry)cv2.waitKey()cv2.destroyAllWindows()【例2.11encry_img.py】对图像girl.jpg进行加密和解密操作图像的加密解密运算案例(a)(b)(c)(d)图像的加密解密运算案例(a)为原始图像,(b)为密钥图像,(c)为加密后的图像,(d)为解密后的图像,原始图像与随机密钥按位异或操作后得到的加密图像encry与原始图像不同,加密后的图像与密钥进行按位异或操作后可以得到原始图像,同学们可以将其转换为二进制后进行验证。谢谢!提取图像中的特定色块

并对图像进行加密知识目标技能目标01掌握并运用图像的运算02掌握图像的色彩空间转换03理解位平面图分解原理及方法04理解数字水印的添加和提取原理素质目标

信息安全意识知识产权保护意识项目背景医学图像商业机密任务引入

作为一位专注于图像信息安全的加密技术人员,您肩负着一项至关重要的任务:确保敏感图像数据的安全。您当前的挑战是处理一张仅包含红色、黄色和蓝色的涉密图像。您的任务是将这张图像分解为其基本颜色组件,然后对每个部分进行加密,以确保在传输和存储过程中的安全。图像已存储在“pic”文件夹中,等待您的专业技术来保护其内容。您的目标是将加密后的图像部分按原名称加编号,安全地保存到当前目录下的“encry”文件夹中。任务准备图像运算图像加法运算图像逻辑运算图像加密解密运算色彩空间谢

谢!色彩空间基础色彩空间基础

色彩是人的眼睛对于不同频率的光线的不同感受,色彩既是客观存在的(不同频率的光)又是主观感知的,有认识差异。“色彩空间”一词源于西方的“ColorSpace”,又称作“色域”,色彩学中,人们建立了多种色彩模型,以一维、二维、三维甚至四维空间坐标来表示某一色彩,这种坐标系统所能定义的色彩范围即色彩空间。除了RGB色彩空间外,还常用GRAY、HSV、XYZ、YCrCb、HSV、HLS、CIEL*a*b*、CIEL*u*v*、Bayer等色彩空间。GRAY色彩空间

GRAY色彩空间通常指8位灰度图,具有256个灰度级,像素值范围是【0,255】。当图像由RGB色彩空间转换为GRAY色彩空间是,处理方式如下:

Gray=0.229*R+0.587*G+0.114*B

上式是OpenCV标准的转换方式,也可采用简化方式转换:

Gray=(R+G+B)/3

反过来,当图像的色彩空间由GRAY转换为RGB时,最终所有通道的值都是相同的: R=GRAY G=GRAY B=GRAYHSV色彩空间从波长的角度考虑,不同波长的光表现为不同的颜色,实际上他们体现的是色调的差异。色调相对纯净度,或一种颜色混合白光的数量。纯谱色是全饱和的,饱和度与所加白光的数量成反比。饱和度反应人眼感受到的光的敏感程度,加入白色越多,亮度越高,加入黑色越多,亮度越低。亮度

RGB是从硬件角度提出的颜色模型,与人眼匹配的过程中可能存在一定差异,HSV人眼视觉系统(HVS,HumanVisualSystem)色彩空间从心里学和视觉角度出发,指出人眼色彩直觉主要包含三要素:色调(Hue,也称为色相)、饱和度(Saturation)、亮度(Value),色调指出颜色,饱和度是指色彩的深浅程度,亮度指人眼感受到的光的明暗程度。HSV色彩空间图2.6HSV色彩空间色谱图

如下图所示,红色的色调H的取值范围为0-10,饱和度S的取值范围为43-255,亮度V的范围为46-255;黄色的色调H取值范围是26-34,饱和度S的取值范围是43-255,亮度V的取值范围是46-255;蓝色的色调H取值范围是100-124,饱和度S的范围是43-255,亮度V的范围是46-255,HSV色彩空间色谱图如图2.6所示。可以通过指定H、S、V的范围来查找或定位关注的色块。CIEL*u*v*色彩空间

CIEL*u*v*色彩空间同CIEL*a*b*一样,都是均匀颜色模型。CIEL*u*v*色彩空间与设备无关,适用于显示器显示和根据加色原理进行组合的场合,该模型中比较强调对红色的表示,即对红色的变化比较敏感,但对蓝色的变化不太敏感。

CIEL*a*b*色彩空间CIEL*a*b*色彩空间是均匀色彩空间模型,它是面向视觉感知的颜色模型。从视觉感知的角度来讲,人所感知到的两种颜色的区别程度,应该与这两种颜色在色彩空间中的距离成正比。区别越大的颜色,在色彩空间中距离越远。两种颜色在色彩空间中对应的点之间的欧式距离成正比,则称该色彩空间为均匀色彩空间。CIEL*a*b*色彩空间中的L*表示亮度,取值[0,100],表示从纯黑到纯白,a*表示从红色到绿色的范围,取值范围[-127,127],b*表示从黄色到蓝色的,取值[-127,127]。Bayer色彩空间Bayer色彩空间被广泛应用于CCD和CMOS相机中。谢谢!色彩空间转换色彩空间转换

每个色彩空间都有自己擅长处理的领域,因此,为了方便处理某个具体问题,就要用到色彩空间类型转换。色彩空间转换函数

在OpenCV中,使用cv2.cvtColor()函数来实现色彩空间的变换。该函数能够实现多个色彩空间之间的转换。dst=cv2.cvtColor(src,code[,dstCn])dst:输出图像,与原始输入图像由同样

的数据类型和深度。src:原始输入图像,可以是8位无符号图像、16位无符号图像或单精度浮点数等。code:色彩空间转换码,表中展示了其枚举值,图2.7为code的取值及含义。色彩空间转换函数表2.7色彩空间转换参数code取值意义cv2.COLOR_BGR2BGRA从BGR空间转换为BGRA空间,通道A是alpha通道,是透明属性cv2.COLOR_RGB2RGBA从RGB空间转换为RGBA空间cv2.COLOR_BGR2RGB从BGR空间转换为RGB空间cv2.COLOR_RGB2BGR从RGB空间转换为BGR空间cv2.COLOR_RGB2GRAY从RGB空间转换为GRAY空间cv2.COLOR_GRAY2RGB从GRAY空间转换为RGB空间cv2.COLOR_BGR2GRAY从GRAY空间转换为RGB空间色彩空间转换案例importcv2importnumpyasnpgray=np.random.randint(0,255,(2,4),dtype=np.uint8)#生成2行4列灰度图像color=cv2.cvtColor(gray,cv2.COLOR_GRAY2BGR)#从灰度空间转换到BGR空间print("gray=",gray)print("color=",color)【例2.12gray_to_gbr】通过数组观察空间转换后的像素值,将灰度图像转换为BGR图像。色彩空间转换案例结果解析:灰度图像转换为彩色图像后,一个像素点的值变为BGR图像中三个通道的值。输出结果:gray=[[2158811029][2339462196]]color=[[[215215215][888888][110110110][292929]]

[[233233233][949494][626262][196196196]]]色彩空间转换案例importcv2importnumpyasnpimg=cv2.imread("image//girl.jpg")gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)cv2.imshow("before_convert",img)cv2.imshow("after_convert",gray)cv2.waitKey()cv2.destroyAllWindows()【例2.13bgr_to_gray】将彩色图像girl.jpg转换为灰度图像。

图(a)为原图,是彩色图像,图(b)是转换后的灰度图像。试将图像girl.jpg从BGR色彩空间转换为RGB格式,然后输出图像,观察BGR图像和RGB图像颜色是否相同。(a)

(b)色彩空间转换案例谢谢!HSV色彩空间HSV色彩空间概述RGB色彩空间是一种被广泛接受的色彩空间,但是该色彩空间过于抽象,不能直接通过其值感知具体的色彩,而HSV色彩空间可以通过色调、饱和度、亮度来更直观地感知颜色。

在HSV色彩模式中,取色变得更直观。例如:取值“色调H=0,饱和度S=1,亮度V=1”则当前色彩为深红色,较亮;而取值“色调H=120,饱和度S=0.3,亮度V=0.4”则当前色彩为浅绿色,而且颜色较暗。HSV色彩空间从心里学和视觉的角度出发,提出人眼的颜色直觉包含三要素,即:H,色调(Hue,也称为色相);S,饱和度(saturation);V,亮度(Valuse)。色调H确定H范围后,即可找到特定的颜色。例如,在HSV图像中,H通道值为120的像素点对应蓝色,查找H通道值为120的像素点,找到的就是蓝色的像素点。在上述基础上,通过分析各种不同对象对应的HSV值,可以找到不同的对象。例如,可以直接在图像内根据肤色的HSV值来查找人脸等区域。H的取值范围为[0,360],8位图像内每个像素点所能表示的灰度级有256个,所以在8位图像内表示HSV图像,需要把色调的角度值映射到[0,255]之间,以适应8位二进制。原始色调值映射后的色调值对应的颜色00红色6030黄色12060绿色18090青色240120蓝色300150品红色表2.12色调值、映射值及对应的颜色饱和度S饱和度的值是[0,1]之间。灰度图的饱和度是0,相当于一种及不饱和的颜色。作为灰度图像显示时,较亮区域对应的颜色具有较高的饱和度,如果颜色的饱和度很低,那么计算所得的色调就不可靠。为了适应8位图的256个像素级,需要将新色彩空间的数值映射到0-255范围内,同样需要将饱和度S的0-1映射到0-255范围。亮度V亮度的范围同饱和度一样是0-1之间,也需要映射到0-255之间,亮度越大图像越亮,亮度为0时,图像是纯黑色。在从RGB/BGR色彩空间转换到HSV色彩空间时,OpenCV为了满足8位图的要求,对HSV进行自动映射处理。因此在实际色彩空间转换时,无需再进行值的映射操作。HSV色彩空间案例importcv2importnumpyasnp#=========查看蓝色的HSV模式值=============Blue=np.zeros([1,1,3],dtype=np.uint8)#生成1行1列3通道图像Blue[0,0,0]=255#将第0行0列的第0通道设置为255,即B通道设置为255,为蓝色BlueHSV=cv2.cvtColor(Blue,cv2.COLOR_BGR2HSV)#从BGR空间转换到HSV空间print("Blue=\n",Blue)print("BlueHSV=\n",BlueHSV)【例2.14bgr_to_hsv.py】随机生成一个BGR三通道图像,将其转换到HSV色彩空间,并查看其像素值。HSV色彩空间案例#=========查看绿色的HSV模式值=============Green=np.zeros([1,1,3],dtype=np.uint8)#生成1行1列3通道图像Green[0,0,1]=255#将第0行0列的第0通道设置为255,即G通道设置为255,为绿色GreenHSV=cv2.cvtColor(Green,cv2.COLOR_BGR2HSV)#从BGR空间转换到HSV空间print("Green=\n",Green)print("GreenHSV=\n",GreenHSV)#=========查看红色的HSV模式值=============Red=np.zeros([1,1,3],dtype=np.uint8)#生成1行1列3通道图像Red[0,0,2]=255#将第0行0列的第2通道设置为255,即R通道设置为255,为红色RedHSV=cv2.cvtColor(Red,cv2.COLOR_BGR2HSV)print("Red=\n",Red)print("RedHSV=\n",RedHSV)色彩空间案例Blue=[[[25500]]]BlueHSV=[[[120255255]]]Green=[[[02550]]]GreenHSV=[[[60255255]]]Red=[[[00255]]]RedHSV=[[[0255255]]]结果解析:蓝色在BGR色彩空间中,像素值是(255,0,0),即B值为255,G和R值均为0,在HSV模式下,H值为120;绿色在BGR色彩空间中,像素值是(0,255,0),即B值为0,G值为255,R值均为0,在HSV模式下,H值为60;红色在BGR色彩空间中,像素值是(0,0,255),即B值、G值均为0为0,R值均为255,在HSV模式下,H值为0,与色卡所列完全相符。标记特定颜色区域

在HSV色彩空间中,H主要用于标记颜色,就是说颜色的差异主要体现在H通道上。通过对H通道进行筛选,能够筛选出颜色特定的颜色。OpenCV通过函数cv2.inRange()函数来判定图像内像素点的像素值是否在指定的范围内,锁定特定值,其语法格式为:

dst=cv2.inRange(src,lowerb,upperb)dst:表示输出结果,大小和src一致src:表示要检查的数组或者图像lowerb:表示范围下界upperb:表示范围上界HSV色彩空间案例importcv2importnumpyasnpimg=np.random.randint(0,256,size=[3,3],dtype=np.uint8)min=100max=200mask=cv2.inRange(img,min,max)result=cv2.bitwise_and(img,mask)print("img=\n",img)print("mask=\n",mask)print(“result=\n”,result)【例2.15inrange.py】使用函数cv2.inRange()将某个图像内的[0,100]内的值标记出来。HSV色彩空间案例img=[[180

16587][18195130][113757]]mask=[[2552550][0255255][25500]]result=[[1801650][0195130][11300]]语句mask=cv2.inRange(img,min,max),将img中像素范围在0-100之间的位置设置为255,其余位置设置为0,根据按位与操作的运算规则,将mask与img按位与操作后,mask像素值为255位置对应的img值保持不变,mask像素值为0位置对应的img值变为0,从而将我们关注的颜色保留,其余位置颜色均变为0。HSV色彩空间案例#引入需要的库importnumpyasnpimportcv2#读取并显示图像img_path='image//flower.jpg'img=cv2.imread(img_path)cv2.imshow("flag",img)【例2.16inrange_flower.py】使用HSV色彩空间的特性,将flower.jpg中绿叶、红花部分分别提取出来。HSV色彩空间案例#提取红色部分img_hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)#BGR色彩空间转换为HSV色彩空间red_low=np.array([0,43,46])#标记红色的最低H、S、V值red_high=np.array([10,255,255])#标记红色的最高H、S、V值#匹配红色方块区域范围,即红色区域均设置为255img_mask=cv2.inRange(img_hsv,red_low,red_high)img_red=cv2.bitwise_and(img,img,mask=img_mask)#利用遮罩分割红色方块区域cv2.imshow("red",img_red)HSV色彩空间案例#提取绿色部分img_hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)#颜色空间BGR转换为HSVgreen_low=np.array([35,43,46])#标记绿色的最低H、S、V值green_high=np.array([77,255,255])#标记绿色的最高H、S、V值#匹配绿色方块区域范围,即绿色区域均设置为255img_mask=cv2.inRange(img_hsv,green_low,green_high)img_green=cv2.bitwise_and(img,img,mask=img_mask)#利用遮罩分割绿色方块区域cv2.imshow("green",img_green)cv2.waitKey()cv2.destroyAllWindows()HSV色彩空间案例(a)

(b)

(c)图(a)是原始图像,图(b)是提取的红花图像,图(C)是提取的绿叶图像.。谢谢!任务实施任务实施

某加密技术人员需要对多幅仅包含红、黄、蓝颜色的涉密图像通过分解后分别进行加密保存并传输,待加密图像存放在pic文件加下,为确保图像的安全,请将分解并加密的的图像分别按原图像名称加编号后保存到当前目录的encry文件夹下。任务步骤(1)读取要加密的图像。(2)将图像从BGR空间转换为HSV空间,以便进行后续的色彩处理。(3)利用遮罩方式分别获取图像中的红色、黄色、蓝色,并保存到临时目录temp_path中。(4)对拆分后的各个图像分别进行加密,保存到encry文件夹下。项目代码importcv2importosimportrandomimportnumpyasnp#设置基本路径img_path='pic'#原始图像路径result_path='encry'#存放结果图像路径temp_path="temp"#临时路径ifnotos.path.exists(result_path):#创建结果存放路径os.makedirs(result_path)ifnotos.path.exists(temp_path):#如果临时路径不存在,则创建os.makedirs(temp_path)项目代码#定义按颜色拆分图像的函数get_color()函数,定义加密函数encry_img()。

defget_color(img):#定义按颜色拆分图像的函数#提取红色img_hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)#BGR色彩空间转换为HSVred_low=np.array([0,43,46])#标记红色的最低H、S、V值red_high=np.array([10,255,255])#标记红色的最高H、S、V值#匹配红色方块区域范围,即红色区域均设置为255mask_red=cv2.inRange(img_hsv,red_low,red_high)img_red=cv2.bitwise_and(img,img,mask=mask_red)#利用遮罩分割红色 cv2.imwrite(os.path.join(temp_path,"red"+'.jpg'),img_red)#保存到临时路径项目代码#提取黄色

yellow_low=np.array([26,43,46])#标记黄色的最低H、S、V值yellow_high=np.array([34,255,255])#标记黄色的最高H、S、V值mask_yellow=cv2.inRange(img_hsv,yellow_low,yellow_high)#黄色区域均设置为255img_yellow=cv2.bitwise_and(img,img,mask=mask_yellow)#利用遮罩分割黄色区域cv2.imwrite(os.path.join(temp_path,"yellow"+'.jpg'),img_yellow)#提取蓝色

blue_low=np.array([78,43,46])#标记蓝色的最低H、S、V值blue_high=np.array([124,255,255])#标记蓝色的最高H、S、V值mask_blue=cv2.inRange(img_hsv,blue_low,blue_high)#匹配蓝色区域范围img_blue=cv2.bitwise_and(img,img,mask=mask_blue)#利用遮罩分割蓝色区域cv2.imwrite(os.path.join(temp_path,"blue"+'.jpg'),img_blue)print("图像拆分完毕!")项目代码defencry_img(img):#定义加密函数key=np.random.randint(0,255,img.shape,dtype=np.uint8)#随机生成密钥encry=cv2.bitwise_xor(img,key)#图像加密returnencry#实现图像拆分及加密img_list=os.listdir(img_path)#获取原始图像列表print("img_list=",img_list)#查看有多少个原始图像count=0#定义计数器,记录处理到第几个图像项目代码

forimginimg_list:#循环读取每一个图像 img_name,img_ext=img.split('.')#分别获取图像名字和后缀image_path=os.path.join(img_path,img)#将图像路径与名字连接 image=cv2.imread(image_path,1)#读取图像 count=count+1#计数器加1 get_color(image)#调用拆分函数分别获取不同颜色的色块 color_list=os.listdir(temp_path)#获取拆分后的图像列表

项目代码fori,color_imginenumerate(color_list):#循环读取拆分后的每个图像进行加密运算color_img=os.path.join(temp_path,color_img)#将图像路径与名字连接 color_img=cv2.imread(color_img,1)#以BGR模式读取 cv2.imshow("color_img",color_img) image_encry=encry_img(color_img)#调用加密函数对图像进行加密 cv2.imwrite(os.path.join(result_path,img_name+str(i)+'.jpg'),image_encry) print("处理完第{}张图像".format(count))ifos.path.isfile(temp_path):#删除临时目录os.remove(temp_path)print("所有图像均处理完成,请到{}目录下查看加密图像,{}目录下查看拆分后的图像!".format(result_path,temp_path))项目代码

如图所示,第一行为拆分颜色后的图像,第二行为加密后的图像。运行程序后可到temp文件夹中查看分别提取的各颜色图片,到encry文件夹中查看加密后的图片,可见加密后的图片完全无法看到图像的原本信息。谢谢!任务拓展1.位平面分解图将灰度图像中处于同一比特位上的二进制像素值进行组合,得到一幅二进制图像,该图像被称为灰度图像的一个位平面,这个过程称位平面分解,例如,将一幅灰度图像内所有像素点上处于二进制位内最低位上的值进行组合,可以构成“最低有效位”位平面。在8位灰度图中,每一个像素使用8位二进制,范围在0-255之间。可以将其中的值表示为:value=a7*27+a6*26+a5*25+a4*24+a3*23+a2*22+a1*21+a0*20a7权重最高,与原图最相似。相当于十进制如下公式:78956782=7*107+8*106+9*105+5*104+6*103+7*102+8*101+2*1001.位平面分解图图2.10为图的像素矩阵,图2.11为图像的像素值转换为二进制后的矩阵:图2.10图的像素矩阵100120140112604567872501604359991404225548901802345688987934图2.11图像的像素值转换为二进制后的矩阵011001000111100010001100011100000011110000101101010000110101011111111010101000000010101100111011011000111000110010100000111111110011000001011010101101001110101000111000010110000110001001001111001000101.位平面分解图图2.10为图的像素矩阵,图2.11为图像的像素值转换为二进制后的矩阵:图2.10图的像素矩阵100120140112604567872501604359991404225548901802345688987934图2.11图像的像素值转换为二进制后的矩阵011001000111100010001100011100000011110000101101010000110101011111111010101000000010101100111011011000111000110010100000111111110011000001011010101101001110101000111000010110000110001001001111001000101.位平面分解图图2.10为图的像素矩阵,图2.11为图像的像素值转换为二进制后的矩阵:图2.10图的像素矩阵100120140112604567872501604359991404225548901802345688987934图2.11图像的像素值转换为二进制后的矩阵011001000111100010001100011100000011110000101101010000110101011111111010101000000010101100111011011000111000110010100000111111110011000001011010101101001110101000111000010110000110001001001111001000101.位平面分解图图2.10为图的像素矩阵,图2.11为图像的像素值转换为二进制后的矩阵:图2.10图的像素矩阵100120140112604567872501604359991404225548901802345688987934图2.11图像的像素值转换为二进制后的矩阵011001000111100010001100011100000011110000101101010000110101011111111010101000000010101100111011011000111000110010100000111111110011000001011010101101001110101000111000010110000110001001001111001000101.位平面分解图将所有像素的第i位各自进行组合,得到位平面分解图,如图所示,(a)位最高位位平面分解图,(h)为是最低位位平面分解图。(a)a7

位平面分解图0010000011000111001100000(b)a6位平面分解图

1101001110001001010101110

(C)a5

位平面分解图1101110011111011101110101(d)a4位平面分解图0101100110010001111011000(g)a1位平面分解图

0000001110111001010100111(e)a3位平面分解图

0110110010110101010111010(f)a2位平面分解图1010110100000101001000010(g)a0位平面分解图

00000111001110010000000101.1位平面分解图的分解步骤(1)图像预处理读取原始图像img,获取原始图像的宽度M和高度N。(2)构造提取矩阵使用按位与操作能够方便的将一个数值指定位置上的数字提取出来,分别使用不同的提取因子F提取数值N中的特定位,可以发现,提取因子F上哪位值为1,就可以提取数值N中哪位上的数字,如表2.13所示。说明第0位第2位第4位第6位数值XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX提取因子00000001000001000001000001000000结果0000000X00000X00000X00000X000000表2.13:提取不同位置值的提取因子1.1位平面分解图的分解步骤(1)图像预处理读取原始图像img,获取原始图像的宽度M和高度N。(2)构造提取矩阵使用按位与操作能够方便的将一个数值指定位置上的数字提取出来,分别使用不同的提取因子F提取数值N中的特定位,可以发现,提取因子F上哪位值为1,就可以提取数值N中哪位上的数字,如表2.13所示。说明第0位第2位第4位第6位数值XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX提取因子00000001000001000001000001000000结果0000000X00000X00000X00000X000000表2.13:提取不同位置值的提取因子1.1位平面分解图的分解步骤(1)图像预处理读取原始图像img,获取原始图像的宽度M和高度N。(2)构造提取矩阵使用按位与操作能够方便的将一个数值指定位置上的数字提取出来,分别使用不同的提取因子F提取数值N中的特定位,可以发现,提取因子F上哪位值为1,就可以提取数值N中哪位上的数字,如表2.13所示。说明第0位第2位第4位第6位数值XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX提取因子00000001000001000001000001000000结果0000000X00000X00000X00000X000000表2.13:提取不同位置值的提取因子

由表2.13可知,要提取哪个位的值,只需将该位的值设为1,其余位的值设置为0即可,即提取第n位的值,提取因子的值为2n,因此我们可以建立提取矩阵,用来与原始图像进行按位与操作,以提取第n个位平面

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论