2015-09-06 65 views
2

我有一張圖片。我需要從圖像中的每個對象提取RGB值。如何提取圖像中物體的RGB值?

這裏是圖像:

爲了提取每個對象的RGB值,我需要將圖像轉換爲二進制,然後分割出的每個對象。這會產生一個遮罩,讓我可以在圖像中找到對象的位置。

但是,一旦我細分出對象,我需要將掩碼轉換回每個對象的原始顏色。

我該怎麼做?

這裏是我寫的代碼:

img = imread('tr1.jpg'); 
abu=rgb2gray(img); 
cb=imclearborder(abu); 
thresh=graythresh(cb); 
b=im2bw(cb,thresh); 
bw=bwareaopen(b,60); 
bwfill=imfill(bw,'holes'); 
label=bwlabel(bwfill,8); 
max(max(label)) 
im1=(label==1); 

回答

4

如果我正確地解釋你的問題的陳述,你必須存儲在您的bwfill圖像二值蒙板和要提取出原始色彩與二進制面具。具體來說,您要創建一個輸出圖像,其中黑色不是您想要的對象的一部分,任何非黑色都屬於這些對象。

您可以非常有效地使用bsxfun爲使用您的bwfill圖像。您將使用times函數將掩碼與原始圖像中的每個通道相乘,以便只保留掩碼中非零的像素。使用bsxfun您需要確保您所乘的兩個輸入之間的數據類型是相同的類型,並且因爲bwfilllogical,所以在進行乘法之前,您需要將其轉換爲uint8

順便說一句,我要直接讀StackOverflow的圖像,這樣的結果是可重複:

%// Change 
img = imread('http://i.stack.imgur.com/mxmma.jpg'); 

%// Your code 
abu=rgb2gray(img); 
cb=imclearborder(abu); 
thresh=graythresh(cb); 
b=im2bw(cb,thresh); 
bw=bwareaopen(b,60); 
bwfill=imfill(bw,'holes'); 

%// New code starts here 
out = bsxfun(@times, img, uint8(bwfill)); 

%// Show the image 
imshow(out); 

我們得到這個圖片:

enter image description here


現在,我知道你真的以後(你並沒有真正地讓自己清楚......),我建議你在二進制映像本身上使用regionprops - 特定的使用BoundingBox屬性,然後遍歷每個邊界框屬性,並從上面定義的分割圖像中提取出像素。但是,每個對象的大小都不相同,因此應將其放入單元格數組中。

喜歡的東西:

%// Apply regionprops to the binary mask 
s = regionprops(bwfill, 'BoundingBox'); 

%// Create a cell array for the objects 
objects = cell(numel(s), 1); 

%// For each object... 
for idx = 1 : numel(s) 

    %// Get the bounding box property 
    bb = floor(s(idx).BoundingBox); 

    %// Extract out the object from the segmented image and place in cell array 
    objects{idx} = out(bb(2):bb(2)+bb(4), bb(1):bb(1)+bb(3),:); 
end 

objects包含分割的對象。如果你想顯示的對象,簡單地做:

imshow(objects{ii}); 

ii是要從1顯示多達一樣多進行檢測,這是numel(objects)的對象。

例如,如果我發現的第一個對象,我們得到:

imshow(objects{1}); 

enter image description here

+0

實際上,我需要通過一個提取的每個對象一個的RGB值。所以起初,我想我必須使用「bwlabel」將它分開,然後使用「bsxfun」逐個轉換二進制對象。 我可以這樣做嗎?謝謝。 –

+0

在分段圖像上使用'regionprops'而不是'bwlabel'。我會更新我的答案。 – rayryeng

+1

非常感謝! :) –

-2
通過它的自動功能檢測Matlab的顏色

最好的方法檢查這個代碼是通過創造自動功能的直方圖選擇嘗試你的代碼

clc; 

清除所有; J = imread('yourimage.jpg');

I = imresize(J,[500NaN]);

%色功能的創造者 colorThresholder(I) %創建在同一目錄下的功能不要更改路徑和名稱後

createMask(I) 身影,imshow(I) 圖,imshow(ANS )

%歡呼聲

+0

請格式化您的答案,並添加更多解釋:目前還不清楚您的代碼如何解決問題或它究竟做了什麼。 – Shai

+0

任何需要手動操作的技術都不會被認真對待。這種方法如何提供比目前接受的答案更多的東西? – rayryeng