作者:寒空动烟雪 | 来源:互联网 | 2024-11-13 10:13
图像边缘是指图像中灰度值发生显著变化的区域。Sobel算子是一种常用的边缘检测方法,通过计算图像灰度值的梯度来检测边缘。本文介绍了Sobel算子的基本原理,并提供了基于MATLAB的实现代码。
图像边缘是指图像中灰度值发生显著变化的区域。这些区域通常表示目标、背景或不同区域之间的边界。Sobel算子是一种常用的边缘检测方法,通过计算图像灰度值的梯度来检测边缘。
Sobel算子是一种离散型差分算子,用于计算图像亮度函数的灰度近似值。边缘检测的核心在于像素矩阵的卷积操作。卷积操作在数字图像处理中非常重要,许多图像处理算法都通过卷积来实现。卷积运算的本质是对指定图像区域的像素值进行加权求和的过程。
具体来说,卷积运算的计算过程如下:图像区域中的每个像素值分别与卷积模板的每个元素对应相乘,然后将结果求和,得到的和即为卷积运算的结果。Sobel算子的卷积因子包括横向和纵向的卷积核,分别记为Gx和Gy。将这两个因子与原始图像进行卷积运算,得到每个像素点的横向和纵向灰度值Gx和Gy。最后,通过以下公式计算每个像素点的梯度大小:
为了提高效率,通常使用不开平方的近似值,尽管这样会损失一定的精度。具体的实现步骤如下:
- 计算Gx和Gy与模板每行的乘积。
- 对两个3x3矩阵进行卷积运算,即将每一行每一列对应相乘然后相加。
- 求得3x3模板运算后的Gx和Gy。
- 求Gx² + Gy²的平方根或者直接对Gx和Gy取绝对值后求和。
- 设置一个阈值,运算后的像素值大于该阈值输出为全1,小于该阈值输出为全0。
平方根和绝对值函数
在MATLAB中,sqrt(x)
用于计算平方根,abs(x)
用于取数值的绝对值和复数的幅值。在对图像数据进行运算时,最好将图像数据转换为double类型,以避免精度损失。
Sobel边缘检测MATLAB实现
以下是基于MATLAB的Sobel边缘检测算法实现代码:
% RGB to YCbCr conversion
clc;
clear all;
close all;
RGB_data = imread('lena.jpg');
R_data = RGB_data(:,:,1);
G_data = RGB_data(:,:,2);
B_data = RGB_data(:,:,3);
[ROW, COL, DIM] = size(RGB_data);
Y_data = zeros(ROW, COL);
Cb_data = zeros(ROW, COL);
Cr_data = zeros(ROW, COL);
Gray_data = RGB_data;
for r = 1:ROW
for c = 1:COL
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;
imshow(Gray_data);
% Add salt and pepper noise
imgn = imnoise(Gray_data, 'salt & pepper', 0.02);
figure;
imshow(imgn);
% Median filter
Median_Img = Gray_data;
for r = 2:ROW-1
for c = 2:COL-1
median3x3 = [imgn(r-1,c-1) imgn(r-1,c) imgn(r-1,c+1);
imgn(r,c-1) imgn(r,c) imgn(r,c+1);
imgn(r+1,c-1) imgn(r+1,c) imgn(r+1,c+1)];
mid_num = median(median3x3(:));
Median_Img(r,c) = mid_num;
end
end
figure;
imshow(Median_Img);
% Sobel edge detection
Median_Img = double(Median_Img);
Sobel_Threshold = 150;
Sobel_Img = zeros(ROW, COL);
for r = 2:ROW-1
for c = 2:COL-1
Sobel_x = Median_Img(r-1,c+1) + 2*Median_Img(r,c+1) + Median_Img(r+1,c+1) - Median_Img(r-1,c-1) - 2*Median_Img(r,c-1) - Median_Img(r+1,c-1);
Sobel_y = Median_Img(r-1,c-1) + 2*Median_Img(r-1,c) + Median_Img(r-1,c+1) - Median_Img(r+1,c-1) - 2*Median_Img(r+1,c) - Median_Img(r+1,c+1);
Sobel_Num = abs(Sobel_x) + abs(Sobel_y);
if (Sobel_Num > Sobel_Threshold)
Sobel_Img(r,c) = 0;
else
Sobel_Img(r,c) = 255;
end
end
end
figure;
imshow(Sobel_Img);
处理后的图片效果
中值滤波后的lena
Sobel边沿检测后的lena
为了使图像边缘更加清晰,可以在Sobel基础上进行腐蚀和膨胀处理。腐蚀和膨胀处理将在后续文章中详细讨论。
转载自NingHeChuan(宁河川)
个人微信订阅号:开源FPGA
知乎ID:NingHeChuan
微博ID:NingHeChuan
原文地址:https://www.cnblogs.com/ninghechuan/p/9529936.html