【图像处理】基于Zernike矩的亚像素边缘检测理论及MATLAB实现

简介: 基于Zernike矩的亚像素边缘检测理论,并提供了相应的MATLAB代码实现,包括定义7x7的Zernike模板、图像处理、边缘检测和连通域分析等步骤。

1 边缘检测理论

1.png

2.png

3.png

4.png

【参考文献】:亚像素边缘检测技术研究_张美静

2 MATLAB实现

function zernike7(I)

I=imread('Pic1_3.bmp');
subplot(221)
imshow(I)
title('原图像');
% 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]
subplot(222)
imshow(J)
title('检测结果图像');
% figure;
% imcontour(J,1)

% 边界提取
% subplot(122);
% bwimg = bwmorph(J,'remove');
% imshow(bwimg)

subplot(223);
I41=imfill(J,'holes');
imshow(I41)
title('孔洞填充图像');
% 提取最外围边缘
subplot(224);
I4=bwperim(I41);                   
imshow(I4); 
title('提取外边缘图像');
% 去除面积小于150px物体
% subplot(224); 
% I5=bwareaopen(I4,100);    
% imshow(I5);
% title('去除小面积边缘图像');

实验图
5.png

目录
相关文章
|
3月前
|
监控 算法 安全
基于颜色模型和边缘检测的火焰识别FPGA实现,包含testbench和matlab验证程序
本项目展示了基于FPGA的火焰识别算法,可在多种应用场景中实时检测火焰。通过颜色模型与边缘检测技术,结合HSV和YCbCr颜色空间,高效提取火焰特征。使用Vivado 2019.2和Matlab 2022a实现算法,并提供仿真结果与测试样本。FPGA平台充分发挥并行处理优势,实现低延迟高吞吐量的火焰检测。项目包含完整代码及操作视频说明。
|
4月前
|
计算机视觉
【图像处理】基于灰度矩的亚像素边缘检测方法理论及MATLAB实现
基于灰度矩的亚像素边缘检测方法,包括理论基础和MATLAB实现,通过计算图像的灰度矩来精确定位边缘位置,并提供了详细的MATLAB代码和实验结果图。
123 6
|
6月前
|
机器学习/深度学习 数据可视化 算法
探索MATLAB世界:掌握基础知识与实用技能(1. MATLAB环境与基本操作 2. 数据类型与变量 3. 条件与循环,1. 数据分析与统计 2. 图像处理与计算机视觉 3. 信号处理与控制系统)
探索MATLAB世界:掌握基础知识与实用技能(1. MATLAB环境与基本操作 2. 数据类型与变量 3. 条件与循环,1. 数据分析与统计 2. 图像处理与计算机视觉 3. 信号处理与控制系统)
63 0
|
7月前
|
编解码 并行计算 算法
如何在 MATLAB 中进行图像分割(matlab仿真与图像处理系列第7期)
如何在 MATLAB 中进行图像分割(matlab仿真与图像处理系列第7期)
|
4月前
|
安全
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
本文介绍了2023年高教社杯数学建模竞赛D题的圈养湖羊空间利用率问题,包括问题分析、数学模型建立和MATLAB代码实现,旨在优化养殖场的生产计划和空间利用效率。
224 6
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
|
4月前
|
存储 算法 搜索推荐
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
本文提供了2022年华为杯数学建模竞赛B题的详细方案和MATLAB代码实现,包括方形件组批优化问题和排样优化问题,以及相关数学模型的建立和求解方法。
141 3
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
|
4月前
|
数据采集 存储 移动开发
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
本文介绍了2023年五一杯数学建模竞赛B题的解题方法,详细阐述了如何通过数学建模和MATLAB编程来分析快递需求、预测运输数量、优化运输成本,并估计固定和非固定需求,提供了完整的建模方案和代码实现。
109 0
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
|
7月前
|
数据安全/隐私保护
耐震时程曲线,matlab代码,自定义反应谱与地震波,优化源代码,地震波耐震时程曲线
地震波格式转换、时程转换、峰值调整、规范反应谱、计算反应谱、计算持时、生成人工波、时频域转换、数据滤波、基线校正、Arias截波、傅里叶变换、耐震时程曲线、脉冲波合成与提取、三联反应谱、地震动参数、延性反应谱、地震波缩尺、功率谱密度
基于混合整数规划的微网储能电池容量规划(matlab代码)
基于混合整数规划的微网储能电池容量规划(matlab代码)
|
7月前
|
算法 调度
含多微网租赁共享储能的配电网博弈优化调度(含matlab代码)
含多微网租赁共享储能的配电网博弈优化调度(含matlab代码)

热门文章

最新文章