索贝尔(Sobel)算子是计算机视觉领域的一种重要处理方法。主要用于获得数字图像的一阶梯度,常见的应用和物理意义是边缘检测。索贝尔算子是把图像中每个像素的上下左右四领域的灰度值加权差,在边缘处达到极值从而检测边缘。
该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。如果以A代表原始图像,Gx及Gy分别代表经横向及纵向边缘检测的图像,其公式如下:
图像的每一个像素的横向及纵向梯度近似值可用以下的公式结合,来计算梯度的大小。
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分量图像');
结果: