通过MATLAB中图像与数字化两篇博客,已经基本掌握了图像处理的一些基本操作,为了进一步提高对于图像的操作,本次进行一个图像处理的插曲,即图像加密的一些代码。
对于图像加密,一般是现将矩阵读取到MATLAB中,并以矩阵的形式存储,然后对这个矩阵进行操作,生成一个加密矩阵,然后再将这个加密矩阵以图片的形式输出,这样就完成了对于图像的加密。
一、首先介绍一种简单的加密方法:
首先将1.png文件读入MATLAB中,生成原始的img矩阵数据,然后在生成一个随机的加密矩阵,在通过循环,使img矩阵与加密矩阵进行求和,这样就生成了一个新的矩阵,再将原始矩阵输出。代码如下:
clc
clear
warning off
img=imread('1.png');%img代表原图像矩阵
img=double(img);
size1=size(img);
img_1=img(:);%img_1代表拉直后的图像矩阵
ps=[10,33,42,65,33,76,98];
xv=ps;
[x1,x2]=size(ps);
k=1;
while x2<1000
p2=ps*3;
ps=[ps p2];
[x1,x2]=size(ps);
k=k+1;
end
%password=randperm(6);
[m,n]=size(ps);%密码的长和宽
%for i=1:n
%password(i)=password(i)^2+18;
%end
img_new=zeros(size(img));%新图像的矩阵
c1=zeros(size(img));
j=1;
for x=1:size1(1)
for y=1:size1(2)
for z=1:size1(3)
img_new(x,y,z)=img(x,y,z)+ps(j);
img_new(x,y,z)=mod(img_new(x,y,z),256);
j=j+1;
if(j==n)
j=1;
break
end
end
end
end
img_last=uint8(img_new);
%img_last(1,1,1)
imwrite(img_last,'01.PNG');%存储出了问题。
%da=imread('2.jpg');
%da(1,1,1)
subplot(1,2,1)
imshow('1.png');
title('原图像');
subplot(1,2,2)
imshow(img_last)%显示图像的方法
title('加密后的图像');
运行结果如下:
由加密图像可以看出,该方法虽然加单,但加密的效果并不是特别的好,仍可以看出图像的大致轮廓,多余一些图片来说,效果更差,但该方法简单,代码易于理解,解密代码,只要将循环中的加上密钥矩阵改为减去密钥矩阵即可。代码如下:
clc
clear
warning off
img=imread('01.png');%img代表原图像矩阵
img=double(img);
size1=size(img);
img_1=img(:);%img_1代表拉直后的图像矩阵
ps=[10,33,42,65,33,76,98];
xv=ps;
[x1,x2]=size(ps);
k=1;
while x2<1000
p2=ps*3;
ps=[ps p2];
[x1,x2]=size(ps);
k=k+1;
end
%password=randperm(6);
[m,n]=size(ps);%密码的长和宽
%for i=1:n
%password(i)=password(i)^2+18;
%end
img_new=zeros(size(img));%新图像的矩阵
c1=zeros(size(img));
j=1;
for x=1:size1(1)
for y=1:size1(2)
for z=1:size1(3)
img_new(x,y,z)=img(x,y,z)-ps(j);
img_new(x,y,z)=mod(img_new(x,y,z),256);
j=j+1;
if(j==n)
j=1;
break
end
end
end
end
img_last=uint8(img_new);
%img_last(1,1,1)
imwrite(img_last,'001.png');%存储出了问题。
%da=imread('2.jpg');
%da(1,1,1)
subplot(1,2,1)
imshow('01.png');
title('原图像');
subplot(1,2,2)
imshow(img_last)%显示图像的方法
title('解密后的图像');
运行结果如下:
二、这种加密方式主要以将图片生成的矩阵中的行与行之间进行交换,或者是列与列之间进行交换
clc
clear
close all
img = imread('1.png');
% figure;imshow(img)
% title('原图')
[M,N] = size(img);
Rm= randsample(M,M)';
Mchange = [1:1:M;Rm];
Rn = randsample(N,N)';
Nchange = [1:1:N;Rn];
%打乱行顺序
img (Mchange(1,:),:) = img (Mchange(2,:),:);
subplot(2,2,1)
imshow(img)
title('行加密后图像')
%打乱列顺序
img (:,Nchange(1,:)) = img (:,Nchange(2,:));
subplot(2,2,2)
imshow(img)
title('列加密后图像')
%列变换还原
img (:,Nchange(2,:)) = img (:,Nchange(1,:));
subplot(2,2,3)
imshow(img)
title('列解密后图像')
%行变换还原
img (Mchange(2,:),:) = img (Mchange(1,:),:);
subplot(2,2,4)
imshow(img)
title('解密后图像')
运行结果如下:
三、这种方法与前面相比,最大的特点是生成的密钥矩阵不同,这种方法加密效果较好,不易被,但是在解密的过程中存在很大的问题。代码如下:
clear
clc
close
G=imread('1.png');
G=rgb2gray(G);
[hang,lie]=size(G);
subplot(1,4,1);
imshow(G);
title('原图');
Gadd=fix(256*rand(hang,lie));
for i=1:hang
for j=1:lie
G1(i,j)=0.1*G(i,j)+0.9*Gadd(i,j);
end
end
subplot(1,4,2);
% figure
imshow(G1);
title('置乱后的图像');
for i=1:hang
for j=1:lie
G2(i,j)=(G1(i,j)-0.9*Gadd(i,j))./0.1;
end
end
subplot(1,4,3);
% figure
imshow(G2);
title('恢复后的图像');
运行结果:
综上这种简单的加密方法,要么加密不够彻底,要么易于破解,在这就是解密效果较差,因此,要想更好地对图像进行加密,应该采用高级算法,由于本人水平有限,因此不过多的设计,前两天在网上看到一个混沌加密的代码,于是我也仿照写了一个,但是直至现在也没有运行出来,因此在这里就不推荐了。