图像的边缘检测
边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化,这些包括(1)深度上的不连续、(2)表面方向不连续、(3)物质属性变化和(4)场景照明变化。
常用的边缘检测算子(卷积核)有以下几种:
|
|
|
|
|
|
MATLAB程序
MATLAB程序使用算子进行边缘检测。
clc
clear
close all
picture=imread('test.jpg');
% 读取原始图像的R、G、B值
% picture_r=picture(:,:,1);
% picture_g=picture(:,:,2);
% picture_b=picture(:,:,3);
[M,N,C]=size(picture);
figure;
imshow(picture);
title('原始图像');
% 边缘检测
Mid_Filtered_picture=uint8(zeros(M,N,C));
conv_kernel=[1 1 1 1 -8 1 1 1 1];
pixel=zeros(1,9);
conv_result=0;
for k=1:3 % RGB三通道
for i=1:M
for j=1:N
if(i>1 && i<M && j>1 && j<N) % 中间部分
pixel(1:3) = picture(i-1, j-1:j+1, k);
pixel(4:6) = picture(i , j-1:j+1, k);
pixel(7:9) = picture(i+1, j-1:j+1, k);
conv_result=min(max(sum(pixel.*conv_kernel),0),255);
Mid_Filtered_picture(i,j,k)=conv_result;
elseif(i==1 && j>1 && j<N) % 第一行中间部分
pixel(1:3) = picture(i , j-1:j+1, k);%复制边缘
pixel(4:6) = picture(i , j-1:j+1, k);
pixel(7:9) = picture(i+1, j-1:j+1, k);
conv_result=min(max(sum(pixel.*conv_kernel),0),255);
Mid_Filtered_picture(i,j,k)=conv_result;
elseif(i==M && j>1 && j<N) % 最后一行中间部分
pixel(1:3) = picture(i-1, j-1:j+1, k);
pixel(4:6) = picture(i , j-1:j+1, k);
pixel(7:9) = picture(i , j-1:j+1, k);%复制边缘
conv_result=min(max(sum(pixel.*conv_kernel),0),255);
Mid_Filtered_picture(i,j,k)=conv_result;
elseif(j==1 && i>1 && i<M) % 第一列中间部分
pixel(1:3) = picture(i-1:i+1, j , k);%复制边缘
pixel(4:6) = picture(i-1:i+1, j , k);
pixel(7:9) = picture(i-1:i+1, j+1, k);
conv_result=min(max(sum(pixel.*conv_kernel),0),255);
Mid_Filtered_picture(i,j,k)=conv_result;
elseif(j==N && i>1 && i<M) % 最后一列中间部分
pixel(1:3) = picture(i-1:i+1, j-1, k);
pixel(4:6) = picture(i-1:i+1, j , k);
pixel(7:9) = picture(i-1:i+1, j , k);%复制边缘
conv_result=min(max(sum(pixel.*conv_kernel),0),255);
Mid_Filtered_picture(i,j,k)=conv_result;
elseif(i==1 && j==1) % 左上角
Mid_Filtered_picture(i,j,k)=0;
elseif(i==1 && j==N) % 右上角
Mid_Filtered_picture(i,j,k)=0;
elseif(i==M && j==N) % 右下角
Mid_Filtered_picture(i,j,k)=0;
elseif(i==M && j==1) % 左下角
Mid_Filtered_picture(i,j,k)=0;
end
end
end
end
figure;
imshow(Mid_Filtered_picture);
title('边缘检测');
运行结果