【matlab】小學都能學會的數字圖像處理

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位無符號整形),以便於以直觀的圖片形式呈現出來。​

希望此文檔對你有所幫助,謝謝大家的觀看,查看更多精彩內容請關注微信公衆號“理工科日記”!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章