实验内容
利用 Sobel 算子进行图像的边缘检测
clc,clf,clear all,close all;
I = imread('lena256.jpg'); % 读取图像
I=double(I)/255; % 转换为double型
Sx=[-1 0 1
-2 0 2
-1 0 1]; % Sobel算子
Sy=[-1 -2 -1
0 0 0
1 2 1]; % Sobel算子
% 滤波运算后求得x,y两个方向梯度与梯度幅度
Dx=conv2(I,double(Sx),'same');
Dy=conv2(I,double(Sy),'same');
D=sqrt((Dx).^2+(Dy).^2);
% 执行梯度图像 D 的二值化处理
level = graythresh(D); % Otsu threhold
BW = im2bw(D,level); % Segmented image with threhold level
% 利用 MATLAB 工具的 edge(I,’sobel’) 函数进行处理
k = edge(I,'sobel');
% 画出原图像、原图像的 Dx,Dy,D 图,及最终的边缘检测结果图
figure,imshow(I,[]);title('原图');
figure;
subplot(131);imshow(Dx,[]);title('Dx图');
subplot(132);imshow(Dy,[]);title('Dy图');
subplot(133);imshow(D,[]);title('幅度图');
figure;
subplot(121);imshow(BW);title('二值化边缘检测图(OTSU)');
subplot(122);imshow(k,[]);title('Sobel边缘检测图');
利用梯度改进全局阈值分割
clc,clf,clear all,close all;
I = imread('Fig1042(a)(septagon_small_noisy_mean_0_stdv_10).tif'); % 读取图像
figure,imshow(I,[]);title('原图');
I = double(I)/255; % 转换为double型
% 目标图像利用图像梯度公式
Dx(:,:) =(I(1:end-1,:) - I(2:end,:));
Dx(end+1,:) = Dx(end,:);
Dy(:,:) =(I(:,1:end-1) - I(:,2:end));
Dy(:,end+1) = Dy(:,end);
D=sqrt((Dx).^2+(Dy).^2);
% 得到梯度幅度图像
figure;
subplot(131);imshow(Dx,[]);title('Dx图');
subplot(132);imshow(Dy,[]);title('Dy图');
subplot(133);imshow(D,[]);title('幅度图');
% 将梯度图像和原图像进行乘积
r = D.*I;
figure;
subplot(121);imshow(r,[]); title('乘积图');
% 统计非零像素的直方图
r0 = im2uint8(r);
subplot(122);imhist(r0);title('乘积直方图');
% 利用OTSU阈值处理方法分割乘积后的图像得到最终二值化结果图像
level = graythresh(r); % Otsu threhold
BW = im2bw(r,level); % Segmented image with threhold level
figure, imshow(BW);title('二值化边缘检测图(OTSU)');
数字图像中目标区域测量及计算
clc,clf,clear all,close all;
I = imread('fly.jpg'); % 读取图像
subplot(131);imshow(I,[]);title('原图');
I = double(I)/255; % 转换为double型
[m,n]=size(I);
% 进行阈值分割,得到二值化的图像
level = graythresh(I); % Otsu threhold
BW = im2bw(I,level); % Segmented image with threhold level
subplot(132);imshow(BW);title('二值化边缘检测图(OTSU)');
% 计算目标形状的面积
S=0;
for i=1:m
for j=1:n
if BW(i,j)==0;
S=S+1;
end
end
end
S
% 计算图中黑色形状目标的形心位置
Z=1-BW;
for i=1:m
for j=1:n
x(i,j)=i*Z(i,j);
y(i,j)=j*Z(i,j);
end
end
% 在原图上进行位置标记
xc=sum(sum(x))/sum(sum(Z));
yc=sum(sum(y))/sum(sum(Z));
subplot(133);imshow(I,[]);hold on;
plot(yc,xc,'or');title('原图上叠加形心标记图');
思考
利用梯度算子与图像进行卷积运算后,为什么还需要给定阈值进行二值化处理?
答:利用梯度算子与图像进行卷积运算后得到的只是图像像素灰度变化的梯度图,经过二值化处理后才能提取出有用的图像边界。
Laplacian 算子检测边缘为什么会产生双边效果?为什么不能检测出边的方向。
答:Laplacian 算子实际是对图像求二阶导数,二阶导数在灰度斜坡和灰度台阶过渡处产生双边效应。
相对其他边缘检测算子,Canny 边缘检测算法的主要优势体现在哪里?
答:
- 低失误概率
- 高位置精度
- 对每个边缘有唯一的响应