数字图像处理实验(二)(边缘检测)

数字图像处理实验(二)(边缘检测)

  • 内容摘要
  • Lapalace算子
  • Prewitt算子
  • Sobel算子
  • Roberts算子
  • 主程序入口

内容摘要

本篇介绍图像的边缘检测,主要有Lapalace、Prewitt、Sobel和Roberts等四种经典的图像边缘检测的算子,及其MATLAB实现代码。

Lapalace算子

代码如下:

function Img_edge=Lapalace(Img_input)
[n, m, c]=size(Img_input);
if c~=1
    Img_input=rgb2gray(Img_input);
end
Img_raw=int32(Img_input);             %防止uint8溢出
Img_edge=int32(zeros(n-2,m-2));       %舍弃边缘
for i=2:n-1
    for j=2:m-1
        Img_edge(i-1,j-1)=abs(4*Img_raw(i,j)-Img_raw(i-1,j)-Img_raw(i,j-1)-Img_raw(i,j+1)-Img_raw(i+1,j));
    end
end
end

Prewitt算子

代码如下:

function Img_edge=Prewitt(Img_input, choice)
[n, m, c]=size(Img_input);
if c~=1    
    Img_input=rgb2gray(Img_input);
end
deg=180.0/3.1415927;
Img_raw=int32(Img_input);             
Img_edge=int32(zeros(n-2,m-2));
gradient_direction=int32(zeros(n-2,m-2));
for i=2:n-1
    for j=2:m-1
        dx=Img_raw(i-1,j-1)+Img_raw(i,j-1)+Img_raw(i+1,j-1)-(Img_raw(i-1,j+1)+Img_raw(i,j+1)+Img_raw(i+1,j+1));
        dy=Img_raw(i-1,j-1)+Img_raw(i-1,j)+Img_raw(i-1,j+1)-(Img_raw(i+1,j-1)+Img_raw(i+1,j)+Img_raw(i+1,j+1));
        switch(choice)
            case 0
                Img_edge(i-1,j-1)=int32((sqrt(double(dx*dx+dy*dy))+0.5));
            case 1
                Img_edge(i-1,j-1)=abs(dx)+abs(dy);
            case 2
                if abs(dy) >= abs(dx)
                    Img_edge(i-1,j-1)=abs(dy);
                else
                    Img_edge(i-1,j-1)=abs(dx);
                end
        end
        if dx~=0
            gradient_direction(i-1,j-1)=atan(double(dy/dx))*deg;
        elseif(dy)
            gradient_direction(i-1,j-1)=90;
		else
            gradient_direction(i-1,j-1)=-90;
        end
    end
end
end

Sobel算子

代码如下:

function Img_edge=Sobel(Img_input, choice)
[n, m, c]=size(Img_input);
if c~=1
    Img_input=rgb2gray(Img_input);
end
deg=180.0/3.1415927;
Img_raw=int32(Img_input);             %防止uint8溢出
Img_edge=int32(zeros(n-2,m-2));
gradient_direction=int32(zeros(n-2,m-2));
for i=2:n-1
    for j=2:m-1
        dx=Img_raw(i-1,j-1)+2*Img_raw(i,j-1)+Img_raw(i+1,j-1)-(Img_raw(i-1,j+1)+2*Img_raw(i,j+1)+Img_raw(i+1,j+1));
        dy=Img_raw(i-1,j-1)+2*Img_raw(i-1,j)+Img_raw(i-1,j+1)-(Img_raw(i+1,j-1)+2*Img_raw(i+1,j)+Img_raw(i+1,j+1));
        switch(choice)
            case 0
                Img_edge(i-1,j-1)=int32((sqrt(double(dx*dx+dy*dy))+0.5));
            case 1
                Img_edge(i-1,j-1)=abs(dx)+abs(dy);
            case 2
                if abs(dy)>=abs(dx)
                    Img_edge(i-1,j-1)=abs(dy);
                else
                    Img_edge(i-1,j-1)=abs(dx);
                end
        end
        if dx~=0
            gradient_direction(i-1,j-1)=atan(double(dy/dx))*deg;
        elseif(dy)
            gradient_direction(i-1,j-1)=90;
		else
            gradient_direction(i-1,j-1)=-90;
        end
    end
end
end

Roberts算子

代码如下:

function Img_edge=Roberts(Img_input)
[n, m, c]=size(Img_input);
if c~=1
    Img_input=rgb2gray(Img_input);
end
Img_raw=int32(Img_input);             
Img_edge=int32(zeros(n-2,m-2));       
for i=2:n-1
    for j=2:m-1
        Img_edge(i-1,j-1)=abs(Img_raw(i,j)-Img_raw(i+1,j+1))+abs(Img_raw(i+1,j)-Img_raw(i,j+1));
    end
end
end

主程序入口

clc,clear;
Img_input=imread('img.jpg');

% Lapalace算子 Lapalace(图片像素值矩阵)
figure(1);
Img_Lapalace=Lapalace(Img_input); 
subplot(2,4,1);
imshow(uint8(Img_input));
title('原始图像');
subplot(2,4,2);
imshow(uint8(Img_Lapalace));
title('Lapalace算子边缘检测');

% Prewitt算子 Prewitt(图片像素值矩阵,公式选择)
Img_Prewitt=Prewitt(Img_input, 0);
subplot(2,4,3);
imshow(uint8(Img_input));
title('原始图像');
subplot(2,4,4);
imshow(uint8(Img_Prewitt));
title('Prewitt算子边缘检测');

% Sobel算子 Sobel(图片像素值矩阵,公式选择)
Img_Sobel=Sobel(Img_input, 0);
subplot(2,4,5);
imshow(uint8(Img_input));
title('原始图像');
subplot(2,4,6);
imshow(uint8(Img_Sobel));
title('Sobel算子边缘检测');

% Roberts算子 Roberts(图片像素值矩阵)
Img_Roberts=Roberts(Img_input);
subplot(2,4,7);
imshow(uint8(Img_input));
title('原始图像');
subplot(2,4,8);
imshow(uint8(Img_Roberts));
title('Roberts算子边缘检测');

图片:
数字图像处理实验(二)(边缘检测)_第1张图片

你可能感兴趣的:(数字图像处理)