当前位置:网站首页>[Image processing] Image skeleton extraction based on central axis transformation with matlab code
[Image processing] Image skeleton extraction based on central axis transformation with matlab code
2022-07-30 05:55:00 【matlab_dingdang】
1 内容介绍
介绍了一种中轴变换算法.该算法修正了现存算法的缺点,可以快速去除二值图像中的冗余信息,准确抽取图像的单像素骨架,保留基本特征,特别是斜线和圆形焊盘特征.大量实验表明,该方法降低图像的复杂度,仅保留图像形状的拓扑信息,为后续处理提供理想的图像,提高整个系统的性能.
2 完整代码
% 中轴算法 Medial Axis Transfrom%% by HPC_ZY 20190802clear; close all; clcload data%% matlab% 求骨架ticskeleton = bwmorph(im,'skeleton',Inf);t1 = toc;% 去毛刺ticskeleton1 = bwmorph(skeleton,'spur',16);t2 = toc;figureshowres(im,skeleton,t1,1,2,1,'matlab库')showres(im,skeleton1,t2,1,2,2,'matlab库(消除毛刺)')%% 迭代删除% 迭代删除法ticskeleton1 = method1(im);t1 = toc;% 迭代删除法(查找表)ticskeleton2 = method2(im);t2 = toc;% 迭代删除法(简化)ticskeleton3 = method3(im);t3 = toc;figureshowres(im,skeleton1,t1,1,3,1,'迭代删除法')showres(im,skeleton2,t2,1,3,2,'迭代删除法(查找表)')showres(im,skeleton3,t3,1,3,3,'迭代删除法(简化)')%% ------------function--------------% 迭代删除法function skeleton = method1(bw)bw = double(bw); % 转为非逻辑类型,方便后面求和[M,N] = size(bw);skeleton = bw;deleCount = 1; % 用于记录一次迭代删除的像素个数while deleCount>0% 删(右,下)deleCount = 0;label = zeros(M,N,'logical');for i = 2:M-1for j = 2:N-1if skeleton(i,j) % 如果该点为1,判断周围像素p = [skeleton(i-1,j),skeleton(i-1,j+1),skeleton(i,j+1),skeleton(i+1,j+1),...skeleton(i+1,j),skeleton(i+1,j-1),skeleton(i,j-1),skeleton(i-1,j-1)];Np = sum(p);Tp = length(find(([p(2:end),p(1)]-p) == 1));if Np>1 && Np<7 && Tp==1 && p(1)*p(3)*p(5)==0 && p(7)*p(3)*p(5)==0deleCount = deleCount+1;label(i,j) = 1;endendendendskeleton(label) = 0;% 删(左,上)label = zeros(M,N,'logical');for i = 2:M-1for j = 2:N-1if skeleton(i,j) % 如果该点为1,判断周围像素p = [skeleton(i-1,j),skeleton(i-1,j+1),skeleton(i,j+1),skeleton(i+1,j+1),...skeleton(i+1,j),skeleton(i+1,j-1),skeleton(i,j-1),skeleton(i-1,j-1)];Np = sum(p);Tp = length(find(([p(2:end),p(1)]-p) == 1));if Np>1 && Np<7 && Tp==1 && p(1)*p(3)*p(7)==0 && p(1)*p(5)*p(7)==0deleCount = deleCount+1;label(i,j) = 1;endendendendskeleton(label) = 0;endend% 迭代删除法(查找表)function skeleton = method2(bw)bw = double(bw);[M,N] = size(bw);skeleton = bw;% 生成查找表[List1,List2] = getList1();[x,y] = find(bw);a = min(x);b = max(x);c = min(y);d = max(y);deleCount = 1;mat = [1,2,4,8,16,32,64,128];while deleCount>0deleCount = 0;% 删(右,下)label1 = zeros(M,N,'logical');for i = a:bfor j = c:dif skeleton(i,j)p = [skeleton(i-1,j),skeleton(i-1,j+1),skeleton(i,j+1),skeleton(i+1,j+1),...skeleton(i+1,j),skeleton(i+1,j-1),skeleton(i,j-1),skeleton(i-1,j-1)];idx = sum(p.*mat)+1;if List1(idx)label1(i,j) = true;deleCount = deleCount+1;endendendendskeleton(label1) = 0;% 删(左,上)label2 = zeros(M,N,'logical');for i = a:bfor j = c:dif skeleton(i,j)p = [skeleton(i-1,j),skeleton(i-1,j+1),skeleton(i,j+1),skeleton(i+1,j+1),...skeleton(i+1,j),skeleton(i+1,j-1),skeleton(i,j-1),skeleton(i-1,j-1)];idx = sum(p.*mat)+1;if List2(idx)label2(i,j) = true;deleCount = deleCount+1;endendendendskeleton(label2) = 0;endend% 迭代删除法(简化)function skeleton = method3(bw)bw = double(bw);[M,N] = size(bw);skeleton = bw;% 生成查找表List = getList2();% 收缩搜索范围[x,y] = find(bw);a = min(x);b = max(x);c = min(y);d = max(y);% 开始迭代deleCount = 1;mat = [1,2,4,8,16,32,64,128];while deleCount>0deleCount = 0;label = zeros(M,N,'logical');for i = a:bfor j = c:dif skeleton(i,j)p = [skeleton(i-1,j),skeleton(i-1,j+1),skeleton(i,j+1),skeleton(i+1,j+1),...skeleton(i+1,j),skeleton(i+1,j-1),skeleton(i,j-1),skeleton(i-1,j-1)];idx = sum(p.*mat)+1;if List(idx)label(i,j) = true;deleCount = deleCount+1;endendendendskeleton(label) = 0;endend% 生成查找表function [List1,List2] = getList1()List1 = zeros(256,1,'logical');List2 = zeros(256,1,'logical');for n = 0:255p = bitget(n,1:8);Np = sum(p);Tp = length(find(([p(2:end),p(1)]-p) == 1));if Np>1 && Np<7 && Tp==1% 右,下if p(1)*p(3)*p(5)==0 && p(7)*p(3)*p(5)==0List1(n+1) = true;end% 左,上if p(1)*p(3)*p(7)==0 && p(1)*p(5)*p(7)==0List2(n+1) = true;endendendend% 生成查找表(简化)function List = getList2()List = zeros(256,1,'logical');for n = 0:255p = bitget(n,1:8);Np = sum(p);Tp = length(find(([p(2:end),p(1)]-p) == 1));if Np>1 && Np<7 && Tp==1if (p(1)*p(3)*p(5)==0 && p(7)*p(3)*p(5)==0)||...(p(1)*p(3)*p(7)==0 && p(1)*p(5)*p(7)==0)List(n+1) = true;endendendend% 显示结果function showres(im,skeleton,t,i,j,k,titlename)subplot(i,j,k),imshow(im)hold on[x,y] = find(skeleton);plot(y,x,'r.')title(['\fontsize{16}',titlename])xlabel(['\fontsize{16}耗时(秒):',num2str(t)])end
3 运行结果


