vhdl期末设计图像LSB嵌入与检测.docx

上传人:b****8 文档编号:28700316 上传时间:2023-07-19 格式:DOCX 页数:17 大小:216.66KB
下载 相关 举报
vhdl期末设计图像LSB嵌入与检测.docx_第1页
第1页 / 共17页
vhdl期末设计图像LSB嵌入与检测.docx_第2页
第2页 / 共17页
vhdl期末设计图像LSB嵌入与检测.docx_第3页
第3页 / 共17页
vhdl期末设计图像LSB嵌入与检测.docx_第4页
第4页 / 共17页
vhdl期末设计图像LSB嵌入与检测.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

vhdl期末设计图像LSB嵌入与检测.docx

《vhdl期末设计图像LSB嵌入与检测.docx》由会员分享,可在线阅读,更多相关《vhdl期末设计图像LSB嵌入与检测.docx(17页珍藏版)》请在冰豆网上搜索。

vhdl期末设计图像LSB嵌入与检测.docx

vhdl期末设计图像LSB嵌入与检测

 

VHDL课程设计

 

题目:

图像LSB嵌入与检测

学院(系):

学号:

学生姓名:

 

一、设计功能和要求

设计要求:

用vhdl语言设计一个图像处理系统,可完成以下功能:

1.嵌入功能:

可将一幅256x256的彩色图像转为8位灰度图像,然后在该灰度图像的LSB比特面随机嵌入三个不同的二值序列;最后,将嵌入水印序列的灰度图像恢复为彩色图像。

2.检测功能:

输入任意彩色图像,可从对应灰度图像的LSB平面检测上述三个序列。

3.三个序列为

序列1:

01101

序列2:

10101

序列3:

11001

4.输入端口包括三个坐标值信号,分别作为三个序列嵌入的起始位置。

5.建立序列检测状态机,实现图像中三个序列的检测。

设计功能:

一幅彩色图分成许多的像素,每个像素用若干个二进制位来指定该像素的颜色、亮度和属性。

因此一幅图由许多描述每个像素的数据组成,这些数据通常称为图像数据。

将彩色图像转为8位灰度图像后,每个像素存放在一个byte空间(8位,0-255:

0表示最暗色,255表示最亮色)。

8位灰度图像可以看成是一系列1位“位平面”的叠加。

该设计的水印算法是将信息嵌入到随机选择的图像点中最不重要的像素(LSB:

leastsignificantbits)上。

例如:

00100110和00100111代表了两个不同渐变度的红色,但是就人眼是分辨不出来的。

最低有效位LSB算法,就是利用这一点,达到图像加密解密、压缩,或者数字水印的功能。

设计要求中,将灰度图像的LSB比特面随机嵌入三个不同的二值序列,可由用户端口输入3个坐标值,将指定的LSB面序列进行替换,再恢复成彩色图像,并完成序列的检测。

二、设计思路

根据设计功能和要求,设计步骤如下:

1.首先,我们需要选择符合设计要求的256x256的彩色图像,并将其转换成我们可以处理的RGB信息,并保存在pic.coe文件中。

2.在ise中,使用IP内核建一个rom文件,通过寻址的方式,输入保存图片信息的文件数据。

3.对RGB文件进行处理,并利用从RGB色转为灰度色的算法 

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

将256x256的彩色图像数据转为8位灰度图像数据。

4.对8位灰度图像数据进行处理,找出此图像的LSB平面,即8bit灰度图像的每个像素的最低位比特。

5.嵌入功能:

用指定的序列替代图像中原来的比特序列。

其中,我们需要的信息有3个需要嵌入的比特信息的位置,即3个坐标值。

三个指定序列为:

序列1:

01101

序列2:

10101

序列3:

11001

6.检测功能:

建立序列状态转换机,从对应灰度图像的LSB平面检测上述三个序列并返回标志位。

7.利用算法,将灰度图像数据恢复为RGB数据。

根据设计步骤,规划整个设计的模块组成如下:

获取ROM地址模块(ROM_addr)

读取ROM数据模块(pic_Rom)

彩色转灰度模块(grbtogray)

嵌入模块(insert)

灰度转彩色模块(graytogrb)

检测模块(detector)

三、原理图说明

图1设计原理框图

四、设计过程与子模块设计说明

1.顶层模块

输入信号:

clk(时钟信号),reset(复位信号)

输出信号:

pic_Out(24个2进制位),pic_Impus(输出显示脉冲),

pic_Out_ena(输出使能端)

