图片加密置乱的评价指标—用matlab对图像进行直方图统计与熵值计算

文章目录


图片加密的评价指标—直方图统计与熵值

  1. 本篇文章对加密(置乱)后的图像进行评估,采用matlab来计算加密前后的图像直方图统计,以及图像的熵值。
  2. 灰度直方图统计能反映一幅图的像素分布,或者说是亮度变化,针对加密图像来说,通过直方图统计可得到像素之间的 相关性 关系。
  3. 图像熵值能反映图像的平均信息量,同时熵值越大,说明图像越混乱。

根据以上,我们对FPGA实现加密后的图像进行质量评估。
1、首先给出原图与加密后的图像
2、matlab进行直方图统计:

I = imread('his22.png') ; % 读取rgb图像
I = rgb2gray(I);
figure, imshow(I); 
figure, imhist(I); % 显示图像的灰度值直方图

结果如下:
在这里插入图片描述

在这里插入图片描述

通过上述图片可看出,加密后的图像分布更均匀,且直方图统计特性不如原图明显,因此说明图像像素之间的相关性低,也就是图像越混乱,从而达到了加密的效果。

3、同样对原图与加密图进行图像熵值的计算

clc
clear
close all

I=imread('his22.png');
[C,L]=size(I); %求图像的规格
Img_size=C*L; %图像像素点的总个数
G=256; %图像的灰度级
H_x=0;
nk=zeros(G,1);%产生一个G行1列的全零矩阵
for i=1:C
for j=1:L
Img_level=I(i,j)+1; %获取图像的灰度级
nk(Img_level)=nk(Img_level)+1; %统计每个灰度级像素的点数
end
end
for k=1:G  %循环
Ps(k)=nk(k)/Img_size; %计算每一个像素点的概率
if Ps(k)~=0 %如果像素点的概率不为零
H_x=-Ps(k)*log2(Ps(k))+H_x; %求熵值的公式
end
end

在命令行输入如下指令,即可求出熵值

H_x %显示熵值

通过计算可知,原图熵值为7.71,加密图的熵值为7.84,因此加密后的图像熵值更大,同时对于8位的灰度图来说,最大的信息熵值是8,7.84更接近于8,说明加密后图像的混乱程度大。

补充:加密后的直方图统计以及熵值虽然能说明加密成功,但是为了带来更好的效果,可增加置乱变换的次数,但是不可违背置乱的周期性,也就是在可复原的周期内,最大限度的变换图像,从而即可得到更好的加密效果。

