基于matlab工具箱提取图像中的多目标特征(代码如下):

代码前面部分为提取图像的边界信息,调用了后面的遍历函数Pixel_Search,函数实现方法见后~

%%ROI Testing
close all;
clear all;
clc;
I=imread('Test.png');
I=rgb2gray(I);
I=I(:,:);
[m,n]=size(I);
I_BW=I;
for Row1=:m
for Clo1=:n
if I(Row1,Clo1)>
I_BW(Row1,Clo1)=;
else
I_BW(Row1,Clo1)=;
end
end
end
imshow(I)
%figure,imhist(I)
figure,imshow(I_BW)
I_BW_morph=bwmorph(I_BW,'erod',0.8);%形态学腐蚀原理
Filter=[-,-,-;-,,-;-,-,-];%高通滤波器,挖出二值图像的边界像素
I_Filter=imfilter(I_BW_morph,Filter);%使用滤波的方法得到的图像的边界部分是白色的,边界有变化所以经过高通滤波器后为白色
figure,imshow(I_Filter)
I_Edge=I_Filter;
I_Edge(:,)=;%由于采用的是滤波器的方法来实现边缘的提取,在图像的边界部分会出现颜色的变化,因此我们需要把图像边缘的部分置为0
I_Edge(:,n-)=;
I_Edge(,:)=;
I_Edge(m-,:)=;
figure,imshow(I_Edge)
I_Edge=uint8(I_Edge);%图像uint8化
ROI_Buffer=uint8(zeros(m,n,));%四个模板缓存区域
C_Shape=zeros(,);
Label=; for Row2=:m
for Clo2=:n
if I_Edge(Row2,Clo2)==
Label=Label+
[ROI_Buffer(:,:,Label),C_Shape(Label,)]=Pixel_Search(I_Edge,Row2,Clo2,m,n);%把当前的数据赋给模板
figure,imshow(*ROI_Buffer(:,:,Label));%显示所得到的对应标号为Label的图像边界,这里需要注意的问题是:由图像的色彩等级不同,因此得到的图像可能全是黑色,需要乘以255(uint8)
C_Shape(Label,)
I_Edge=I_Edge-ROI_Buffer(:,:,Label);%去除原图中已经提取完成的部分
end
end
end
Pixel_Search函数实现如下:
%While 方法寻找边缘轮廓 采用4邻域方式
function [Pic_Process,C]=Pixel_Search(Pic,Row,Clo,m,n)
While_Flag=;
C=;%周长像素点计数
Pic_Process=zeros(m,n);%模板建立
Pic_Buffer=Pic;%图像缓存建立
while (While_Flag==)%while循环判断
C=C+;
Pic_Process(Row,Clo)=;%图像模板区域置位
Pic_Buffer(Row,Clo)=;%图像缓冲区域清零 if Clo<= || Row>m || Clo>n || Row<=%防止图像检测过程中,边缘溢出
break;
end if Pic_Buffer(Row,Clo-)==%循环判断区域结果
Clo=Clo-;
While_Flag=;
else if Pic_Buffer(Row+,Clo)==%循环判断区域结果
Row=Row+;
While_Flag=;
else if Pic_Buffer(Row,Clo+)==%循环判断区域结果
Clo=Clo+;
While_Flag=;
else if Pic_Buffer(Row-,Clo)==%循环判断区域结果
Row=Row-;
While_Flag=;
else
While_Flag=;%各个循环条件都不满足,即像素种子点周围没有边缘像素,即可跳出while循环,结束搜索
end
end
end
end
end
end

处理的图片如下:

原图:显示图像:阈值化二值分割:滤波导致的边缘问题:第一个区域提取:第二个区域提取:第三个区域提取:

后期的优化还需要进一步完成,对于复杂的图形的ROI区域分割还需要进一步处理,现已经解决了联通区域的周长问题,还需要解决的问题有面积的求解以及区域的形态学特征的求解~

注:这里有一个问题,由于边缘的提取使用了高通滤波器,边缘的路径出现大量的弯折现象,这就导致了程序计算得到的边界周长约1.8倍于实际的ROI区域的边界周长,至于解决办法,后面解决,现在先记录在案~

A1:祖冲之切割边缘按照多边形求解周长。

A2:求解相邻像素点的中间值,x=(x1+x2)/2,y=(y1+y2)/2,最后根据新的边缘求解周长。

在这里要感谢GISPALAB实验室的各位老师和学长学姐的帮助!谢谢~

最新文章

  1. Neo4j批量插入(Batch Insertion)
  2. == 与 equals 的区别
  3. DNS服务器原理
  4. 批量硬关联本地AD帐号与Office云端帐号
  5. 基于AJAX的长轮询(long-polling)方式实现简单的聊天室程序
  6. Javascript中setTimeout和setInterval的区别和使用
  7. javascript 不间断向左滚动图片
  8. PHP接收JSON格式的数据
  9. lintcode 132 模式
  10. android 小项目------黑名单app
  11. 使用strace命令跟踪系统调用
  12. 接口自动化集成到jenkins(Java+testng+maven+git)
  13. 路飞学城-Python开发集训-第2章
  14. javaMail发邮件,激活用户账号
  15. this is incompatible with sql_mode=only_full_group_by
  16. c++中POD类型和non-POD类型
  17. azkaban 配置邮件
  18. jmeter集合点使用方法:Synchronizing Timer
  19. Web轻量级扫描工具Skipfish
  20. cocos2d-x C++ (Android)集成第三方微信分享

热门文章

  1. [C++]指针/指针数组/数组指针/多维指针/单值指针/多值指针
  2. mysql timestamp时区有影响
  3. groovy与java中的多方法
  4. SpringMVC集成Redis
  5. ASP.NET MVC + EF 更新的几种方式(超赞)
  6. NSIS程序安装包制作
  7. 【转】inotify+rsync实现实时同步
  8. v4l2文档之——color and format【转】
  9. linux 同步IO: sync、fsync与fdatasync、sys_sync【转】
  10. windows系统上搭建redis集群哨兵及主从复制