圖形影象處理之——實現影象子區域影象的簡單提取
阿新 • • 發佈:2018-12-30
今天經過高人點醒,我好想懂了點點我要做的東東的思路,今天晚上就拿出來試了一下,居然還小小的實現了一番,太開心了,迫不及待的拿出來分享一下:
不過當然還沒有完全實現,還需要進一步的設計批量操作。程式碼貼出來:
image=imread('E:\qww.jpg'); [H,S,V]=rgb2hsv(image);%step1:獲取圖片HSV分量,分別代表色調,飽和度,亮度 hMedian=median(median(H));%step2:提取中位數以下H分量,進行二值化 hBw1=im2bw(H,hMedian);%step3:二值化,閾值為hMedian HBelowMedian=H.*(~hBw1);%step4:剩餘H二值化 hBw2=im2bw(HBelowMedian,graythresh(HBelowMedian));%二值化,閾值為graythresh(HBelowMedian) for i=1:size(image,1) bwImage(i,:)=bitxor(hBw1(i,:),hBw2(i,:));%%將hBw1和hBw2異或得到結果 end bwImage=~bwImage;%影象取反 [B0,L0] = bwboundaries(bwImage,'noholes');%邊界跟蹤,返回劃分的區域L0,noholes演算法只搜尋目標的外邊界。 stats = regionprops(L0,'Area');%regionprops測量每個標籤區域L0的屬性 [sortAfter,Index] = sort([stats(:,:).Area],'descend');%對陣列進行降序排序,並返回排序後的陣列,Index為返回的排序後元素在原陣列中的行位置或列位置. L2 = ismember(L0,Index(1));%判斷一個集合是否為另一個的子集,此地方是。 bwImage = bwlabel(L2);%進行標註 bwImage = imfill(bwImage,'holes');%%對二值影象中的目標孔進行填充點 stats1=regionprops(bwImage,'Centroid'); image1=rgb2ind(image,map);%將待處理圖片轉換為索引影象 [height,width]=size(image1);%計算灰度索引影象的長寬 for i=1:height for j=1:width if bwImage(i,j)==0 image1(i,j)=0; end end end image=ind2rgb(image1,map);%將處理後的索引影象轉換為真彩色影象 imshow(image); hold on plot(stats1.Centroid(1),stats1.Centroid(2),'R+');%用紅色標註質心 hold off x0=stats1.Centroid(1)% 求的影象質心的座標 y0=stats1.Centroid(2)% 求的影象質心的座標 rect=[x0-80 y0-80 x0+80 y0+80] a=imcrop(image,rect);% 用imcrop裁剪: figure; imshow(a) imwrite(a,'aaa.bmp')
看看效果吧:
原圖:
這個圖的最後一個子圖,哈哈。不過這肯定不行,背景是由索引影象(背景0)轉換過來的,轉換過來背景就不是0了,~~~~(>_<)~~~~