顶层模块共包括获取ROM地址模块、ROM模块、彩色转灰度模块、嵌入模块、灰度转彩色模块和检测模块并提供3个需要嵌入序列的坐标值。

2.在ISE中创建ROM

步骤一:

首先我们需要使用MATLAB软件读入图片,将其转换成符合设计要求的RGB数据文件。

图2图像的数据矩阵

由上图可知,MATLAB文件生成的RGB数据文件是8位256*256*3的数据。

RGB是red、green和blue的缩写,即val(:

,:

,1)代表红色的分量信息,val(:

,:

,2)代表绿色的分量信息,val(:

,:

,3)代表蓝色的分量信息。

难点部分:

由于设计目的是将其导入ISE的ROM中,为了设计方便,我们需要将此RGB数据重新排列。

将每个像素点的红绿蓝信息组合起来,形成65536*1的矩阵,矩阵中的每个元素是24位数据。

即数据格式如下图所示:

图3图像数据矩阵的数据格式

具体matlab程序如下:

clc

clearall

imdata=imread('C:

\ProgramFiles\MATLAB\R2011a\Life-Mushroom.png');

data_GRB=zeros(256,256);

imdata_int=im2double(imdata);

imdata_int=round(imdata_int*255);

fori=1:

256

forj=1:

256data_GRB(i,j)=imdata_int(i,j,1)*256*256+imdata_int(i,j,2)*256+imdata_int(i,j,3);

end

end

data_GRB=reshape(data_GRB',256*256,1);

步骤二:

生成.coe文件

COE文件的作用,是生成IP核工程的时候,将其文件中的内容导入,生成MIF文件。

设计时应注意:

coe文件起始两行应为:

MEMORY_INITIALIZATION_RADIX=10;

MEMORY_INITIALIZATION_VECTOR=

coe文件最后以分号结尾。

步骤三:

将coe文件加载到BLOCKROM所生成的ROM中。

由于数据大小为65536*1,因此分配16位地址总线,输出数据格式为24个二进制位,分配使能端和时钟端。

即ROM配置为:

容量:

65536*24

地址线:

ADDRA[0]~ADDRA[15]

24位数据输出线DOUTA[0]~DOUTA[23]:

输出数据。

具体配置如下图所示:

图4ROM图示

图5ROM配置图示

3.彩色转灰度转模块

输入信号:

clk,resetrgb_ena,rgb_start

rgb_data(需要转换的彩色图像RGB数据)

输出信号:

gray_start,gray_ena

gray_data(转换后的灰度图像数据)

在vhdl语言中,虽然提供了加、减、乘、除的算法指令,但除法中除数必须是2的指数形式,无法实现除数为任意数的除法。

因此,在运用灰度转换公式

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

时,我们使用数据近似进行截位运算。

 

其中灰度转换的相关代码如下:

architectureBehavioralofgrbtograyis

signals1:

STD_LOGIC:

='0';--右移一位,代表除以2

signals2:

STD_LOGIC_VECTOR(1downto0):

="00";--右移2位,代表除以4

signals3:

STD_LOGIC_VECTOR(2downto0):

="000";--右移3位,代表除以8

signals4:

STD_LOGIC_VECTOR(3downto0):

="0000";--右移4位,代表除以16

signals5:

STD_LOGIC_VECTOR(4downto0):

="00000";--右移5位,代表除以32

signals6:

STD_LOGIC_VECTOR(5downto0):

="000000";--右移6位,代表除以64

begin

process(clk,reset)

begin

if(reset='0')then

gray_data<="00000000";

elsif(clk'eventandclk='1'andrgb_ena='1')then

gray_data<=

conv_std_logic_vector(conv_integer(s2&rgb_data(23downto18))

+conv_integer(s5&rgb_data(23downto21))

+conv_integer(s6&rgb_data(23downto22))

+conv_integer(s1&rgb_data(15downto9))

+conv_integer(s4&rgb_data(15downto12))

+conv_integer(s5&rgb_data(15downto13))

+conv_integer(s4&rgb_data(8downto5))

+conv_integer(s5&rgb_data(8downto6))

+conv_integer(s6&rgb_data(8downto7)),8);

endif;

endprocess;

难点部分:

出现问题:

开始在进行数据运算时,使用STD_LOGIC_VECTOR的格式进行运算,仿真时总是出错,得不到正确结果。

问题解决:

经过查找资料,vhdl语言在进行运算时必须是整型格式,因此必须使用conv_integer将其改成整型,在以后使用时需要注意。

 

4.嵌入模块

输入信号:

clk,reset,gray_start,gray_ena

gray_data(需要嵌入的灰度数值)

p1_addr(第1个序列需要嵌入的位置)

p2_addr(第2个序列需要嵌入的位置)

p3_addr(第3个序列需要嵌入的位置)

输出信号:

insert_start,insert_ena

insert_data(嵌入之后的灰度数据)

嵌入模块中,p1_addr、p2_addr、p3_addr分别为从顶层模块传递的嵌入序列的坐标,格式为16个2进制位数,其中前8位代表行坐标,后8位代表列坐标,即将行列坐标合成整体。

由于原始数据是65536*1格式,所以在读数据行列坐标时,需要进行转换,转换思想为:

每读256个数据,行坐标加1,当行坐标为255时(行坐标的取值范围是0~255),列坐标加1.

嵌入时,设计使用3个计数器,初始值为5,分别对应3个序列,当前数据坐标与p1_addr、p2_addr、p3_addr中的一个相等时,相应的计数器改为由1开始计数到5结束,用序列的5个2进制位替代灰度的LSB面,此时嵌入成功。

5.检测模块

输入信号:

clk,reset,seq_ena

seq_In(需要检测的数据,即灰度数据的LSB位)

输出信号:

seq1_out(检测出序列1标志位)

seq2_out(检测出序列2标志位)

seq3_out(检测出序列3标志位)

检测功能设计要求为可从对应灰度图像的LSB平面检测上述三个序列。

三个序列为:

序列1:

01101,序列2:

10101,序列3:

11001。

设计包括3个状态机:

检测序列1的状态机state1包括:

a0,a1,a2,a3,a4,a5这6个状态;

检测序列2的状态机state2包括:

b0,b1,b2,b3,b4,b5这6个状态;

检测序列3的状态机state3包括:

c0,c1,c2,c3,c4,c5这6个状态。

检测序列的3个状态转移图如下图所示:

 

图6检测序列状态转移图

6.灰度转彩色模块

输入信号:

clk,reset,insert_start,insert_ena

insert_data(嵌入后的需要转换为彩色的数据)

输出信号:

col_start,col_ena

col_data:

(转换后的彩色数据)

一般彩色图像至少需要三个维度的信息,比如RGB、HSV、YIQ等等。

每种颜色相当于一个三维向量,不同的表示法则相当于同一个向量在不同的坐标轴下(即不同的基下)的表示。

而将其变为灰度后,只剩下一个维度,相当于将三维向量投影为一维标量一样,是不可能回复为原来的向量的。

由于将彩色图像转换为灰度图像是一个不可逆的过程,灰度图像也不可能变换为原来的彩色图像。

设计中需要将灰度图像转变为彩色图像只能采用伪彩色。

伪彩色处理主要是把黑白的灰度图像或者多波段图像转换为彩色图像的技术过程。

因此我们采用映射方法将灰度图像转化为彩色图像。

具体算法表述如下:

情况1:

若灰度像素点0≤X≤64,则对应R=0;G=4*X;B=255;

情况2:

若灰度像素点64

情况3:

若灰度像素点128

情况4:

若灰度像素点192

五、仿真结果及分析

1.顶层模块,即系统设计模块波形图如下:

图7顶层模块仿真结果

结果分析:

由上图可知,时钟周期clk为10ns,提供设计的总时钟。

复位信号reset在100ns后转为高电平,高电平有效。

2.获取ROM地址模块波形仿真如下:

图8获取ROM地址模块仿真结果

结果分析:

在复位信号有效时,可以获取数据的16个2进制位的地址。

3.彩色转灰度模块波形如下:

图9彩色转灰度模块仿真结果

结果分析:

由上图可以看出,在使能端和复位信号有效时,24个2进制位rgb_data数据转换为8个二进制数据gray_data.

结果验证:

将rgb_data数据分段分别表示为r分量、g分量和b分量,随机选取一组数据,r=4,g=90,b=199,带入公式

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

中计算可得Gray=4*0.299+90*0.587+199*0.144=76.712≈76

由于程序时延,在下一个时钟,可以看到gray_data=76,说明彩色RGB数据转换成灰度数据成功。

4.嵌入模块仿真波形如下:

图10嵌入模块仿真结果

结果分析:

由上图所示,当前数据地址与输入坐标值p3_addr相等,counter3不再显示101,即counter3由1开始计数,对比gray_data和insert_data可以看出,gray_data的最后一位即最低位被替换成了序列3:

11011,即嵌入成功。

5.检测模块仿真波形如下:

图11检测模块仿真结果

结果分析:

由上图所示,当前显示下seq1_out1和seq1_out3均有跳变成高电平。

观察输入信号seq_in,当输入数据为01101时,在下一个时钟下降沿,状态机a进入a5状态,seq1_out1输出为1.

当输入数据为10101时,在下一个时钟下降沿,状态机b进入b5状态,seq1_out2输出为1即序列检测成功。

6.灰度转彩色模块仿真波形如下:

图12灰度转彩色模块仿真结果

结果分析:

由上图所示,insert_data[7:

0]是嵌入后的灰度数据,恢复后的彩色数据是col_data[23:

0],将col_data[23:

0]分段列出r分量、g分量和b分量。

结果验证:

情况1:

若灰度像素点0≤X≤64,则对应R=0;G=4*X;B=255;

情况2:

若灰度像素点64

情况3:

若灰度像素点128

情况4:

若灰度像素点192

由上图得出数据:

(1)当灰度像素点insert_data[7:

0]=247时,属于上述情况4,R=255,G=-4*247+1024=36,B=0,结果正确。

(2)当灰度像素点insert_data[7:

0]=60时,属于上述情况1,R=0,G=4*60=240,B=255,结果正确。

(3)当灰度像素点insert_data[7:

0]=121时,属于上述情况2,R=0,G=255,B=-4*121+511=27,结果正确。

将恢复后的彩色RGB数据读到matlab中,显示出原彩色图和恢复后的伪彩色图,如下图所示。

从图片上可以看出,虽然恢复后的伪彩色图与原始图片有所变化,但还是可以出现基本形状和大致轮廓。

图13原图像与伪彩色图像对比

六、改进与提高

难点部分:

为了解决灰度转彩色模块中,只能将灰度图像恢复成伪彩色图像的问题,思考是因为在处理彩色图像RGB数据时,只保留了灰度分量数据,没有存储其他分量的数据。

解决问题:

在彩色转灰度模块中,可以将RGB空间转换为YUV空间,在YUV空间中,每一个颜色有一个亮度信号Y,和两个色度信号U和V。

其中亮度信号Y就是需要的灰度,但同时也保留了色度信号U和V,以便于恢复彩色图像时使用。

RGB空间转YUV空间公式如下:

 

这样在灰度转彩色模块中,可以直接将嵌入的灰度数据分量即Y和保留的U和V利用公式转换成RGB数据,即完成灰度图像恢复成彩色图像。

YUV空间转RGB空间公式如下:

 

相应的部分VHDL程序如下:

architectureBehavioralofgrbtograyis

signals1:

STD_LOGIC:

='0';--右移一位,代表除以2

signals2:

STD_LOGIC_VECTOR(1downto0):

="00";--右移2位,代表除以4

signals3:

STD_LOGIC_VECTOR(2downto0):

="000";--右移3位,代表除以8

signals4:

STD_LOGIC_VECTOR(3downto0):

="0000";--右移4位,代表除以16

signals5:

STD_LOGIC_VECTOR(4downto0):

="00000";--右移5位,代表除以32

signals6:

STD_LOGIC_VECTOR(5downto0):

="000000";--右移6位,代表除以64

begin

process(clk,rst)

begin

if(rst='0')then

gray_data<="00000000";

u_data<="00000000";

v_data<="00000000";

elsif(clk'eventandclk='1'andrgb_ena='1')then

gray_data<=s2&rgb_data(23downto18)+s5&rgb_data(23downto21)+s6&rgb_data(23downto22)+s1&rgb_data(15downto9)+s4&rgb_data(15downto12)+s5&rgb_data(15downto13)+s4&rgb_data(8downto5)+s5&rgb_data(8downto6)+s6&rgb_data(8downto7);

u_data<=-s3&rgb_data(23downto19)-s6&rgb_data(23downto22)-s2&rgb_data(15downto10)-s5&rgb_data(15downto13)+s2&rgb_data(7downto2)+s3&rgb_data(7downto3)+s4&rgb_data(7downto4);

v_data<=s1&rgb_data(23downto17)+s3&rgb_data(23downto19)-s1&rgb_data(15downto9)-s6&rgb_data(15downto14)-s4&rgb_data(7downto4)-s5&rgb_data(7downto5)-s6&rgb_data(7downto6);

endif;

endprocess;

仿真结果:

将改进程序后的RGB数据导入到matlab中,显示出恢复后的图片信息。

结果如下:

图14原图像与恢复后的图像对比

 

由上图可以看出,恢复出的彩色图片与原图片大体一致,达到了预想效果,可以进一步完成加密等功能。

七、源代码设计

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 互联网

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1