✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。
🍎个人主页:Matlab科研工作室
🍊个人信条:格物致知。
更多Matlab仿真内容点击👇
⛄ 内容介绍
基于Zernike矩实现亚像素边缘检测是一种图像处理方法,它利用Zernike矩来提取图像中物体边缘的亚像素级位置信息。以下是一个基本的步骤框架:
- 图像预处理:对输入图像进行预处理,如平滑、噪声去除等,确保提取到的边缘信号质量较高。
- 边缘检测:使用适当的边缘检测算anny边缘检测)对图像进行边缘检测操作,生成二值化边缘图像。
- 提取边缘片段:根据需要选择感兴趣的边缘区域或目标物体,通过图像分割或ROI提取等技术,获得边缘片段。
- Zernike矩计:对边缘片段应用Zernike多项式生成函数计算其Zernike矩。Zernike矩在边缘形状描述方面具有旋转、尺度和平移不变性。
- 亚像素拟合:基于Zernike矩的特性,通过对Zernike矩的插值和拟合,计算出边缘的亚像素级别位置信息。常见的拟合方法包括最小二乘法、最大似然估计等。
- 边缘位置显示:利像素位置信息,可以将更精确的边缘位置标记在原始图像上,用于可视化展示或后续分析。
需要注意的是,基于Zernike矩的亚像素边缘检测方法在某些情况下可能对噪声敏感,并且对边缘形状的复杂性有一定限制。在实践中,需要权衡算法复杂度、数据质量和处理效果等因素,并根据具体应用进行调整和改进。
⛄ 代码
clc
clear all
close all
I=imread('2.jpg');
% 7*7Zernike模板
M00=...
[
0 0.0287 0.0686 0.0807 0.0686 0.0287 0
0.0287 0.0815 0.0816 0.0816 0.0816 0.0815 0.0287
0.0686 0.0816 0.0816 0.0816 0.0816 0.0816 0.0686
0.0807 0.0816 0.0816 0.0816 0.0816 0.0816 0.0807
0.0686 0.0816 0.0816 0.0816 0.0816 0.0816 0.0686
0.0287 0.0815 0.0816 0.0816 0.0816 0.0815 0.0287
0 0.0287 0.0686 0.0807 0.0686 0.0287 0
];
M11R=...
[
0 -0.015 -0.019 0 0.019 0.015 0
-0.0224 -0.0466 -0.0233 0 0.0233 0.0466 0.0224
-0.0573 -0.0466 -0.0233 0 0.0233 0.0466 0.0573
-0.069 -0.0466 -0.0233 0 0.0233 0.0466 0.069
-0.0573 -0.0466 -0.0233 0 0.0233 0.0466 0.0573
-0.0224 -0.0466 -0.0233 0 0.0233 0.0466 0.0224
0 -0.015 -0.019 0 0.019 0.015 0
];
M11I=...
[
0 -0.0224 -0.0573 -0.069 -0.0573 -0.0224 0
-0.015 -0.0466 -0.0466 -0.0466 -0.0466 -0.0466 -0.015
-0.019 -0.0233 -0.0233 -0.0233 -0.0233 -0.0233 -0.019
0 0 0 0 0 0 0
0.019 0.0233 0.0233 0.0233 0.0233 0.0233 0.019
0.015 0.0466 0.0466 0.0466 0.0466 0.0466 0.015
0 0.0224 0.0573 0.069 0.0573 0.0224 0
];
M20=...
[
0 0.0225 0.0394 0.0396 0.0394 0.0225 0
0.0225 0.0271 -0.0128 -0.0261 -0.0128 0.0271 0.0225
0.0394 -0.0128 -0.0528 -0.0661 -0.0528 -0.0128 0.0394
0.0396 -0.0261 -0.0661 -0.0794 -0.0661 -0.0261 0.0396
0.0394 -0.0128 -0.0528 -0.0661 -0.0528 -0.0128 0.0394
0.0225 0.0271 -0.0128 -0.0261 -0.0128 0.0271 0.0225
0 0.0225 0.0394 0.0396 0.0394 0.0225 0
];
if length(size(I))==3 I=rgb2gray(I); end
I=im2bw(I,0.6);
K=double(I);
[m n]=size(K);
xs=double(zeros(m,n));
ys=double(zeros(m,n));
% 卷积运算
A11I=conv2(M11I,K);
A11R=conv2(M11R,K);
A20=conv2(M20,K);
% 截掉多余部分
A11I=A11I(4:end-3,4:end-3);
A11R=A11R(4:end-3,4:end-3);
A20=A20(4:end-3,4:end-3);
J=zeros(size(K));
boundary=J;
theta=atan2(A11I,A11R);%计算theta
%计算边缘的三个参数
A11C=A11R.*cos(theta)+A11I.*sin(theta);
l=A20./A11C;
k=1.5*A11C./((1-l.^2).^1.5);
e=abs(l)>1/3.5;
k(e)=0;
%边缘判断条件
a=abs(l)<1/sqrt(2)*2/7;
b=abs(k)>max(I(:))/10;
% a,b分别为距离和边缘强度判断结果
J(a&b)=1;
%将图像的最边缘去除
% boundary(2:end-1,2:end-1)=1;
% J(~boundary)=0;
format short
% [x,y]=find(J==1);%边缘的像素级坐标
% O=[x y];
% Z=[x+l(find(J==1)).*cos(theta(find(J==1))) y+l(find(J==1)).*sin(theta(find(J==1)))];%亚像素坐标
% % fprintf('%.4f %.4f\n',Z');
[L,num]=bwlabel(J,8);%对二值图像进行标记
%自动化搜索连通域
s=zeros(1,num);
for i=1:num
s(i)=size(find(L==i),1);
end
[bwL,label]=sort(s,'descend');
if label(1)<label(2)
index1=label(1);
index2=label(2);
else
index1=label(2);
index2=label(1);
end
%计算左边探针的最前端坐标
[r1,c1]=find(L==index1);
A1=[r1 c1];
y1=max(A1(:,2));%该连通域中y最大值为针尖处
x1=max(A1(find(A1(:,2)==y1),1));
x1sub=x1+3.5*l(x1,y1)*cos(theta(x1,y1));
y1sub=y1+3.5*l(x1,y1)*sin(theta(x1,y1));
%计算最右边探针的最前端坐标
[r2,c2]=find(L==index2);
A2=[r2 c2];
y2=min(A2(:,2));%该连通域中y最小为连通域
x2=max(A2(find(A2(:,2)==y2),1));
x2sub=x2+3.5*l(x2,y2)*cos(theta(x2,y2));
y2sub=y2+3.5*l(x2,y2)*sin(theta(x2,y2));
% [x1sub y1sub],[x2sub,y2sub]
imshow(J)
% hold on %显示针尖的位置
% plot(y1sub,1:m,'r')
% plot(y2sub,1:m,'r')
% ymin=min(Z(find(Z(:,2)>696),2))
% Z(find(Z(:,2)==ymin),:)
%
% ymax=max(Z(find(Z(:,2)<696),2))
% Z(find(Z(:,2)==ymax),:)
%
% imshow(J)
% hold on
% plot(Z(find(Z(:,2)==ymin),2),1:m,'r')
% plot(Z(find(Z(:,2)==ymax),2),1:m,'r')
⛄ 运行结果
⛄ 参考文献
[1] 胡树杰.基于Zernike矩的亚像素边缘检测改进算法[J].制造业自动化, 2012, 34(9):3.DOI:10.3969/j.issn.1009-0134.2012.5(s).02.