4 参考文献
[1]史聪伟, 赵杰煜, 常俊生. 基于中轴变换的骨架特征提取算法[J]. 计算机工程, 2019, 45(7):9.
博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流.
部分理论引用网络文献,若有侵权联系博主删除.
边栏推荐
猜你喜欢
随机推荐
上交所行情文件解析之mktdt04
CSDN Meetup 回顾 丨从数据湖到指标中台,提升数据分析 ROI
面试题 17.13. 恢复空格(字典树)
号称年薪30万占比最多的专业,你知道是啥嘛?
Kyligence 入选 Gartner 2022 数据管理技术成熟度曲线报告
倒计数(来源:Google Kickstart2020 Round C Problem A)(DAY 88)
力扣20-有效的括号——栈实现
最新版MySQL 8.0 的下载与安装(详细教程)
4、nerf(pytorch)
暴力递归到动态规划 05 (贴纸拼词)
Programmers make money and practice, teach you how to do paid courses, self-media, paid articles and paid technical courses to make money
图形镜像对称(示意图)
【图像检测】基于灰度图像的积累加权边缘检测方法研究附matlab代码
Participate in open source, let programmers regain their blood and passion
An old programmer's summary review of 2020, how to become more awesome in 2021
微信支付及支付回调
MySQL - 函数及约束命令
ugly programmer
Redis学习
翻译 | 解读首部 Kubernetes 纪录片









