1. 程式人生 > >圖形影象處理之——實現影象子區域影象的簡單提取

圖形影象處理之——實現影象子區域影象的簡單提取


           今天經過高人點醒,我好想懂了點點我要做的東東的思路,今天晚上就拿出來試了一下,居然還小小的實現了一番,太開心了,迫不及待的拿出來分享一下:

不過當然還沒有完全實現,還需要進一步的設計批量操作。程式碼貼出來:

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了,~~~~(>_<)~~~~