下面是给出的图片,我还有很多类似的图片,处理起来需要返回圆圈的像素坐标,最后连接封闭图形的顺序坐标
我有一张这样的图片,如何提取里面的红色圈圈坐标,并且连接这些坐标形成两个封闭的环路?我有很多类似的图片,需要批处理
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
关注 大概写了一下不知道是否有帮助:
function redPnt oriPic=imread('test1.png'); subplot(2,2,1) imshow(oriPic) % 删除红色外的部分并构造二值图 grayPic=rgb2gray(oriPic); grayPic(oriPic(:,:,1)<255)=255; grayPic(grayPic<250)=0; subplot(2,2,2) imshow(grayPic) % 图像膨胀,使未连接边缘连接 SE=[0 1 0;1 1 1;0 1 0]; bwPic=imerode(grayPic,SE); % 边缘清理:保留圆圈联通区域 bwPic=imclearborder(bwPic); subplot(2,2,3) imshow(bwPic) % 获取每一个联通区域 LPic=bwlabel(bwPic); labelNum=max(max(LPic)); % 计算每一个联通区域 坐标均值 pointSet=zeros(labelNum,2); for i=1:labelNum [X,Y]=find(LPic==i); Xmean=mean(X); Ymean=mean(Y); pointSet(i,:)=[Xmean,Ymean]; end subplot(2,2,4) imshow(bwPic) hold on scatter(pointSet(:,2),pointSet(:,1),'r','LineWidth',1) n=1; while ~isempty(pointSet) circleSetInd=1; for j=1:length(pointSet) disSet=sqrt(sum((pointSet-pointSet(circleSetInd(end),:)).^2,2)); [~,ind]=sort(disSet); ind=ind(1:5); [~,~,t_ind]=intersect(circleSetInd,ind); ind(t_ind)=[]; if ~isempty(ind) circleSetInd=[circleSetInd;ind(1)]; else circleSet{n}=pointSet(circleSetInd,:); pointSet(circleSetInd,:)=[]; n=n+1; break end end end figure imshow(oriPic) hold on for i=1:n-1 plot(circleSet{i}(:,2),circleSet{i}(:,1),'LineWidth',2) end end
没有用霍夫圆形检测之类算法,只是单纯的图像膨胀,边缘清理,寻找联通区域,计算联通区域坐标均值
大概过程如下图所示:本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥15 换yum源但仍然用不了httpd
- ¥50 C# 使用DEVMOD设置打印机首选项
- ¥15 麒麟V10 arm安装gdal
- ¥15 想用@vueuse 把项目动态改成深色主题,localStorge里面的vueuse-color-scheme一开始就给我改成了dark,不知道什么原因(相关搜索:背景颜色)
- ¥20 OPENVPN连接问题
- ¥15 flask实现搜索框访问数据库
- ¥15 mrk3399刷完安卓11后投屏调试只能显示一个设备
- ¥100 如何用js写一个游戏云存档
- ¥15 ansys fluent计算闪退
- ¥15 有关wireshark抓包的问题