下面是给出的图片,我还有很多类似的图片,处理起来需要返回圆圈的像素坐标,最后连接封闭图形的顺序坐标
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 宝塔面板一键迁移使用不了
- ¥15 求一个按键录像存储到内存卡的ESP32CAM代码
- ¥15 如何单独修改下列canvas推箱子代码target参数?,插入图片代替其形状,就是哪个绿色的圆圈每关用插入的图片替代
- ¥20 四叉树的创建和输出问题
- ¥15 javaweb连接数据库,jsp文件加载不出来
- ¥15 matlab关于高斯赛德尔迭代的应用编撰。(相关搜索:matlab代码|迭代法)
- ¥15 损失匹配问题,求解答
- ¥15 3500常用汉字书法体检测数据集下载
- ¥15 odoo17在制造模块或采购模块良品与次品如何分流和在质检模块下如何开发
- ¥15 Qt音乐播放器的音乐文件相对路径怎么写