• MATLAB 图像处理于数字化之简单图像加密算法


    通过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('恢复后的图像');
    

    运行结果:

    在这里插入图片描述

    综上这种简单的加密方法,要么加密不够彻底,要么易于破解,在这就是解密效果较差,因此,要想更好地对图像进行加密,应该采用高级算法,由于本人水平有限,因此不过多的设计,前两天在网上看到一个混沌加密的代码,于是我也仿照写了一个,但是直至现在也没有运行出来,因此在这里就不推荐了。

  • 相关阅读:
    阿里云能耗宝助力华聚公司实现产品绿色升级
    最佳实践|从Producer 到 Consumer,如何有效监控 Kafka
    漫画 | 新一代软件架构会影响到谁?
    MongoDB :第七章:总结一下学习MongoDB的心得
    面试:第十二章:所有总结
    技术汇总:第十二章:技术总览
    接口文档:第二章:使用Swagger接口的文档在线自动生成
    为何你炒的肉又硬又柴?原来是忽略了关键1步,大厨教你正确做法
    IKEA bugs All In One
    Korean Keyboard All In One
  • 原文地址:https://www.cnblogs.com/mach-pupil/p/12535351.html
Copyright © 2020-2023  润新知