%% 初始化
clc;clear;clf;
%% 录入原图像
I1=imread('rice.png');
I1=double(I1);
[m,n]=size(I1);
%% 均值滤波
I = zeros(m,n);
for i=2:m-1 %历遍原图像
for j=2:n-1
I(i,j)=I1(i-1,j-1)+I1(i-1,j)+I1(i-1,j+1)+ ...
I1(i,j-1)+I1(i,j)+I1(i,j+1)+I1(i+1,j-1)+ ...
I1(i+1,j)+I1(i+1,j+1); %求取均值
I(i,j)=I(i,j)/9;
end
end
%% Soble 算子检测边缘,并保存原图中每个像素相对应的梯度模长和方位角
Muchang = zeros(m,n); %建立矩阵保存对应像素的梯度模长
Jiaodu = zeros(m,n); %建立矩阵保存对应像素的方位角
Bianyuantu = zeros(m,n); %建立边缘检测图矩阵
hv = fspecial('sobel'); %建立 Sobel 算子模板
hh = hv.';
gv = abs(imfilter(I,hv,'replicate')); %滤波运算
gh = abs(imfilter(I,hh,'replicate'));
Muchang = sqrt(gv.^2 + gh.^2); %保存模长量
Jiaodu = atan(gh./gv); %保存角度量
for i=2:m-1
for j=2:n-1 %历遍模长矩阵
if Muchang(i,j) < 205 %建立删选条件
Bianyuantu(i,j) = 0;
else
Bianyuantu(i,j) = 1;
end
end
end
%% 显示边缘图
subplot(121);
imshow(Bianyuantu);
title('边缘图像');
%% 边缘连接