Sobel 边缘检测 matlab代码实现

索贝尔(Sobel)算子是计算机视觉领域的一种重要处理方法。主要用于获得数字图像的一阶梯度,常见的应用和物理意义是边缘检测。索贝尔算子是把图像中每个像素的上下左右四领域的灰度值加权差,在边缘处达到极值从而检测边缘。

该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。如果以A代表原始图像,GxGy分别代表经横向及纵向边缘检测的图像,其公式如下:

 图像的每一个像素的横向及纵向梯度近似值可用以下的公式结合,来计算梯度的大小。

Matlab代码实现:

clc;
clear all;
close all;

RGB_data = imread('G:\picture_deal\matlab_code\chepai2.bmp');%图像读入

[height,width, DIM] = size(RGB_data); %提取图片的行列数

Y_data = zeros(height,width);
Cb_data = zeros(height,width);
Cr_data = zeros(height,width);
Gray_data = RGB_data;

R_data =    RGB_data(:,:,1);
G_data =    RGB_data(:,:,2);
B_data =    RGB_data(:,:,3);

for r = 1:height
    for c = 1:width
        Y_data(r, c) = 0.299*R_data(r, c) + 0.587*G_data(r, c) + 0.114*B_data(r, c);
        Cb_data(r, c) = -0.172*R_data(r, c) - 0.339*G_data(r, c) + 0.511*B_data(r, c) + 128;
        Cr_data(r, c) = 0.511*R_data(r, c) - 0.428*G_data(r, c) - 0.083*B_data(r, c) + 128;
    end
end

Gray_data(:,:,1)=Y_data;
Gray_data(:,:,2)=Y_data;
Gray_data(:,:,3)=Y_data;

figure(1);
imshow(Gray_data);
title('Y分量灰度图像'); 

%sobel边缘检测计算
for i = 2:height - 1   
    for j = 2:width - 1
        Gx = (Y_data(i+1,j-1) + 2*Y_data(i+1,j) + Y_data(i+1,j+1)) - (Y_data(i-1,j-1) + 2*Y_data(i-1,j) + Y_data(i-1,j+1));
        Gy = (Y_data(i-1,j+1) + 2*Y_data(i,j+1) + Y_data(i+1,j+1)) - (Y_data(i-1,j-1) + 2*Y_data(i,j-1) + Y_data(i+1,j-1));
        temp(i,j)=floor(sqrt(Gx^2 + Gy^2));
        if(uint8((sqrt(Gx^2 + Gy^2))) > 150)
            uSobel(i,j) = 0; %
        else
            uSobel(i,j) = 255;
        end
    end
end 

uSobel(480,:)=uSobel(1,:);
uSobel(:,640)=uSobel(:,1);

Gray_data(:,:,1)=uSobel;
Gray_data(:,:,2)=uSobel;
Gray_data(:,:,3)=uSobel;

figure(2);
imshow(Gray_data);
title('sobel算子后的Y分量图像');



 结果:

Sobel 边缘检测 matlab代码实现_第1张图片

 

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