🔥 内容介绍
一、图像加密与压缩的背景及重要性
在当今数字化信息时代,图像作为信息传播的重要媒介,广泛应用于互联网、医疗、军事等众多领域。随着图像数据的大量产生和传输,保护图像信息的安全性以及高效存储和传输图像数据变得至关重要。
- 图像加密的必要性:图像可能包含敏感信息,如军事战略图、医疗诊断图像等。为防止这些信息在传输和存储过程中被窃取或篡改,需要对图像进行加密,将原始图像转换为不可理解的密文形式,只有授权用户才能解密恢复原始图像。
- 图像压缩的意义:高分辨率图像通常占据大量存储空间,给存储设备和传输带宽带来巨大压力。图像压缩旨在减少图像数据量,同时尽可能保留图像的重要信息,以便于图像的存储和快速传输。将图像加密与压缩相结合,可以在保障图像信息安全的同时,提高存储和传输效率。
二、SCAN 模式概述
SCAN 模式是一种基于空间填充曲线(Space - Filling Curve)的扫描方式。空间填充曲线是一种能够遍历空间中所有点的曲线,通过特定的顺序连接空间中的离散点,将高维空间的点映射到一维序列上。常见的空间填充曲线有希尔伯特曲线(Hilbert Curve)、Z - 曲线(Z - Curve)等。在图像领域,SCAN 模式利用这些空间填充曲线对图像像素进行扫描,将二维图像的像素按一定顺序转化为一维序列。
三、基于 SCAN 模式的图像加密原理
- 像素位置扰乱:基于 SCAN 模式的加密首先对图像像素进行重新排列。利用空间填充曲线的特性,按照特定的 SCAN 模式(如希尔伯特曲线扫描)对图像像素进行遍历,将二维图像的像素转化为一维序列。这种重新排列改变了图像像素的空间位置关系,使得原始图像的结构信息被打乱。例如,原本相邻的像素在经过 SCAN 模式扫描后,在一维序列中可能相距甚远。这样,从密文图像的像素分布上,很难直观地看出原始图像的内容,实现了对图像位置的扰乱,增加了加密的安全性。
- 像素值变换:在像素位置扰乱的基础上,对一维序列中的像素值进行变换。可以采用多种方式,如结合加密密钥对像素值进行非线性变换。例如,使用一个与密钥相关的函数对像素值进行运算,将每个像素值映射到一个新的值。由于密钥参与像素值变换过程,只有知道正确密钥的用户才能通过逆变换还原原始像素值。这种像素值变换进一步混淆了图像信息,增强了加密效果。
四、基于 SCAN 模式的图像压缩原理
- 利用像素相关性:在按 SCAN 模式将图像像素转换为一维序列后,利用像素间的相关性进行压缩。由于空间填充曲线的特性,在一维序列中相邻的像素在原始图像空间中往往具有一定的空间相关性(即使经过位置扰乱,仍保留部分相关性)。可以采用预测编码的方法,根据前面像素的值预测当前像素的值,然后对预测误差进行编码。例如,对于灰度图像,可以利用前一个像素的灰度值预测当前像素的灰度值,只对预测值与实际值之间的差值进行编码,这样可以减少数据量,因为预测误差通常比原始像素值的动态范围小。
- 熵编码:对经过预测编码得到的预测误差序列或其他中间数据进行熵编码。熵编码是一种无损压缩方法,它根据数据的统计特性,对出现概率高的符号赋予较短的编码,对出现概率低的符号赋予较长的编码。例如,霍夫曼编码、算术编码等都是常见的熵编码方法。通过熵编码,可以进一步减少数据量,实现图像的压缩。
五、基于 SCAN 模式的图像加密与压缩结合的优势
- 提高安全性:SCAN 模式的图像加密通过位置扰乱和像素值变换,有效地破坏了图像的原始结构和像素间的统计关系。在压缩过程中,即使数据量减少,但加密后的图像结构已被打乱,攻击者难以从压缩后的密文图像中获取有价值的信息,从而提高了图像的安全性。
- 增强压缩效率:基于 SCAN 模式的压缩利用了像素在空间填充曲线扫描后的相关性,能够更有效地去除图像数据中的冗余信息。同时,加密过程并没有破坏像素间的这种可利用的相关性,使得压缩算法在加密后的图像上依然能够发挥较好的压缩效果,进一步提高了压缩效率。
⛳️ 运行结果
📣 部分代码
function out = convert2blocks_de_CScan( im, car )
%UNTITLED Summary of this function goes here
% Detailed explanation goes here
C = mat2cell(im, [256 256], [256 256]);
M = mat2cell(car, [256 256], [256 256]);
Block1 = cell2mat(C(1,1));
Block2 = cell2mat(C(1,2));
Block3 = cell2mat(C(2,1));
Block4 = cell2mat(C(2,2));
CarBlock1 = cell2mat(M(1,1));
Block1 = decryptBlockCScan(Block1, CarBlock1);
Block2 = decryptBlockCScan(Block2, CarBlock1);
Block3 = decryptBlockCScan(Block3, CarBlock1);
Block4 = decryptBlockCScan(Block4, CarBlock1);
HorzOne = horzcat(Block1, Block2);
HorzTwo = horzcat(Block3, Block4);
out = vertcat(HorzOne, HorzTwo);
end