matlab实现对图像的简单幻方置乱

信息隐藏技术常常与加密技术同时使用,使得隐藏的信息更加安全。


前言

最近在做选修课的结课大作业,做一个图像信息隐藏的小实验,要求对隐藏的水印(也就是小图像)进行置乱,其中一个就是幻方置乱。作为上课不好好听讲的代表之一,大作业肯定是靠C站啦。但是在网上查找大量资料之后,深深的绝望了,网上能找到的都是一些论文,代码少之又少(花钱下载是不可能滴)。好不容易找到一个大佬给的代码,置乱之后却总不能成功恢复,最后实在咩办法了,我就自己动手改了一下,当然,由于能力有限,代码肯定是怎么简单怎么来,目标就是加密能恢复就行。为了造福更多的同胞,仅在这里简单记录一下。


一、幻方是什么?

这里我就不说了,大家自行搜索吧。

二、matlab代码

1.生成幻方

这里提供一个生成奇数阶幻方的代码,这个是借鉴别人的,实际在我的代码中我用的是matlab提供的magic()函数,如果觉得自带的这个函数太单一了,也可以用这个函数代替magic().
代码如下:

% 文件名: 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

2.幻方置乱函数

在主函数中调用的就是这个部分。
代码如下:

% 文件名: magicreplace. m
% 函数功能: 本函数将完成对输入的图像信号按幻方置换策略进行置乱
% 输入格式举例: result = magicreplace( I, M, 15,1)
% 参数说明:
% matrix 为待置乱图像
% magic为使用的幻方矩阵
% control为置乱的次数
%tap=0为恢复;tap=1为置乱
% result 为置乱后的结果
function result = magicreplace( matrix, magic, control,tag)
% 分析原图像尺寸并补遗
[ m, n] = size( matrix) ;
[ a, b] = size(magic);
rowadd = a-mod( m, a) ;
coladd = b-mod( n, b ) ;
if rowadd == a
    rowadd = 0;
end
if coladd == b
    coladd = 0;
end
input = uint8( zeros( [ m + rowadd ,n + coladd] ) ) ;
input( 1:m, 1:n) = matrix;
% 幻方变换主过程,得到置乱control次后的置乱矩阵
for r = 1:a
    for c = 1:b
		magic( r, c) = mod(magic( r, c) - control+a*b,a*b);
        if magic( r, c) == 0
			magic( r, c) = a*b;
        end
    end
end
% 对待置乱图像进行分块置乱
if mod(control,a*b)==0 
    result = input;
elseif tag==1
    fun = @placemagicfun; % 调用置乱子函数
    result = blkproc( input, [ a b] , fun, magic) ;
elseif tag==0
    fun = @replacemagicfun; % 调用恢复子函数
    result = blkproc( input, [ a b] , fun, magic) ;
end

3.分块置乱函数

代码如下:

% 置乱函数
function result = placemagicfun( matrix,P1 ) %matrix是待处理的11x11矩阵,P1是magic矩阵
[ a, b] = size(P1);
for i = 1: a
	for j = 1: b
        n = P1(i,j)-1;
        if n==0
            n=a*b;
        end
        [i1,j1]=find(P1==n);
		result( i, j) = matrix(i1,j1) ;
	end
end

4.分块恢复置乱函数

代码如下:

% 恢复置乱函数
function result = replacemagicfun( matrix,P1 ) %matrix是待处理的11x11矩阵,P1是magic矩阵
[ a, b] = size(P1);
for i = 1: a
	for j = 1: b
        n = mod(P1(i,j)+1,a*b);
        if n==0
            n=a*b;
        end
        [i1,j1]=find(P1==n);
		result( i, j) = matrix(i1,j1) ;
	end
end

5.试例函数

这里使用的时候最好图片的边长是幻方的整数倍,不是的话恢复效果会不太好,好像是会有黑边。
代码如下:

clc;clear all;
img = imread('lena.bmp');
I = rgb2gray(img);  % 灰度化

%幻方置乱
M=magic(5);
MagicreplaceImg = magicreplace( I, M, 15,1);
ReMagicreplaceImg = magicreplace( MagicreplaceImg, M, 15,0);

figure
subplot(2,2,1);imshow(I);title('original image');
subplot(2,2,2);imshow(MagicreplaceImg);title('after magic');
subplot(2,2,3);imshow(ReMagicreplaceImg);title('restore magic');

6.效果展示

在这里插入图片描述
这里附上我借鉴的代码的源地址
https://blog.csdn.net/include_zrl/article/details/87104345

总结

以上就是我本次实验的收获之一啦。后期有时间我会把剩下的Arnold置乱,RC4加密,DCT隐藏,最低位信息隐藏都上传上来的,敬请期待。

  • 13
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值