【實踐】數字圖像處理DIP課程課業打卡實驗4 圖像銳化


叮嘟!這裏是小啊嗚的學習課程資料整理。好記性不如爛筆頭,今天也是努力進步的一天。一起加油進階吧!
在這裏插入圖片描述

一、實驗目的

1、掌握一階銳化算法的工作原理和算法實現。
2、掌握二階銳化算法的工作原理和算法實現。

二、實驗內容

1、 實現拉普拉斯銳化。

測試圖像:’Grayblur6.png’。
(備註:將執行正確的代碼粘貼在此處,核心代碼要求有註釋)

im= imread('im\Grayblur6.png' );
imshow(im);
title('原始圖像' );
im0=im;
im = double(im) ;

H=[0 -1 0;-1 4 -1;0 -1 0];
im1=filter2(H, im) ;
im2=uint8(im1+im) ;
figure; 
imshow(im2) ;
title('Laplacian銳化疊加後圖像');

im_L0 = uint8(im1);
figure, imshow(im_L0); 
title('Laplacian鋭化');

maxV = max(max(im1));
minV = min(min(im1));
delta =0;

if (minV<0)
delta=abs(minV) ;
end
im12=(im1+delta);
figure,imshow(uint8(im12));
title('Laplacian銳化圖像');

在這裏插入圖片描述

2、實現Sobel微分算子的代碼。

測試圖像:’Grayblur6.png’。
(備註:將執行正確的代碼粘貼在此處,核心代碼要求有註釋)

im=imread('im\Grayblur6.png' );
imshow(im); title('原始圖像' ) ;
im = double(im) ;

H=[-1 0 1;-2 0 2;-1 0 1];
Dy=filter2( H, im );

H=[-1 -2 -1;0 0 0;1 2 1];
Dx=filter2( H, im );

im_2 = sqrt(Dx.^2+Dy.^2);
im_2=uint8(im_2) ;
figure, imshow(im_2), title(' Sobel銳化圖像' ); %顯示濾波後的圖像

im_3 = uint8 (im+sqrt (Dx.^2+Dy.^2)*0.1);

figure, imshow(im_3), title('Sobel銳化疊加圖像' ); %顯示濾波後的圖像

在這裏插入圖片描述

3、實現交叉微分算法(Roberts算法)。

測試圖像:’Grayblur6.png’。

讀入圖像到矩陣F
得到F的行列數與顏色通道數:m,n,c
如果顏色通道數c>1,則將彩色圖像轉化爲灰度圖rgb2gray
初始化輸出矩陣G
對於F的每一行i(1到m-1)
     對於F的每一列j(1到n-1) 
     根據以下公式,由F(i,j)F(i+1,j)F(i,j+1)F(i+1,j+1)計算G(i,j)
顯示Roberts銳化圖像
顯示Roberts銳化併疊加原圖的結果圖像

(備註:將執行正確的代碼粘貼在此處,核心代碼要求有註釋)

im = imread('im\Grayblur6.png');
imshow(im);
title('原始圖像');
im = double(im);

[m,n,c]=size(im);
g=zeros(m,n);
for i=1:m-1
    for j=1:n-1
        % 交叉微分
        g(i,j) = abs(im(i+1,j+1)-im(i,j)) + abs(im(i+1,j)-im(i,j+1));
    end
end

im2 = uint8(g);
figure,imshow(im2);
title('交叉微分(Roberts)銳化所得的圖像');

figure,imshow(uint8(g+im));
title('交叉微分(Roberts)銳化併疊加原圖所得的圖像');

在這裏插入圖片描述

三、拓展:實現圖像的壓縮和解壓縮

尚未完成。

參考建議:
https://blog.csdn.net/ywsydwsbn/article/details/106341759

在這裏插入圖片描述
main_Jepg.m

Fy=[16 11 10 16 24 40 51 61;
    12 12 14 19 26 58 60 55;
    14 13 16 24 40 57 69 56;
    14 17 22 29 51 87 80 62;
    18 22 37 56 68 109 103 77;
    24 35 55 64 81 104 113 92;
    49 64 78 87 103 121 120 101;
    72 92 95 98 112 100 103 99;
    ];

image=imread( 'im\f11.jpg' );

[JpegCmpData, Im] =JpegCmp(image , Fy);
save('m1.mat', 'Im');
save('m2.mat' ,'JpegCmpData');

[Im2] =JpegDeCmp(JpegCmpData ,Fy);

JpegDeCmp.m

function [Im2] =JpegDeCmp(JpegCmpData ,Fy)


m=NumRow*8;
n=NumCol*8;      //****5
Im2=zeros (m, n) ;

for i=1:NumRow
    for j=1:NumCol
        RLEcode=JpegCmpData(i, j);
        F=GetRLEcode0(RLEcode) ;
        F=F.*Fy;
        patch=idct2(F) ;
        Im2(8*(i-1)+1:8*i, 8*(j-1)+1:8*j)=patch;
    end
end
Im2=uint8 (Im2);
end

function F=GetRLEcode0(RLEcode)
F=zeros(8, 8);
[t]=size (RLEcode, 1);
for i=1:t
    ind=RLEcode(i) ;
    F(ind:end) =RLEcode(i,2) ;
end
end

JpegCmp.m

function [JpegCmpData, Im] =JpegCmp( Im0 ,Fy)
[m0, n0, c]=size (Im0) ;
if c==3
    Im0=rgb2gray (Im0) ;
end

m=m0-mod(m0, 8) ;
n=n0-mod(n0, 8) ;
Im=Im0(1:m, 1:n);
NumRow=m/8;
NumCol=n/8;
JpegCmpData{NumRow, NumCol}=[];
for i=1:NumRow
    for j=1:NumCol
        patch=Im(8*(i-1)+1:8*i, 8*(j-1)+1:8*j);
        F=dct2(patch) ;
        F=round(F./Fy) ;
        RLEcode=GetRLEcode(F) ;
        JpegCmpData{i, j}=RLEcode;
    end
end
end

function RLEcode=GetRLEcode(F)
[m n]=size(F);
c=F(1);
RLEcode(1, 1:2)=[1,c];%建立數組RLEcode
t=2;
for i=2:m*n
    if (not(F(i)==c))
        RLEcode(t, 1:2)=[i,F(i)];
        c=F(i) ;
        t=t+1 ;
    end
end
end

Ending!
更多課程知識學習記錄隨後再來吧!

就醬,嘎啦!

在這裏插入圖片描述

注:
人生在勤,不索何獲。

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