1、圖像加密
(1)異或的基本概念
函數: c = xor(a, b)
(2)按位異或
函數: c = bitxor(a, b)
%% 按位異或 a = 5; b = 4; c = bitxor(a,b);
(3)二值圖像異或圖像加密/解密
%% 二值圖像按位異或 I = imread('lena.jpg'); I = im2bw(I); % 彩色圖像轉為二值圖像 subplot(2,2,1),imshow(I),title('原始圖像'); key = creatBI(0.98); subplot(2,2,2),imshow(key),title('密鑰圖像'); secret_image = bitxor(I,key); subplot(2,2,3),imshow(secret_image),title('加密圖像'); recv_image = bitxor(secret_image,key); subplot(2,2,4),imshow(recv_image),title('解密圖像');
(4)灰度圖像異或加密/解密
%% 灰度圖像按位異或 I = imread('lena.jpg'); I = rgb2gray(I); % 彩色圖像轉為灰度圖像 subplot(2,2,1),imshow(I),title('原始圖像'); key = grayImage(0.98); subplot(2,2,2),imshow(key),title('密鑰圖像'); secret_image = bitxor(I,key); subplot(2,2,3),imshow(secret_image),title('加密圖像'); recv_image = bitxor(secret_image,key); subplot(2,2,4),imshow(recv_image),title('解密圖像');
(5)彩色圖像異或加密/解密
%% 彩色圖像按位異或 I = imread('secret.png'); subplot(2,2,1),imshow(I),title('原始圖像'); key = RgbImage(0.98,0.56,0.23); subplot(2,2,2),imshow(key),title('密鑰圖像'); secret_image = bitxor(I,key); subplot(2,2,3),imshow(secret_image),title('加密圖像'); recv_image = bitxor(secret_image,key); subplot(2,2,4),imshow(recv_image),title('解密圖像');
2、數組方式處理圖像
(1)幾何變換——自定義截取圖像
%% 自定義截取子圖像 I = imread('lena.jpg'); m = 100:300; n = 100:300; J = I(m,n); subplot(1,2,1),imshow(I); subplot(1,2,2),imshow(J);
(2)幾何變換——移動
新圖像(X,Y) = 原圖像(X+M, Y+N)
%% 移動 I = imread('lena.jpg'); I = rgb2gray(I); [m,n] = size(I); x = 201:m; y = 101:n; new = zeros(m,n); new(x,y) = I(x-200,y-100); subplot(1,2,1),imshow(I,[]); subplot(1,2,2),imshow(new,[]);
(3)自定義均值去噪
%% 自定義均值去噪函數調用 I = imread('lena.jpg'); I = rgb2gray(I); % 彩色圖像轉換為灰度圖像 J = imnoise(I,'salt & pepper'); subplot(1,2,1),imshow(J,[]); [m,n] = size(J); x = 2:m-1; y = 2:n-1; new = zeros(m,n); o = double(J); new(x,y) = (o(x-1,y)+o(x-1,y-1)+o(x-1,y+1)+o(x+1,y)+... o(x+1,y+1)+o(x+1,y-1)+o(x,y+1)+o(x,y-1))/8; subplot(1,2,2),imshow(new,[]);
(4)自定義二值化去噪
符合要求的下標 = find(條件)
%% 自定義二值化去噪 I = imread('lena.jpg'); I = rgb2gray(I); % 彩色圖像轉換為灰度圖像 subplot(1,2,1),imshow(I,[]); [m,n] = size(I); new = zeros(m,n); index = find(I>128); new(index) = 255; subplot(1,2,2),imshow(new,[]);
(5)自定義獲取邊緣
%% 自定義獲取邊緣 I = imread('cameraman.tif'); subplot(1,2,1),imshow(I,[]); [m,n] = size(I); x = 2:m-1; y = 2:n-1; key = 20; % 閾值 index = find(abs(I(x,y)-I(x-1,y))>key... | abs(I(x,y)-I(x,y-1))>key... | abs(I(x,y)-I(x+1,y))>key... |abs(I(x,y)-I(x,y+1))>key); edge = ones(m-2,n-2); edge(index) = 0; subplot(1,2,2),imshow(edge,[]);
3、圖像置亂
(1)置亂序列的生成
① 生成數據序列:混沌系統
② 生成置亂序列:
%% 置亂序列的生成 clc; clear all; x = linspace(0,0,20); x(1) = 0.98; for i = 2:20 x(i) = 1-2*x(i-1)*x(i-1); end [a,b] = sort(x); % 生成置亂序列
(2)置亂序列的編碼實現
%% 置亂序列的編碼實現 clc; clear all; a = linspace(55,64,10); c = linspace(0,0,10); c(1) = 0.56; for i = 2:10 c(i) = 1-2*c(i-1)*c(i-1); end [cI,b] = sort(c); i = 1:10; ax(i) = a(b(i)); % b(i)是亂序序列,置亂 ay(b(i)) = ax(i); % 還原
(3)圖像置亂
%% 圖像置亂 a = imread('lena.jpg'); % a = im2bw(a); % 轉成二值圖像 [m,n] = size(a); x = linspace(0,0,m*n); x(1) = 0.23; for i=2:m*n x(i) = 1-2*x(i-1)*x(i-1); end [xs,xIndex] = sort(x); i = 1:m*n; aSecret = a; % 設置初始大小 aDe = a; % 設置初始大小 aSecret(i) = a(xIndex(i)); aDe(xIndex(i)) = aSecret(i); subplot(1,3,1),imshow(a);title('原始圖像'); subplot(1,3,2),imshow(aSecret);title('置亂圖像'); subplot(1,3,3),imshow(aDe);title('逆置亂圖像');