<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
有一張這樣的圖片,如何提取裡面的紅色圈圈座標,並且連線這些座標形成兩個封閉的環路?
oriPic=imread('test1.png'); subplot(2,2,1) imshow(oriPic)
原理就是圖中顏色種類比較少,只有紅黑白,而紅色和白色都是R通道數值較大,因此我們可以利用這一點進行影象分割
% 刪除紅色外的部分並構造二值圖 grayPic=rgb2gray(oriPic); grayPic(oriPic(:,:,1)<250)=255; grayPic(grayPic<250)=0; %subplot(2,2,2) figure imshow(grayPic)
對於白色來說是腐蝕,對於黑色來說是膨脹,這一步是為了讓那些有缺口的小圓圈將缺口補起來
% 影象膨脹,使未連線邊緣連線 SE=[0 1 0;1 1 1;0 1 0]; bwPic=imerode(grayPic,SE); figure imshow(bwPic)
就是把和邊緣連線的不被黑色包圍的區域變成黑色:
% 邊緣清理:保留圓圈聯通區域 bwPic=imclearborder(bwPic); %subplot(2,2,3) figure imshow(bwPic)
現在每一個白點都是一個座標區域,我們檢測所有聯通區域並計算各個區域的重心即可:
% 獲取每一個聯通區域 [LPic,labelNum]=bwlabel(bwPic); % 計算每一個聯通區域 座標均值 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) figure 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
這效果就很美滋滋:
function redPnt oriPic=imread('test1.png'); %subplot(2,2,1) figure imshow(oriPic) % 刪除紅色外的部分並構造二值圖 grayPic=rgb2gray(oriPic); grayPic(oriPic(:,:,1)<250)=255; grayPic(grayPic<250)=0; %subplot(2,2,2) figure imshow(grayPic) % 影象膨脹,使未連線邊緣連線 SE=[0 1 0;1 1 1;0 1 0]; bwPic=imerode(grayPic,SE); figure imshow(bwPic) % 邊緣清理:保留圓圈聯通區域 bwPic=imclearborder(bwPic); %subplot(2,2,3) figure imshow(bwPic) % 獲取每一個聯通區域 [LPic,labelNum]=bwlabel(bwPic); % 計算每一個聯通區域 座標均值 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) figure 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
來波正方形試試:
可以看出效果還是很棒的,當然大家可以根據實際情況自行更改影象腐蝕模板形狀,如果散點是其它顏色請自行更改第一步的影象分割條件。
後注:
若是因為點較為密集而導致圈形路徑內部白色區域沒被清除,可能會將內部區域也算作散點造成錯誤,解決方法是計算每個聯通區域面積並剔除遠遠大於區域面積中位數的聯通區域:
問題出現原因的圖片描述:
如圖所示種間那一大片區域也被算作散點
更改後程式碼如下:
function redPnt oriPic=imread('test2.png'); figure imshow(oriPic) % 刪除紅色外的部分並構造二值圖 grayPic=rgb2gray(oriPic); grayPic(oriPic(:,:,1)<250)=255; grayPic(grayPic<250)=0; figure imshow(grayPic) % 影象膨脹,使未連線邊緣連線 SE=[0 1 0;1 1 1;0 1 0]; bwPic=imerode(grayPic,SE); figure imshow(bwPic) % 邊緣清理:保留圓圈聯通區域 bwPic=imclearborder(bwPic); figure imshow(bwPic) % 獲取每一個聯通區域 [LPic,labelNum]=bwlabel(bwPic); % 篩掉超大區域 pointSizeSet=zeros(1,labelNum); for i=1:labelNum pointSizeSet(i)=sum(sum(LPic==i)); end [~,ind]=find(pointSizeSet>10*median(pointSizeSet)); % 計算每一個聯通區域 座標均值 pointSet=zeros(labelNum,2); for i=1:labelNum [X,Y]=find(LPic==i); Xmean=mean(X); Ymean=mean(Y); pointSet(i,:)=[Xmean,Ymean]; end pointSet(ind,:)=[]; figure 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:min(5,length(ind))); [~,~,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
注:
2016版本及以前可能這句:
disSet=sqrt(sum((pointSet-pointSet(circleSetInd(end),:)).^2,2));
會出現陣列大小不匹配問題,可以將其改為:
tempMat=repmat(pointSet(circleSetInd(end),:),[size(pointSet,1),1]); disSet=sqrt(sum((pointSet-tempMat).^2,2));
以上就是詳解基於Matlab的空心散點檢測的詳細內容,更多關於Matlab空心散點檢測的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45