1. 程式人生 > >影象處理之Matlab特徵提取和表達

影象處理之Matlab特徵提取和表達

今天,剛學了一些規則圖形的特徵提取,發現了幾個好用的函式。請見下文:
我想對下面的圖片進行影象內容提取
這裡寫圖片描述
一.載入影象,影象分割
因為是一張彩色影象,所以先進行影象分割,最簡單的就是閾值化了,可以直接使用im2bw(),影象分割的其他方法先不展開,下回分析,在這裡使用im2bw()函式已經夠用

img = imread('圖形.jpg');
figure,imshow(img);
img = im2bw(img);%(影象分割)轉化為二值圖
img = not(img);%把影象想表達的內容變成1
figure,imshow(img);

效果如下:
這裡寫圖片描述
這裡寫圖片描述
最上面那個轉化成二值圖,變成一個不規則的圖形了,應在繼續對這個區域做處理,但這不影響我們這篇文章的主題,所以先忽視。

二.使用bwboundaries函式顯示影象中目標的邊界
bwboundaries函式可以追蹤目標的外邊界,以及這些目標中孔的邊界。它返回:
1.一個元胞陣列(B)(補充:元胞陣列不同於普通陣列,普通陣列存放的元素都是一樣的資料結構,但元胞陣列儲存的可以是不同的資料型別,所以元素間不相關)
2.返回一個標號矩陣L,其中每個目標賦予一個標號(下面有示例)
3.返回總目標數N等

[B,L] = bwboundaries(img);
figure,imshow(img);
hold on;
for k = 1:length(B)
    boundary = B{k};
    plot(boundary
(:,2),boundary(:,1),'g','LineWidth',2); end

效果如下:
這裡寫圖片描述

三.標記區域
使用bwlabel標記測試影象中的連續區域(目標),偽彩色化他們,並結合他們的數字標記依次顯示他們

[L,N] = bwlabel(img);
img_rgb = label2rgb(L,'hsv',[.5 .5 .5],'shuffle');
figure,imshow(img_rgb);hold on
for k =1:length(B)
    boundary = B{k};
    plot(boundary(:,2),boundary(:,1),'w','LineWidth'
,2); text(boundary(1,2)-11,boundary(1,1)+11,num2str(k),'Color','y','Fontsize',14,'FontWeight','bold'); end

效果圖如下:
這裡寫圖片描述

到這裡,特徵提取基本完成,接下來
四.特徵表達
使用regionprops函式對影象中的每個目標提取下面的二值特徵
這個函式實在是好用,直接使用它可以統計很多資訊,在workspace可以檢視。

stats = regionprops(L,'all');%統計的數保留在stats內
temp = zeros(1,N);
for k = 1:N
    %計算thinness ratio(細度比例)
    temp(k) = 4 * pi * stats(k,1).Area / (stats(k,1).Perimeter)^2;
    stats(k,1).ThinnessRatio = temp(k);
    %計算aspect ratio
    temp(k) = (stats(k,1).BoundingBox(3))/(stats(k,1).BoundingBox(4));
    stats(k,1).AspectRatio = temp(k);
end

檢視效果:
這裡寫圖片描述
從這裡可以檢視很多資料,比如Area(面積),Centroid(重心),Eccentricity(偏心率),Perimeter(周長)等等,也可以像我一樣,定義thinness ratio(細度比例)等等。

其實做到這裡,差不多了,接下來就是分析資料,檢視各個圖行差距比較大的特徵,然後定義閾值來製作分類器。
也可以更清晰地表達畫出特徵向量圖。以面積和細度比例為例

areas = zeros(1,N);
for k = 1:N
    areas(k) = stats(k).Area;
end
TR = zeros(1,N);

for k = 1: N
    TR(k) = stats(k).ThinnessRatio;
end
cmap = colormap(lines(21));
figure
for k = 1:N
    scatter(areas(k),TR(k),[],cmap(k,:),'filled');
    ylabel('Thinness Ratio'),xlabel('Area');
    hold on
end

效果如下:
這裡寫圖片描述

OK,這次學習就到這裡,希望大家多多交流,一起學習,分享知識是一種美德,謝謝觀看。
附:
參考書籍:《實用MATLAB影象和視訊處理》