飞道的博客

【实践】数字图像处理DIP课程课业打卡实验4 图像锐化

431人阅读  评论(0)


叮嘟!这里是小啊呜的学习课程资料整理。好记性不如烂笔头,今天也是努力进步的一天。一起加油进阶吧!

一、实验目的

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!
更多课程知识学习记录随后再来吧!

就酱,嘎啦!

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


转载:https://blog.csdn.net/qq_43543789/article/details/106895809
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场