精华内容
下载资源
问答
  • 图像信息隐藏

    千次阅读 2015-07-17 10:17:53
     本篇介绍和讲解如何在图像隐藏一些信息。 具体实现 基本流程  一共分为两部分:第一部分是生成隐藏的加密图像,另一部分是对加密图像解密,显示出被隐藏信息。 生成加密图像 具体代码 ? 1 2 ...

    简介

      本篇介绍和讲解如何在图像中隐藏一些信息。
    

    具体实现

    基本流程

      一共分为两部分:第一部分是生成隐藏的加密图像,另一部分是对加密图像解密,显示出被隐藏的信息。
    

    生成加密图像

    具体代码

    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <math.h>
    #include <string.h>
    #include <opencv/cv.h>
    #include <stdio.h>
     
    using namespace cv;
     
    char normalpicName[20];
    Mat mat1, mat2;
    int normalWidth, normalHeight;
    IplImage src1, src2;
    CvScalar s1, s2;
     
    void initPic(){
    	int i, j;
     
    	mat1 = imread(normalpicName);
    	src1 = mat1;
    	mat2 = imread(normalpicName);
    	src2 = mat2;
    	normalWidth = mat1.rows;
    	normalHeight = mat1.cols;
     
    	for(i=0; i< normalWidth; i++){
    		for(j=0; j<normalHeight; j++){
    			s1 = cvGet2D(&src1, i, j);
    			s2 = cvGet2D(&src2, i, j);
    			if(((int)s1.val[0])%2 != 0){
    				s1.val[0] = s1.val[0] -1;
    				cvSet2D(&src1, i, j, s1);
    			}
    			if(s2.val[0] == 255){
    				s2.val[0] = s2.val[0] -1;
    				cvSet2D(&src2, i, j, s2);
    			}
    		}   
    	}
    	imshow("mat1", mat1);
    }
     
    void writeWord(){
    	putText(mat2, "yulinghan", Point(100, 100), FONT_HERSHEY_PLAIN, 3.0, CV_RGB(100,100,255), 2);
    	putText(mat2, "The World!", Point(100, 300), FONT_HERSHEY_PLAIN, 3.0, CV_RGB(100,100,255), 2);
    	imshow("mat2", mat2);
    }
     
    void setPic(){
    	int i, j;
     
    	for(i=0; i< normalWidth; i++){
    		for(j=0; j<normalHeight; j++){
    			s1 = cvGet2D(&src1, i, j);
    			s2 = cvGet2D(&src2, i, j);
    			if(s2.val[0] == 255){
    				s1.val[0] = s1.val[0] + 1;
    				cvSet2D(&src1, i, j, s1);
    			}
    		}   
    	}
    	imshow("new", mat1);
    }
     
    int main(int argc, char *argv[]){
    	vector<int> compression_params;
     
    	if(argc < 2){
    		printf("Please input first and second picture!\n");
    		return -1;	
    	}
    	memcpy(normalpicName, argv[1], sizeof(argv[1]));
    	initPic();
    	writeWord();
    	setPic();
    	imwrite("new.png", mat1);
    	cv::waitKey(0);
    	return 0;
    }

    代码讲解

      1、初始化图片,首先首先将源图片分别打开到mat1和mat2中,接着遍历图片元素,将mat1中蓝色分量像素全部设置为偶数,
    将mat2中,蓝色分量为255的元素,全部改变为254。
    
    void initPic(){
    	int i, j;
     
    	mat1 = imread(normalpicName);
    	src1 = mat1;
    	mat2 = imread(normalpicName);
    	src2 = mat2;
    	normalWidth = mat1.rows;
    	normalHeight = mat1.cols;
     
    	for(i=0; i< normalWidth; i++){
    		for(j=0; j<normalHeight; j++){
    			s1 = cvGet2D(&src1, i, j);
    			s2 = cvGet2D(&src2, i, j);
    			if(((int)s1.val[0])%2 != 0){
    				s1.val[0] = s1.val[0] -1;
    				cvSet2D(&src1, i, j, s1);
    			}
    			if(s2.val[0] == 255){
    				s2.val[0] = s2.val[0] -1;
    				cvSet2D(&src2, i, j, s2);
    			}
    		}   
    	}
    	imshow("mat1", mat1);
    }
      2、写入需要隐藏的信息,往mat2中写入了字符:"yulinghan","The World!"。对应的字符颜色为CV_RGB(100,100,255)。注意:这个时候在mat2中,
    就只有这些字符的颜色,蓝色分量才能达到255。
    
    void writeWord(){
    	putText(mat2, "yulinghan", Point(100, 100), FONT_HERSHEY_PLAIN, 3.0, CV_RGB(100,100,255), 2);
    	putText(mat2, "The World!", Point(100, 300), FONT_HERSHEY_PLAIN, 3.0, CV_RGB(100,100,255), 2);
    	imshow("mat2", mat2);
    }
      3、进行隐藏、加密操作。遍历mat2,找到所有它蓝色分量为255的元素,然后将mat1上,同样对应位置的蓝色分量由偶数改为奇数。注意:最后被隐藏
    的信息位置,就是mat1上对应蓝色分量为奇数的信息位置。
    
    void setPic(){
    	int i, j;
     
    	for(i=0; i< normalWidth; i++){
    		for(j=0; j<normalHeight; j++){
    			s1 = cvGet2D(&src1, i, j);
    			s2 = cvGet2D(&src2, i, j);
    			if(s2.val[0] == 255){
    				s1.val[0] = s1.val[0] + 1;
    				cvSet2D(&src1, i, j, s1);
    			}
    		}   
    	}
    	imshow("new", mat1);
    }
      4、main函数操作。首先初始化图片元素,接着将需要隐藏的文字信息,写入到mat2中,然后将信息加工隐藏到mat1上,最后将被加工后的mat1保存为
    new.png。(注意图片不能用imwrite保存为jpg格式,它会导致mat1中的图像元素发生细微变化,导致加密信息被破坏)。
    
    int main(int argc, char *argv[]){
    	vector<int> compression_params;
     
    	if(argc < 2){
    		printf("Please input first and second picture!\n");
    		return -1;	
    	}
    	memcpy(normalpicName, argv[1], sizeof(argv[1]));
    	initPic();
    	writeWord();
    	setPic();
    	imwrite("new.png", mat1);
    	cv::waitKey(0);
    	return 0;
    }

    结果显示

      原始的mat1图像:                             写入文字信息后的mat2图像:               
    

      

    被加密之后的mat1图像:

    解密显示信息

    具体代码

    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <math.h>
    #include <string.h>
    #include <opencv/cv.h>
    #include <stdio.h>
     
    using namespace cv;
     
    char normalpicName[20];
    Mat mat1;
    int normalWidth, normalHeight;
    IplImage src1;
    CvScalar s1;
     
    void getPicInfo(){
    	int i, j;
    	mat1 = imread(normalpicName);
    	src1 = mat1;
    	normalWidth = mat1.rows;
    	normalHeight = mat1.cols;
    	imshow("old", mat1);
     
    	for(i=0; i< normalWidth; i++){
    		for(j=0; j<normalHeight; j++){
    			s1 = cvGet2D(&src1, i, j);
    			if(((int)s1.val[0]) % 2 != 0){
    				s1.val[0] = 100;
    				s1.val[1] = 100;
    				s1.val[2] = 255;
    				cvSet2D(&src1, i, j, s1);
    			}
    		}   
    	}
    	imshow("new", mat1);
    }
    int main(int argc, char *argv[]){
    	if(argc < 2){
    		printf("Please input first and second picture!\n");
    		return -1;	
    	}
    	memcpy(normalpicName, argv[1], sizeof(argv[1]));
     
    	getPicInfo();
    	cv::waitKey(0);
    	return 0;
    }
      
    

    代码讲解

      1、解密显示图像:对应传入的图像就是之前保存的new.png图像,将它打开到mat1中,接着遍历该图片,将图像蓝色分量上所有是奇数的元素,颜色全都
    改为R(255)、G(100)、B(100)。最后将修改解密后图片显示出来。
    

    结果显示

                 解密前图像:                      解密后图像:
          
    展开全文
  • LSB图像信息隐藏

    2014-03-14 18:42:59
    本文件是关于LSB图像信息隐藏的MATLAB代码,希望能给大家的学习工作带来方便。
  • 图像信息隐藏与水印

    千次阅读 2014-02-06 20:48:54
    图像信息隐藏与数字水印领域研究最多和最早的一种载体,近年来,比较成熟的隐藏和水印算法都是基于图像载体。即:在时域隐藏方法:LSB图像信息隐藏,二值图像信息隐藏,其次,在变换域隐藏方法:DCT域图像水印。信息...
    图像信息隐藏与数字水印领域研究最多和最早的一种载体,近年来,比较成熟的隐藏和水印算法都是基于图像载体。即: 
    

    首先,在时域隐藏方法如下所示:

    其次,在变换域隐藏方法如下所示:

    • DCT域图像水印
    • 图像完全脆弱水印
    • 基本内容的半脆弱水印

    信息隐藏 (Information Hiding)主要由下述两部分组成 :(1 )信息嵌入算法 ,它利用密钥来实现秘密信息的隐藏 。 (2 )隐蔽信息检测 /提取算法 (检测器 ) ,它利用密钥从隐蔽载体中检测 /恢复出秘密信息 。在密钥未知的前提下 ,第三者很难从隐秘载体中得到或删除 ,甚至发现秘密信息 。

    后续将介绍上述相关图像信息隐藏算法,敬请关注!

    关于Computer Vision&Image Engineering更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.

    展开全文
  • 本文详细介绍了矩阵变换及其在图像信息隐藏中的应用原理。
  • 学号姓名 专业年级班级 实验室 组别 实验日期 课程名称 保密技术实验 实验课时 实验项目 同组者 名称 1.LSB 图像信息隐藏实验 姓 名 和序号 1. 掌握对图像的基本操作 2. 能够用 LSB 算法对图像进行信息隐藏 实验目的...
  • 实用 文案 学号姓名 专业年级班级 实验室 组别 实验日期 课程名称 保密技术实验 实验课时 实验项目名称 和序号 1.LSB图像信息隐藏实验 同组者 姓 名 实验目的 1. 掌握对图像的基本操作 2. 能够用 LSB 算法对图像进行...
  • 基于小波变换的索引图像信息隐藏算法,刘春庆,王执铨 ,信息隐藏是一种新兴的信息安全技术,索引图像是当前开发的信息隐藏软件所使用的一类主要隐秘载体。目前的索引图像信息隐藏算法都
  • 基于统计隐藏技术的数字图像信息隐藏研究,戴舒樽,,图像信息隐藏信息隐藏的一种特殊方式,它能够在实现信息隐藏的同时,实现对信息存在性的隐藏。 本文主要研究了基于统计隐藏技��
  • MATLAB实现的一个图像信息隐藏检测算法,可以检测jpeg图像隐藏的信息
  • 在整个介绍信息隐秘技术部分, 为了统一起见, 我们约定以下名词: 称需要隐秘的信息为秘密信息( secret) , 秘密信息隐藏的媒介叫做载体( cover) , 隐藏后的结果叫做隐蔽载体( stego-cover) 一、图...

    从本章开始, 我们将具体接触到许多数字信息的隐写术。为了与后面数字水印技术相区别, 我们也将隐写术称为信息隐秘技术。本章主要阐述图像信息作为秘密信息的隐藏, 即图像降级隐写。
    在整个介绍信息隐秘技术部分, 为了统一起见, 我们约定以下名词: 称需要隐秘的信息为秘密信息( secret) , 秘密信息隐藏的媒介叫做载体( cover) , 隐藏后的结果叫做隐蔽载体( stego-cover)
    一、图像降级
    主体对客体的读写一般应满足以下两个规则:
    规则 1: 主体只能向下读, 不能向上读。
    规则 2: 主体只能向上写, 不能向下写。
    我们通常所说的信息降级, 就是通过将秘密信息嵌入较低安全级别的客体中, 破坏了第二个规则, 从而使机密的信息看上去不再机密。在伪装技术中我们经常要这样做, 以使秘密信息被伪装成为低级别的信息, 不易被发现。图像降级就是伪装技术的一个应用。
    二、简单的图像信息伪装技术
    1.直接 4bit 替换法
    这是将秘密图像信息嵌入载体图像的一种最简单的方法,指直接用秘密图像像素值的高 4bit 去替换载体图像像素值的低 4bit。

    % 文件名: imagehide. m
    % 函数功能: 直接将秘密图像的高 4bit 隐藏在 RGB 载体图像的 R, G, B 层中所
    选的那一层的低 4bit, 并将秘密图像提取出来, 最后显示。要求载体图像的大小大于
    等于秘密图像的大小, 且秘密图像是二值或灰度图像
    % 输入格式:
    % data = imagehide( ′c: \ lenna. bmp′, ′c: \ woman. bmp′, ′c: \mix. bmp′, ′bmp′, 3 )
    % 参数说明
    % cover 是载体图像的地址
    % message 是秘密图像的地址
    % goleimage 是隐藏后图像的地址
    % permission 是图像的类型
    % level 是作为载体的具体层, R 为 1 , G 为 2, B 为 3
    % data 是隐藏后图像的矩阵
    
    function data = imagehide( cover, message, goleimage, permission, level)
    % 提取图像信息并分层
    cover = imread( cover, permission) ;
    data = cover;
    msg = imread( message, permission) ;
    [ row, col] = size( cover) ;
    cover1 = cover(∶,∶, level) ;
    % 置载体图像 R 层的低 4bit 为 0
    for i = 1∶row
    		for j = 1∶col /3
    				cover1( i, j) = bitand( cover1( i, j) , 240) ;
    		end
    end
    % 置秘密图像的低 4bit 为 0
    takemsg4 = bitand( msg, 240) ;
    % 将秘密图像的高 4bit 右移 4 位
    shiftmsg4 = bitshift( takemsg4, - 4) ;
    % 图像隐藏
    for i = 1∶row
    		for j = 1∶col /3
    				cover1( i, j) = bitor( cover1( i, j) , shiftmsg4( i, j) ) ;
    		end
    end
    % 写回并保存
    data(∶,∶, level) = cover1;
    imwrite( data, goleimage, permission) ;
    % 提取秘密图像信息, 检测隐藏效果
    data = imread( goleimage, permission) ;
    [ row, col] = size( data) ;
    A = data(∶,∶, level) ;
    for i = 1∶row
           for j = 1∶col /3
    				A( i, j) = bitand( A( i, j) , 15) ;
           end
    end
    A = bitshift( A, 4) ;
    % 显示结果
    subplot( 221) , imshow( cover) ; title( ′载体图像′) ;
    subplot( 222) , imshow( message) ; title( ′秘密图像′) ;
    subplot( 223) , imshow( data) ; title( ′隐藏后的图像′) ;
    subplot( 224) , imshow( A) ; title( ′提取的秘密图像′) ;
    

    但无论选择R G B三层中的哪层嵌入,都会在不同程度上对原始图像造成破坏
    考虑到第一章中我们阐述的 RGB 颜色模型, 将秘密图像隐藏在一层中, 容易导致该点的色彩向相应的坐标上发生绝对偏移, 从而使得该像素点的色彩的相应分量突出。所以, 我们不能笼统地认为图像隐藏在某层比较好而隐藏在某层不好, 这是因为对于具体的某个像素点其哪个颜色分量突出是不确定的。但是, 我们可以通过改进算法来限制这种颜色沿相应坐标的绝对偏移。

    例如, 可将秘密图像像素值的高 4bit 分别藏于载体图像 R, G, B 层像素值的最低位或次低位, 即将秘密图像的高 2bit 藏于 R 层, 另外 2bit 分别藏于 G 层和 B 层, 此时像素色彩的改变就不是沿一个坐标方向而改变, 而是在整个 RGB 空间中发生偏移, 改变后的颜色坐标点与改变前的颜色坐标点的距离( 数学上的范数) 比单纯在一个分量上改变的两点距离要小, 这样对载体图像的影响会更小。在实际应用中, 还应该考虑隐藏的鲁棒性等问题。

    2.对第 4bit 的考察
    可以发现,直接替换 4 bit 后, 图像还是有一些变化的, 也就是说, 替换容量大使图像的保真度降低( 可通过实验看到替换 3bit 的效果比替换 4bit 的效果要好)
    在这种情况下,我们可以用秘密信息图像像素值的高3bit去替换载体图像像素值的低3bit,至于第 4bit 则要具体分析
    其假设前提是: 如果只对图像进行 3bit 替换, 是不会对图像的视觉效果造成影响的。事实上, 这种假设是可以成立的

    首先, 我们引入一个相似度的概念, 所谓相似度, 是指两图像块中同一坐标下的像素中第 4bit 相同的像素数量占一块图像全部像素的比例, 表示为:μ=s/64
    其中 s 为第 4bit 相同的像素数量 64 为 8× 8 块中的总像素数
    根据 μ的取值我们来确定该块各像素第 4bit 的隐藏策略。
    我们先计算相应块的载体图像与秘密图像在第 4bit 的相似度 μ, 如果 μ大于某一阈值 T, 则可直接用秘密图像的第 4 bit 替换载体图像的第 4bit, 如果 μ小于阈值1 - T, 则先将秘密图像的第 4bit 取反后再替换, 若 μ介于 1 - T 和 T 之间, 则不进行替换。当然, 要用一个替换表对第 4bit 进行替换或取反替换了的块进行记录, 并且将此表也嵌入到载体图像中。编写函数 fourthbitcmp. m 完成记录替换表的实验, 函数代码如下:

    % 文件名: fourthbitcmp. m
    % 函数功能: 计算秘密图像和选择的载体图像层, 对于第 4bit 的每一个 8× 8 块,哪些可以用秘密图像去替换载体图像, 并返回一个替换表 count, 要求两个图像都可以整数 8× 8 分块
    % 输入格式: count = fourthbitcmp( ′c: \lenna. bmp′, ′c: \woman. bmp′, ′bmp′, 3, 0. 7)
    % 参数说明:
    % cover 是载体图像的地址
    % message 是秘密图像的地址
    % permission 是图像的类型
    % level 是作为载体的具体层。R 为 1, G 为 2 , B 为 3
    % count 是替换表
    % threshold 是阈值
    function count = fourthbitcmp( cover, message, permission, level, threshold)
    % 提取图像信息并分层
    cover = imread( cover, permission) ;
    data = cover;
    msg = imread( message, permission) ;
    cover1 = cover(∶,∶, level) ;
    % 对 cover 和 msg 的第 4bit 进行处理
    tempc = cover1;
    tempm = msg;
    tempc = bitand( tempc, 8) ;
    tempm = bitand( tempm, 8) ;
    temp = bitxor( tempm, tempc) ;
    [ row, col] = size( temp) ;
    % 记录图像每个分块的 n 值
    k1 = 0;
    k2 = 0;
    a = row* col /64;
    count = zeros( [ 1 a] ) ;
    for i = 1∶a
    	for m = 1∶8
    		for n = 1∶8
    				if temp( 8* k1 + m, 8* k2 + n) == 0
    					count( 1, i) = count( 1, i) + 1;
    				end
    		end
    	end
    	k2 = k2 + 1;
    	if k2* 8 == col
    			k2 = 0;
    					k1 = k1 + 1;
    			end
    	end
    % 计算每块的 μ值并与阈值进行比较
    count = count /64;
    for i = 1∶a
    	if count( i) >= threshold
    		count( i) = 1; % 可以替换
    			elseif count( i) < 1 - threshold
    				count( i) = - 1; % 取反
    			else
    		        count( i) = 0; % 不能处理
    	end
    end
    

    依据本算法, 在同一阈值下经不同层计算出的替换表中 0 的个数, 个数越少的层越适宜当做载体。当然, 为了简单起见, 也可以不加分块直接计算秘密图像与载体图像 R、G、B 层中哪一层的相似度高, 就选择哪一层为载体。
    三、图像置乱
    置乱实际上就是图像的加密, 与加密保证安全性不同的是, 将置乱的图像作为秘密信息再进行隐藏, 可以很大限度地提高隐蔽载体的鲁棒性, 所以图像置乱是信息隐藏中常用的一项技术。
    1、变化模板形状的图像置乱算法
    变化模板形状的图像置乱算法的思想如下:
    ① 对原图像取一个固定模板, 模板中像素位置排列如图 4. 10 所示。
    ② 做一个与原图像模板不同的置乱模板, 如图 4. 11 所示, 在置乱模板中把图像模板中的像素位置按一定次序填入
    ③ 将置乱模板中的像素位置再按一定的次序填回到原图像模板中就得到了置乱后的图像模板( 图 4. 12 的模板是按从左到右、从上到下的次序依次读取置乱模板中像素位置) 。
    在这里插入图片描述
    可以发现, 这种置乱算法是对合的
    与前面 Zigzag 变换一样, 我们也采取查表的方法编写程序。由于我们固定了置乱模板的大小, 所以在对图像置乱前我们要对其进行边界修补。如取置乱模板为 32× 32, 则要求秘密图像的尺寸为 32× 32,64× 64 , 128× 128, …。假设一幅图像的尺寸为 32× 31 , 则应该对其增加 1 列数据。
    变换表分为行表和列表, 同一坐标下的行列表中的数据结合起来所指示的像素将被置乱到这一坐标下。
    此外, 在图像置乱机制中引入一个简单的密钥控制。将由密钥生成的第一个[ 128, 255] 的随机整数与置乱的结果进行模 2 加。编写程序 diamondreplace. m 完成置乱实验。其中需要调用查表程序 replace32 fun. m, 函数代码如下:
    ( 1 ) 主函数: diamondreplace. m

    % 文件名: diamondreplace. m
    % 函数功能: 本函数将完成对输入的图像信号按菱形置换策略进行置乱
    % 输入格式举例: result = diamondreplace( secretimage, 1983 )
    % 参数说明:
    % matrix 为输入图像矩阵
    % key 为控制密钥
    % result 为置乱后的结果
    function result = diamondreplace( matrix, key)
    % 分析原图像尺寸并补遗
    [ m, n] = size( matrix) ;
    rowadd = 32-mod( m, 32) ;
    coladd = 32-mod( n, 32 ) ;
    if rowadd== 32
    rowadd = 0;
    end
    if coladd== 32
    coladd = 0;
    end
    input = uint8( zeros( [ m + rowadd n + coladd] ) ) ;
    input( 1∶m, 1∶n) = matrix;
    % 密钥生成随机数
    rand( ′seed′, key) ;
    control = randint( 1, 1 , [ 128 255] ) ;
    % 查表置乱
    fun = @replace32fun; % 调用子函数
    result = blkproc( input, [ 32 32] , fun) ;
    result = bitxor( result, control( 1 , 1) ) ;
    

    ( 2 ) 查表函数: replace32fun. m

    function result = replace32fun( matrix)
    % 行转换表
    row = [ 16 15 17 14 16 18 …] % 此处略去, 具体内容请见表 4. 3
    col = [ 17 18 17 20 18 16 …] % 此处略去, 具体内容请见表 4 . 4
    for i = 1∶32
    for j = 1∶32
    result( i, j) = matrix( row( i, j) , col( i, j) ) ;
    end
    end
    

    woman图像置乱后的效果
    将图像的原始信息破坏得越大越好, 不过, 这种破坏一定要是可以复原的

    2.图像的幻方变换

    % 文件名: magicsquares. m
    % 函数功能: 本函数将完成 n 阶二维幻方的求取 . 要求 n 为奇数
    % 输入格式举例: result = magicsquares( 5)
    % 参数说明:
    % n 为阶数
    % result 为求得的二维幻方
    function result = magicsquares( n)
    if mod( n, 2) == 0
    error( ′n 要求为奇数′) ;
    end
    result = zeros( n) ;
    j = floor( n /2 ) + 1; % 中间 1 列
    i = n + 1; % 便于以后从第 n 行开始考虑起
    result( 1, j) = 1 ;
    for k = 2∶n* n % 依次考虑后 n^2 - 1 个数
    i = i - 1 ;
    j = j + 1 ; % 行数减 1, 列数加 1
    if i < 1 && j > n % 特殊情况 4
    i = i + 2 ;
    j = j - 1 ;
    else
    if i < 1 % 特殊情况 1
    i = n;
    end
    if j > n % 特殊情况 2
    j = 1;
    end;
    end;
    if result( i, j) == 0
    result( i, j) = k;
    else % 特殊情况 3
    i = i + 2 ;
    j = j - 1 ;
    result( i, j) = k;
    end
    end
    
    

    我们知道, 要图像置乱是为了增加隐藏的鲁棒性。一个置乱的图像无论是合法用户还是非法用户都看不懂, 要使合法用户能完整地读取秘密信息, 就要满足两个条件:
    ①仅有合法用户知道的密钥参与运算。
    ②置乱算法本身可以保证图像复原, 即算法是可逆的。
    幻方置乱的思想其实也是查表思想,其运算具有准对合性,具体算法实现后面再阐述
    编 写 函 数 magicreplace. m 完 成 置 乱 实 验, 其 中 需 要 调 用 查 表 函 数replacemagicfun. m。前主函数存放 11 阶标准幻方, 子函数存放表 4. 6 , 函数代码如下:
    ( 1 ) 幻方置乱主函数: magicreplace.m

    % 文件名: magicreplace. m
    % 函数功能: 本函数将完成对输入的图像信号按幻方置换策略进行置乱
    % 输入格式举例: result = magicreplace( secretimage, 1, 1983)
    % 参数说明:
    % matrix 为输入图像矩阵
    % key 为控制密钥
    % eord 为 1 表示置乱变换, 为 0 表示复原变换
    % result 为置乱后的结果
    function result = magicreplace( matrix, eord, key)
    % 分析原图像尺寸并补遗
    [ m, n] = size( matrix) ;
    rowadd = 11-mod( m, 11) ;
    coladd = 11-mod( n, 11 ) ;
    if rowadd == 11
    rowadd = 0;
    end
    if coladd == 11
    coladd = 0;
    end
    input = uint8( zeros( [ m + rowadd n + coladd] ) ) ;
    input( 1∶m, 1∶n) = matrix;
    % 密钥生成随机数
    rand( ′seed′, key) ;
    control = randint( 1, 1 , [ 1 121] ) ;
    % 11 阶标准幻方
    magic =
    [ 38 52 66 69 83 97 100 114 7 21 24 
      61 75 78 92 106 120 2 16 30 44 47
      84 98 101 115 8 22 25 39 53 56 70 
      107 121 3 17 31 34 48 62 76 79 93 
      9 12 26 40 54 57 71 85 99 102 116
      32 35 49 63 77 80 94 108 111 4 18 
      55 58 72 86 89 103 117 10 13 27 41
      67 81 95 109 112 5 19 33 36 50 64
      90 104 118 11 14 28 42 45 59 73 87
      113 6 20 23 37 51 65 68 82 96 110 
      15 29 43 46 60 74 88 91 105 119 1 ] ; 
    if eord == 0
    control = 121 -control;
    elseif eord == 1
    control = control;
    else
    error( ′输入参数错误′) ;
    end
    % 幻方变换主过程
    for define = 1∶key% control
    	for r = 1∶11
    		for c = 1∶11
    			magic( r, c) = magic( r, c) -1;
    			if magic( r, c) == 0
    					magic( r, c) = 121;
    			end
    		end
    	end
    end
    % 查表置乱
    fun = @replacemagicfun; % 调用子函数
    result = blkproc( input, [ 11 11] , fun, magic) ;
    

    ( 2 ) 行列转换表子函数: replacemagicfun. m

    % 11 阶幻方的行列查找表程序
    function result = replacemagicfun( matrix, P1 )
    % 初始化 11 阶幻方的行列查找表
    row = [ 11 , 2, 4, 6, 8, 10, 1, 3, 5, 7, 9, 5, 7, 9, 11, 2, 4, 6 , 8, 10, 1 , 3, 10, 1 , 3, 5, 7, 9,
    11, 2, 4, 6 , 8, 4, 6, 8, 10, 1, 3, 5, 7, 9 , 11, 2 , 9 , 11, 2, 4, 6, 8 , 10, 1, 3, 5 , 7, 3, 5, 7 , 9, 11 , 2,
    4 , 6 , 8, 10 , 1, 8, 10 , 1, 3, 5, 7, 9, 11, 2, 4, 6 , 2 , 4 , 6, 8, 10, 1 , 3, 5, 7, 9, 11, 7, 9, 11, 2, 4 , 6,
    8 , 10, 1, 3 , 5, 1, 3, 5, 7, 9, 11, 2, 4, 6 , 8, 10 , 6 , 8, 10 , 1, 3, 5, 7, 9, 11, 3, 4] ;
    col = [ 11, 7, 3, 10, 6, 2, 9, 5, 1, 8, 4 , 2, 9, 5, 1, 8, 4, 11, 7, 3 , 10, 6, 4, 11, 7 , 3, 10 , 6,
    2 , 9 , 5, 1, 8, 6, 2, 9, 5 , 1, 8, 4, 11, 7, 3, 10 , 8, 4, 11, 7 , 3, 10, 6, 2, 9, 5 , 1, 10, 6, 2 , 9, 5, 1,
    8 , 4 , 11, 7 , 3, 1, 8, 4, 11, 7, 3, 10, 6, 2, 9, 5 , 3 , 10, 6, 2, 9, 5 , 1, 8, 4, 11 , 7, 5, 1, 8 , 4, 11 , 7,
    3 , 10, 6, 2 , 9, 7, 3, 10, 6, 2, 9, 5, 1, 8 , 4, 11 , 9 , 5, 1, 8, 4, 11, 7, 3, 10, 6, 2] ;
    for i = 1: 11
    	for j = 1: 11
    		result( i, j) = matrix( row( P1 ( i, j) ) , col( P1( i, j) ) ) ;
    	end
    end
    

    3.图像的 Ha sh 置乱
    前面的两种置乱都是对图像分块进行的, 而且其共同的问题是密钥控制并不得力。下面介绍的一种图像置乱方法实际上就是我们在 2. 6. 3 节中介绍的 Hash 置换的特例———对于 m× n 个像素点, 我们要求随机置换 m× n 个, 就完成了图像的 Hash置乱。鉴于该算法具有无冲突( collision) 和强密钥控制的特点, 显然是一个很好的图像置乱算法。需要说明的是, 这种算法不是对合的, 所以在实现上较前两种复杂一些。另外, 其算法执行起来也比较费时间。编写函数 hashdisturb. m 完成实验

    % 文件名: hashdisturb. m
    % 函数功能: 本函数将完成对输入的图像信号按 Hash 置换策略进行置乱
    % 输入格式举例: result = hashdisturb( secretimage, 1, 1983 , 421, 1121)
    % 参数说明:
    % matrix 为输入图像矩阵
    % key1 -key3 为控制密钥
    % eord 为 1 表示置乱变换, 为 0 表示复原变换
    % result 为置乱后的结果
    function result = hashdisturb( matrix, eord, key1, key2, key3 )
    % 分析原图像尺寸并补遗
    [ m, n] = size( matrix) ;
    % 调用随机置换函数
    [ row, col] = hashreplacement( matrix, m* n, key1, key2, key3) ;
    % 置乱函数
    count = 1;
    if eord == 1
    	for i = 1∶m
    		for j = 1∶n
    			result( i, j) = matrix( row( count) , col( count) ) ;
    			count = count + 1;
    		end
    	end
    end
    % 复原函数
    if eord == 0
    	for i = 1∶m
    		for j = 1∶n
    			result( row( count) , col( count) ) = matrix( i, j) ;
    			count = count + 1;
    		end
    	end
    end
    
    

    4.隐藏置乱图像的优点
    置乱图像隐藏的抗恶意攻击性能
    经过多次置乱后, 图像就会彻底地改变, 从置乱后的图像上根本看不到原图像的任何特征。使用置乱方法为什么可以增加图像伪装的鲁棒性呢?
    首先, 将图像置乱后, 将得到一幅杂乱无章的图像, 这个图像无色彩、无纹理、无形状, 从中无法读取任何信息, 那么, 将这样一幅图嵌入到另一幅普通图像时就不易引起那幅图色彩、纹理、形状的太大改变, 甚至不会发生改变, 这样人眼就不易识别,从而逃出了第三方的视线。

    其次, 由于秘密图像是置乱后的图像, 根据上述图像的“三无”特征, 第三方根本不可能对其进行色彩、纹理、形状等的统计分析, 即便他们截取到了秘密图像, 也是无能为力的。如果第三者企图对秘密图像进行反置乱, 这也是不可能的, 由于图像置乱有很多种方法, 每种方法又可以使用不同的置乱模板算法, 设置不同的参数, 使用者有很大的自由度, 他可以根据自己的想法得到不同的结果, 相反, 这给企图截获秘密信息的第三方带来了很大的困难, 使他们需要耗费巨大的计算量来穷举测试各种可能性

    最后, 我们再设想一下, 如果第三方反置乱不成, 在隐蔽载体上恶意修改怎么办?通过实验我们知道, 用置乱的方法是可以抵抗这些攻击的, 因为对秘密图像进行反置换的过程, 就使得第三方在图像上所涂、画的信息分散到画面的各个地方, 形成了点状的随机噪声, 对视觉影响的程度不大。图 4. 20 是我们随意对隐蔽载体进行 3 种恶意攻击后提取的秘密图像内容。可以看到, 即使是在攻击 3 下, 秘密图像的轮廓依然可见, 这是在未置乱图像的隐藏下不可想像的。当然, 为了使提取的信息更为清晰,最好对破坏严重的图像进行边界保持的中值滤波等方面的处理, 以去除随机噪声。

    展开全文
  • 空域信息隐藏算法(完成基于LSB的图像信息隐藏

    千次阅读 热门讨论 2019-04-07 19:57:49
    最近在上信息隐藏,做一个记录 ...载体图像为24位真彩色bmp图像Lena.bmp,嵌入的秘密图像为黑白的bmp图像LSB.bmp,要求采用空域信息隐藏算法,将LSB.bmp嵌入到Lena.bmp的最低有效位中,同屏显示原载体图...

    最近在上信息隐藏,做一个记录

    一,实验要求

    (1)了解信息隐藏算法的分类方式和分类依据
    (2)理解空域信息隐藏算法的基本思想
    (3)掌握最低有效位算法原理
    (4)完成基于LSB的图像信息隐藏

    二、实验内容

    载体图像为24位真彩色bmp图像Lena.bmp,嵌入的秘密图像为黑白的bmp图像LSB.bmp,要求采用空域信息隐藏算法,将LSB.bmp嵌入到Lena.bmp的最低有效位中,同屏显示原载体图像、需要嵌入的秘密图像、嵌入了秘密图像的伪装载体、提取的秘密图像。
    以下为实验材料:lena.bmp 和 LSB.bmp
    在这里插入图片描述
    隐体:
    在这里插入图片描述

    三、实验步骤和设计思想

    1,使用pyhton库,skimage来完成相关的土图像处理
    2,通过skimage库打开隐体,发现只有两个值【255,和 0】所以,其实隐藏时,只要用一位就可以隐藏隐体,将255使用1代替,0不变,将其藏在载体的最后一位即可。
    3,因为隐体为RGB三通道图像,为了隐藏的更好,使用随机数将0和1,随机选定一个图层进行隐藏,当然为了能够还原原图像,使用一个seed作为key,这样产生的随机数就可以顺序提取。
    4,隐藏和提取时,使用位运算可轻松的实现数字的高低位的存取。
    5,将变换后的图片进行保存,再使用相同的key和隐藏信息后的载体,进行提取。
    6,为了方便使用,将隐藏的方法和过程使用,面向对象的思想,封装为类。

    四,### 代码

    from skimage import io
    import numpy
    
    
    class IMG_LSB:
    
        def __init__(self, key):
            self.key = key
    
        def show(self, img):
            """
            显示图片
            :param img: 显示的图片矩阵
            :return: none
            """
            io.imshow(img)
            io.show()
    
        def create_cover(self, img_cover_name, img_info_name, save_img_name):
            """
            使用LSB算法对图像进行隐藏,隐藏到使用key作为种子生成的随机数指定的RGB通道中
            :param img_cover_name: 载体图片名
            :param img_info_name: 隐体图片名
            :param save_img_name: LSB生成后的图片保存位置以及名字
            :return: LSB生成后的图片矩阵
            """
            img_info = io.imread(img_info_name)
            img_cover = io.imread(img_cover_name)
    
            self.show(img_info)
            self.show(img_cover)
            self.ls_info = img_info.shape[0] # 得到隐体图片的长和宽
            self.ls_cover = img_cover.shape[0] # 得到载体的长和宽
            if self.ls_info > self.ls_cover:
                print("载体太小")
            # 开始隐藏
            numpy.random.seed(self.key)
            for i in range(0, self.ls_info):
                for j in range(0, self.ls_info):
                    if img_info[i][j] == 255 :  # 如果隐体为255则藏在R层最低为置为1
                        img_cover[i, j, numpy.random.randint(0, 3)] |= 1    # 随机选定一个通道进行隐藏
                    else:
                        img_cover[i, j, numpy.random.randint(0, 3)] &= 254  # 如果隐体为0则藏在R层最低为置为0
    
            self.show(img_cover)
            io.imsave(save_img_name, img_cover)
            return img_cover
    
        def  extract_img(self, blmb_name, save_img_name):
            """
            对隐体进行提取并显示
            :param blmb_name: LSB生成的含有隐体的载体名
            :param save_img_name: 提取后的隐体存储的位置
            :return: 提取后的隐体的矩阵
            """
            blmb = io.imread(blmb_name)
            matrix = [[255 for i in range(self.ls_info)] for i in range(self.ls_info)]    # 生成与隐体相同大小的矩阵,并赋值为255
            re_info_img = numpy.array(matrix, dtype=numpy.uint8)   # 将生成的矩阵转化为可存储图像的8位格式
            self.show(re_info_img)
            # 开始提取
            numpy.random.seed(self.key)
            for i in range(0, self.ls_info):
                for j in range(0, self.ls_info):
                    randint_value = numpy.random.randint(0, 3)  # 使用seed控制随机数的生成保证与之前隐藏时,生成的随机数一致
                    blmb[i, j, randint_value] &= 1 # 取出最后一位
                    if blmb[i, j, randint_value] == 0:
                        re_info_img[i][j] &= 0     # 如果最后一位为0则隐体原处为0,为1则为255
                    else:
                        re_info_img[i][j] |= 255
    
            io.imsave("img/re_img.bmp", re_info_img)
            self.show(re_info_img)
            return re_info_img
    
    
    # 测试
    if __name__ == '__main__':
        img = IMG_LSB(123) # key为123
        img.create_cover("img/Lena.bmp", "img/LSB.bmp", "img/blmb2.bmp")
        img.extract_img("img/blmb2.bmp", "img/re_img.bmp")
    
    展开全文
  • 二值图像信息隐藏

    千次阅读 2014-02-12 14:23:50
    二值图像信息隐藏的方法是把一个二值图像分成一系列矩形图像区域B,某个图像区域B中黑色像素的个数大于一半,则表示嵌入0,如果白色像素的个数大于一半,则表示嵌入1,但是当需要嵌入的比特与所选区域的黑白像素的比例...
  • 本文提出了一种基于混沌映射和多融合的数字图像信息隐藏方案,并从迭代学习识别的角度进行了隐藏信息的恢复。 利用所提出的方案,将数字图像信息添加到所采取的混沌系统的参数。 为了恢复目的,提出了一种迭代学习...
  • 在各种形式的数字图像分析中,二值图像信息隐藏及其对抗研究相对滞后,文中提出了一种全新的隐藏分析算法,可以成功地检测基于分块嵌入的二值图像信息隐藏。该算法借鉴了数学形态学非线性滤波理论,利用携带隐藏信息...
  • Python实现图像信息隐藏 之前学习密码学的时候老师有提到过『信息隐藏』,现在用图像的方法尝试一下。思想是:把信息藏到RGB通道中的B通道,然后利用奇偶性可以恢复过来 原理 从源图中提取文字图像信息,记录这个...
  • 上机实验报告 课程名称 数据加密与PKI技术 实验名称LSB图像信息隐藏原理 姓名 学号 班级 指导教师乔明秋 实验日期 实验成绩 一实验目的 1掌握LSB图像信息隐藏原理 2简单使用matlab工具 二实验环境 计算机一台 Matlab...
  • 介绍并分析了传统的 LSB 信息隐藏算法原理,详细阐述了图像置乱技术的原理和一种传统的混沌图像 置乱方法。在此基础上,提出了一种新的图像信息隐藏算法:基于图像向量索引奇偶性进行信息隐藏的算法。 试验结果及...
  • LSB图像信息隐藏实验(附源代码)

    万次阅读 多人点赞 2016-11-01 17:26:59
    LSB图像信息隐藏 1.掌握对图像的基本操作。 2.能够用 LSB 算法对图像进行信息隐藏 3.能够用 LSB 提取算法提取隐藏进图像的信息 4.能够反映 jpeg 压缩率与误码率之间的关系 三、【实验过程】 实验算法 1:信息隐藏 ...
  • 数字图像信息隐藏预处理技术研究的国内相关文献 有助于毕业设计文献参考
  • 数字图像隐写分析 作业二 1 数字图像隐写分析 基于 LSB 算法的图像信息隐藏与检测 学 院 名 称 计算机科学与技术学院 专 业 班 级 学 生 姓 名 学 号 指 导 教 师 2016.05.01 基于 LSB 算法的图像信息隐藏与检测 ...
  • 基于计算全息的半色图像信息隐藏 简介 光学信息隐藏算法大致可以分为两类。 第一类是基于双随机相位编码的信息隐藏算法,第二类是基于数字全息编码的信息隐藏算法。这两类算法分别利用了双随机编码和全息编码对水印...
  • 为了提高图像信息隐藏的鲁棒性和不可感知性,提出了一种基于图像块最大奇异值移位的鲁棒信息隐藏算法。算法首先对图像分块并对每个图像块进行奇异值分解,根据图像块最大奇异值的大小选择合适的阈值,并对图像块的...
  • 图像信息隐藏示意图visio
  • 本文详细介绍了彩色静止数字图像信息隐藏技术研究原理及方法。
  • BMP图像信息隐藏的简单VC实现。通过更改最低比特位(LSB)实现。
  • 图像信息隐藏技术

    千次阅读 2015-01-07 16:59:47
    基于直方图修改的可逆图像信息隐藏技术: ( 1)得到图像的灰度直方图,并找出其中的零点和最大值点。最大点表示的是相应灰度值的图像的点数最多, 零点表示相应灰度值的图像的点不存在; ( 2)在直方图中找到零点...
  • BMP图像信息隐藏 解读

    2010-09-07 20:48:42
    该软件可实现BMP图像的一些信息隐藏,并可以解读
  • 使用matlab进行图像信息隐藏和提取

    千次阅读 2020-05-07 15:35:20
    基于格式的信息隐藏方法通常在文件头与图像数据之间,或图像数据末尾添加秘密信息,具有实现简单,透明性高,隐藏容量大等多个优点;LSB图像信息隐藏算法是将秘密信息隐藏图像像素数据的低位上来隐藏信息的方法,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 212,292
精华内容 84,916
关键字:

图像信息隐藏