1. 程式人生 > >Matlab-影象處理及數字水印生成

Matlab-影象處理及數字水印生成

  • 影象寫入

1.一般影象寫入:imwrite(x,'filename','permission');permission影象儲存型別,例如:imwrite(x,'lena22.bmp','bmp');
2.索引影象寫入:imwrite(data,map,'filename','permission);例如:imwrite(data,map,'woman22.bmp','bmp');

  • 影象資料儲存及載入

可以將現有變數儲存為資料檔案格式,利用 load函式命令,進行資料載入。‘save x ;’儲存變數 x 為 x.mat 格式資料檔案,資料變數與資料檔名稱相同;‘load a.mat ;’載入 a.mat 資料檔案,生成資料變數 a,資料檔案與資料變數名稱相同。

  • 影象格式轉換

1.將灰度影象根據不用閾值轉換為二值影象
gray=imread('rgb_to_gray.bmp');
gray_to_binary1=im2bw(gray,0.5);
gray_to_binary2=im2bw(gray,0.4);
gray_to_binary3=im2bw(gray,0.7);
gray_to_binary4=im2bw(gray,0.2);
2.將彩色影象轉換為灰度影象
rgb=imread('lena_rgb.bmp');
rgb_to_gray=rgb2gray(rgb);

  • 灰度影象直方圖顯示

灰度影象的直方圖事是影象的亮度分佈的概率密度函式,是一幅影象的所有象素集合的最基本的統計規律,它反映的是影象的灰度值的分佈情況。‘imhist(gray);’將原影象 I 直方圖顯示‘imhist(gray,4);’將原影象 I 直方圖顯示為 n 級灰度。

  • 影象加減運算-兩幅影象加減運算,必須保證影象大小一致

1.影象相加運算(imadd)
a) 完成兩幅影象的相加運算。例如:‘testadd=imadd(gray,y);’ 要求 x 與 y 矩陣大小一致
b) 彩色影象 RGB 分通道顯示,選定某一通道進行單通道顏色加強(影象資料矩陣與常數相加)。
rgb_r=rgb(:,:,1);
rgb_g=rgb(:,:,2);
rgb_b=rgb(:,:,3);
rgb_b_add=rgb_b+88;
new_rgb(:,:,1)=rgb_r;
new_rgb(:,:,2)=rgb_g;
new_rgb(:,:,3)=rgb_b_add;
2.影象相減運算(imsubtract)


a) 完成兩幅影象的相減運算。例如:‘testsub=imsubtract(gray,y);’要求 x 與 y 矩陣大小一致
b) 將影象資料減去一個常數。例如:‘gray_sub=gray-44;’

  • 影象幾何變換

1.影象的插值縮放
a) 最近鄰插值:輸出畫素的賦值為當前點的畫素點。
b)雙線性插值:輸出畫素的賦值為 2×2 矩陣所包含的有效點的加權平均值。
c) 雙三次插值:輸出畫素的賦值為 4×4 矩陣所包含的有效點的加權平均值。
y1=imresize(y,1.5,'nearest'); %利用最近鄰插值方法將 I 放大 1.5倍
y2=imresize(y,1.5,'bilinear'); %利用雙線性插值方法將 I 放大 1.5倍
y3=imresize(y,1.5,'bicubic'); %利用雙三次插值方法將 I 放大 1.5 倍
2.插值旋轉
gray1=imrotate(gray,30,'nearest') % 利用最近鄰插值方法將 I 逆時針旋轉 30 度
gray2=imrotate(gray,30,'bilinear','crop') % 利用雙線性插值方法將 I 逆時針旋轉 30 度,大小保持不變。
3.影象的剪下
gray3=imcrop(gray,[40,50,200,200]); %給定大小剪下,前切起始位置為(40,50),大小為200*200
gray4=imcrop(gray); %利用滑鼠互動對影象進行剪下

  • 影象拼接-水平拼接,要求兩幅影象行數相同;垂直拼接,要求兩幅影象列數相同

‘gray22=cat(2,gray,gray);’實現影象的水平拼接、垂直拼接,A1 和 A2 為讀入的影象矩陣。

二、數字水印生成

  • 生成偽隨機數

‘rand('state',0); ’生成偽隨機數種子,‘r=rand(m,n); ’生成m行n列的0-1區間的偽隨機數,將偽隨機數二值化時,建議設定閾值(0.5),將偽隨機數轉化為0和1。
%灰度影象二值化
gray_to_binary_w=im2bw(w);
imshow(gray_to_binary_w);
rand('state',0);%隨機數初值為1
r=rand(512,512);%生成512*512的隨機數矩陣
%偽隨機數矩陣二值化
r(r<0.5)=0;
r(r>0.5)=1;

  • 讀入水印影象

a) 讀入灰度影象,並將其二值化。
b) 直接讀入二值水印影象

  • 水印影象與偽隨機數調製-水印加密

‘z=xor(gray_to_binary_w,r);’,w為二值水印影象,x為偽隨機數,z為加密後的二值水印影象,xor為異或運算。

  • 加密後水印影象解密

通過判斷加密後的水印影象與偽隨機數的異同,判斷原始水印資料。
%解密
w1=xor(z,r);
imshow(w1);