1.讀入一副圖像,對其進行縮放。
源代碼:
clear;
% 讀入圖像函數imread();
% 參數:‘文件名/文件路徑’
I=imread('lena.tif');
% 圖像縮放函數imresize();
% 參數:圖像對象,縮放倍率
I1=imresize(I,0.5);
I2=imresize(I,2);
% 顯示圖像函數imshow();
% 參數:圖像變量;
imshow(I);
title('原圖')
figure
imshow(I1);
title('0.5倍縮放圖像')
figure
imshow(I2);
title('2倍縮放圖像')
實驗結果:
結果分析:
matlab中使用imresize()函數實現圖像大小的修改,倍數大於1時放大,小於則反之,如果修改圖片大小後,還以相同比例的圖形用戶界面顯示,顯示改變的則是圖像的清晰度。
2.讀入一副圖像,對其添加椒鹽噪聲,用均值濾波器對其進行濾波;對其添加高斯噪聲,用高斯濾波器對其進行濾波。
源代碼:
clear;
I=imread('lena.tif');
% 添加噪聲函數imnosie();
% 參數:待處理圖像,'method',噪聲密度
J1=imnoise(I,'gaussian');
J2=imnoise(I,'salt & pepper');
% 二維圖像濾波器創建函數fepecial();
% 參數:'method',濾波區間/半徑,濾波密度
h1=fspecial('gaussian',[5,5]);
h2=fspecial('average',[5,5]);
J0=rgb2gray(J1);
h3=medfilt2(J0,[5,5]);
% 濾波實現函數imfilter();
% 參數:濾波對象,濾波器
F1=imfilter(J1,h1);
F2=imfilter(J2,h2);
subplot(2,3,1);
imshow(I);title('原圖')
subplot(2,3,2);
imshow(J1);title('高斯噪聲圖')
subplot(2,3,3);
imshow(J2);title('椒鹽噪聲圖')
subplot(2,3,4);
imshow(h3);title('中值濾波圖')
subplot(2,3,5)
imshow(F1);title('高斯濾波圖')
subplot(2,3,6)
imshow(F2);title('均值濾波圖')
實驗結果:
結果分析:
matlab中使用imnoise()函數爲圖像添加噪聲,添加何種噪聲由參數決定;之後想要濾波則可以先借助fspecial()函數創建濾波器,同時指定相應的濾波方法,再只用imfilter()函數實現濾波即可。
3.讀入一副圖像,對其提取邊緣。
源代碼:
clear;
I=imread('lena.tif');
% 彩圖圖片轉化灰度圖函數rgb2gray();
% 參數待轉化的三維彩色圖片,數據由三維降到二維;
gray=rgb2gray(I);
% 邊緣提取函數edge();
% 參數:處理對象(灰度圖),'提取方法',起始門檻,方向(等)
BW1=edge(gray,'sobel');
% Sobel算子檢測方法對灰度漸變和噪聲較多的圖像處理效果較好,Sobel算子對邊緣定位不是很準確,圖像的邊緣不止一個像素。
BW2=edge(gray,'roberts');
% Roberts算子檢測方法對具有陡峭的低噪聲的圖像處理效果較好,但是利用roberts算子提取邊緣的結果是邊緣比較粗,因此邊緣的定位不是很準確。
BW3=edge(gray,'prewitt');
% Prewitt算子檢測方法對灰度漸變和噪聲較多的圖像處理效果較好。但邊緣較寬,而且間斷點多。
BW4=edge(gray,'canny');
% Canny算子是目前邊緣檢測最常用的算法,效果也是最理想的。
BW5=edge(gray,'log');
% Laplacian算子法對噪聲比較敏感,所以很少用該算子檢測邊緣,而是用來判斷邊緣像素視爲與圖像的明區還是暗區。
subplot(2,3,1)
imshow(gray);title('灰度圖')
subplot(2,3,2);
imshow(BW1);title('sobel算子提取')
subplot(2,3,3);
imshow(BW2);title('roberts算子提取')
subplot(2,3,4);
imshow(BW3);title('prewitt算子提取')
subplot(2,3,5);
imshow(BW4);title('canny算子提取')
subplot(2,3,6);
imshow(BW5);title('laplasian算子提取')
實驗結果:
結果分析:
matlab中圖片邊緣提取函數爲edge()函數,其中第一個參數,即待處理圖片須是灰度圖,然後提取方法有很多的算子,不同的算法機理不同,因此得到的提取效果也大不相同。
4.讀入一副圖像,對其進行直方圖統計。
源代碼:
clear;
I=imread('lena.tif');
G=rgb2gray(I);
% 通過直方圖均衡化來增加灰度圖像(原圖)對比度,函數histeq(I)
% 參數:待均衡灰度圖;
J=histeq(I);
subplot(2,2,1)
imshow(I);title('原圖')
subplot(2,2,2)
% 得到圖像數據的灰度直方圖,imhist(I,n)函數
% 參數:待處理圖像(灰度圖像),(n爲指定的灰度級)默認256
imhist(G,32);title('32直方統計圖')
subplot(2,2,3)
imshow(J);title('均衡化的圖')
subplot(2,2,4)
imhist(J,32);title('32均衡化的直方統計圖')
實驗結果:
結果分析:
matlab中使用histeq()函數實現圖像均衡化處理,即對比度調整,參數爲待處理的圖像和均衡化等級,處理後的圖片色彩對比有明顯變化,在直方圖中則更加直觀,所有亮度範圍的直方統計圖都大致相同,沒有原圖像那樣突出或凹陷的部分。
5.讀入一副圖像,對其進行增強。
源代碼:
clear;
I=imread('lena.tif');
G=rgb2gray(I);
% 灰度圖的灰度轉換,imadjust(I)函數;
% 參數:待處理圖像(自動調整);
% 或者
% imsdjust(I,[low-in hign-in],[low-out high-out])
% 灰度輸入以及輸出範圍;
% 輸入灰度小於low_in,則輸出灰度爲low_out;
% 輸入灰度大於high_in,則輸出灰度爲high_out;
% 將low_in至high_in間值映射到low_out至high_out之間;
J1=imadjust(G);
J2=imadjust(G,[0,1],[1,0]);
H=histeq(G);
subplot(2,2,1);
imshow(G);title('原灰度圖')
subplot(2,2,2);
imshow(H);title('對比度增強圖')
subplot(2,2,3);
imshow(J1);title('灰度自動調整圖')
subplot(2,2,4);
imshow(J2);title('黑白顛倒圖')
實驗結果:
結果分析:
matlab中圖像增強處理,可以imjust()函數進行亮度調整,或者是histeq()函數實現對比度的調節,需要注意的是imjust()函數處理對象須爲灰度圖,故對於彩色圖像處理前面需要進行類型轉化操作。
6.讀入一副圖像,在其中添加水印,然後將添加進去的水印提取出來。
源代碼:
clear;clc;
% 使用最低有效位LSB圖像水印法添加水印;
% least significant bit,通過分離圖層,將水印圖層替換到原圖低層,以實現水印的“不外露”添加;
% % 背景圖片;
img=imread('lena.tif');
imgsize=size(img);
% 提取原圖比特平面;
bitplane=zeros(imgsize(1),imgsize(2),8);
for i=1:8 % 各個圖層的處理;
for row=1:imgsize(1)% 圖片行;
for column=1:imgsize(2)% 圖片列;
bitplane(row,column,i)=bitget(img(row,column),i);
end
end
end
%繪製原圖bitplane;
figure(1)
for i=1:8
subplot(2,4,i)
imshow(im2uint8(255*bitplane(:,:,i)));
title(['BitPlane ',num2str(i)])
end
% % 水印圖片;
imgMark=imread('txt.tif');
imgMarksize=size(imgMark);
% 提取水印比特平面;
bitplaneM=zeros(imgMarksize(1),imgMarksize(2),8);
for i=1:8
for row=1:imgMarksize(1)
for column=1:imgMarksize(2)
bitplaneM(row,column,i)=bitget(imgMark(row,column),i);
end
end
end
%繪製水印bitplane;
figure(2)
for i=1:8
subplot(2,4,i)
imshow(im2uint8(255*bitplaneM(:,:,i)));
title(['BitPlane ',num2str(i)])
end
% % 構造新的bitplane,即嵌套水印;
newbitplane=bitplane;
newbitplane(:,:,1)=bitplaneM(:,:,6);
newbitplane(:,:,2)=bitplaneM(:,:,7);
newbitplane(:,:,3)=bitplaneM(:,:,8);
% 替換背景圖片低層bitplane後,生成新的含水印的圖片;
newimg=zeros(256,256);
for i=1:8
newimg=newimg+newbitplane(:,:,i)*2^(i-1);
% 不同的bitplane乘以響應的權值,計算出灰度圖(8位)的參數值;
end
newimg=uint8(newimg);%轉換爲8位無符號整數數據類型;
figure(3)
imshow(newimg);%展示水印嵌套圖片;
title('水印嵌套圖片')
% % 水印提取(添加水印的逆過程);
bitplanerec=zeros(imgsize(1),imgsize(2),8);
for i=1:8
for row=1:imgsize(1)
for column=1:imgsize(2)
bitplanerec(row,column,i)=bitget(newimg(row,column),i);
end
end
end
figure(4)
for i=1:8
subplot(2,4,i)
% 展示嵌套後的圖層;
imshow(im2uint8(255*bitplanerec(:,:,i)));
title(['BitPlane ',num2str(i)])
end
% 複製水印圖,即將水印圖層賦值給新的變量,生成水印提取圖片;
newimgM=zeros(imgsize(1),imgsize(2));
for i=1:3
newimgM=newimgM+bitplanerec(:,:,i)*2^(4+1);
end
figure(5)
imshow(im2uint8(newimgM));
title('水印提取圖片')
實驗結果及分析:
背景待嵌入圖片的八個圖層,可以看出隨着圖層(權值)的增加,圖像信息越多,也就是說低圖層的信息顯示在主圖上不明顯,因此可以使用水印的高圖層替換背景圖的低圖層,實現幾乎不能使用肉眼辨別的水印的添加。
待嵌入水印圖片的八個圖層,
如圖爲水印添加的嵌套圖片,可以看出水印添加的隱藏效果是非常好的,肉眼以及無法辨別圖片是否有水印,直觀上看着和原背景一樣。
但是提取該圖的八個子圖層,並分別繪製出來,此時便可以清晰的看出水印已經添加到嵌套結果圖中。
而對於水印的提取,則可以利用圖層分解合成的逆過程實現,將上述嵌套結果圖分層繪製,可以看出有三個圖層都是有關水印圖片的信息,因此可以將該三層信息(矩陣)賦值給新的變量,並整合轉化數據類型(這裏轉化爲8位無符號整形),以便於以直觀的圖片形式呈現出來。
希望此文檔對你有所幫助,謝謝大家的觀看,查看更多精彩內容請關注微信公衆號“理工科日記”!!