参考:

  • 4
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,这是一个比较复杂的问题,需要分步骤来实现。我会尽可能详细地回答你的问题,希望能够帮到你。 首先,我们需要明确一下,图像加密的目的就是要保证图像的安全性,使得未经授权的人无法识别图像的内容。常见的图像加密方法有像素置乱、像素扩散、置乱加扩散等。 接下来,我将分别介绍如何实现像素置乱和像素扩散,以及如何将它们结合起来进行图像加密和解密。 1. 像素置乱 像素置乱是指将图像的像素位进行随机的换,从而加深图像的随机性,使得未经授权的人无法识别图像的内容。具体的实现步骤如下: (1)读取彩色图像,并将其转换为灰度图像。 (2)生成一个随机的换矩阵。 (3)将灰度图像的每个像素位按照换矩阵进行换。 (4)将换后的图像保存到本地。 下面是一个简单的 Matlab 代码示例: ```matlab % 读取原始彩色图像 img = imread('lena.jpg'); % 转换为灰度图像 gray_img = rgb2gray(img); % 生成换矩阵 N = size(gray_img, 1); M = size(gray_img, 2); rand_idx = randperm(N * M); perm_mat = reshape(rand_idx, [N, M]); % 进行像素置乱 scrambled_img = gray_img(perm_mat); % 保存置乱后的图像 imwrite(scrambled_img, 'scrambled.jpg'); ``` 2. 像素扩散 像素扩散是指将图像的像素进行随机的扩散,从而增加图像的随机性,使得未经授权的人无法识别图像的内容。具体的实现步骤如下: (1)读取彩色图像,并将其转换为灰度图像。 (2)生成一个随机的扩散矩阵。 (3)将灰度图像的每个像素按照扩散矩阵进行扩散。 (4)将扩散后的图像保存到本地。 下面是一个简单的 Matlab 代码示例: ```matlab % 读取原始彩色图像 img = imread('lena.jpg'); % 转换为灰度图像 gray_img = rgb2gray(img); % 生成扩散矩阵 N = size(gray_img, 1); M = size(gray_img, 2); diff_mat = randi([-2, 2], N, M); % 进行像素扩散 diffused_img = zeros(N, M); for i = 1 : N for j = 1 : M if i == 1 up = gray_img(N, j); else up = gray_img(i - 1, j); end if i == N down = gray_img(1, j); else down = gray_img(i + 1, j); end if j == 1 left = gray_img(i, M); else left = gray_img(i, j - 1); end if j == M right = gray_img(i, 1); else right = gray_img(i, j + 1); end diffused_img(i, j) = mod(gray_img(i, j) + up + down + left + right + diff_mat(i, j), 256); end end % 保存扩散后的图像 imwrite(uint8(diffused_img), 'diffused.jpg'); ``` 3. 置乱加扩散 将像素置乱和像素扩散结合起来进行图像加密,需要先进行像素置乱,然后再对置乱后的图像进行像素扩散。具体的实现步骤如下: (1)读取彩色图像,并将其转换为灰度图像。 (2)生成一个随机的换矩阵和扩散矩阵。 (3)将灰度图像的每个像素位按照换矩阵进行换。 (4)将换后的图像进行像素扩散。 (5)将置乱加扩散后的图像保存到本地。 下面是一个简单的 Matlab 代码示例: ```matlab % 读取原始彩色图像 img = imread('lena.jpg'); % 转换为灰度图像 gray_img = rgb2gray(img); % 生成换矩阵和扩散矩阵 N = size(gray_img, 1); M = size(gray_img, 2); rand_idx = randperm(N * M); perm_mat = reshape(rand_idx, [N, M]); diff_mat = randi([-2, 2], N, M); % 进行置乱加扩散 scrambled_img = gray_img(perm_mat); diffused_img = zeros(N, M); for i = 1 : N for j = 1 : M if i == 1 up = scrambled_img(N, j); else up = scrambled_img(i - 1, j); end if i == N down = scrambled_img(1, j); else down = scrambled_img(i + 1, j); end if j == 1 left = scrambled_img(i, M); else left = scrambled_img(i, j - 1); end if j == M right = scrambled_img(i, 1); else right = scrambled_img(i, j + 1); end diffused_img(i, j) = mod(scrambled_img(i, j) + up + down + left + right + diff_mat(i, j), 256); end end % 保存置乱加扩散后的图像 imwrite(uint8(diffused_img), 'scrambled_and_diffused.jpg'); ``` 4. 图像解密 将置乱加扩散后的图像进行解密,需要先将置乱加扩散的过程反过来,即先进行像素扩散的逆操作,然后再进行像素置乱的逆操作。具体的实现步骤如下: (1)读取置乱加扩散后的图像。 (2)生成换矩阵和扩散矩阵的逆矩阵。 (3)将扩散后的图像进行像素扩散的逆操作。 (4)将像素扩散的逆操作后的图像按照换矩阵的逆矩阵进行像素置乱的逆操作。 (5)将解密后的图像保存到本地。 下面是一个简单的 Matlab 代码示例: ```matlab % 读取置乱加扩散后的图像 img = imread('scrambled_and_diffused.jpg'); % 生成换矩阵和扩散矩阵的逆矩阵 N = size(img, 1); M = size(img, 2); rand_idx = randperm(N * M); inv_perm_mat = reshape(rand_idx, [N, M]); diff_mat = randi([-2, 2], N, M); inv_diff_mat = -diff_mat; % 进行解密操作 diffused_img = zeros(N, M); for i = 1 : N for j = 1 : M if i == 1 up = img(N, j); else up = img(i - 1, j); end if i == N down = img(1, j); else down = img(i + 1, j); end if j == 1 left = img(i, M); else left = img(i, j - 1); end if j == M right = img(i, 1); else right = img(i, j + 1); end diffused_img(i, j) = mod(img(i, j) - up - down - left - right - diff_mat(i, j), 256); end end scrambled_img = diffused_img(inv_perm_mat); % 保存解密后的图像 imwrite(uint8(scrambled_img), 'decrypted.jpg'); ``` 到这里,我们就完成了彩色图像像素位置乱和像素扩散加密相结合的图像加密,并对加密后的图像进行解密的整个过程。希望这个回答能够对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fighting_FPGA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值