2012-03-13 30 views
2

RGB由三個通道組成 - 紅色,綠色,藍色。如何讓我們說rgb中的棕色通道?如何從照片中獲取任何顏色的通道?

我需要它能夠識別照片中的褐色(生鏽)物體,因此將照片轉換爲「棕色通道」會很好。

編輯:

下面是從中棕色應當承認照片:

http://dl.dropbox.com/u/4571/section.jpg

+0

下面是一個相關的問題,顯示檢測圖像中的顏色的技術:[如何將RGB圖像轉換爲灰度但保留一種顏色?](http://stackoverflow.com/q/4063965/52738) – gnovice 2012-03-14 15:43:59

回答

2

人們可以從字面上的二維中想到棕褐色,但棕色通道只能是一維。 Ergo,你無法像你想的那樣容易地定義一個棕色通道。

即使紅色通道並沒有真正定義顏色的紅色,所以您需要在任何人可以幫助您之前定義棕色通道的含義。有很多方法可以僞造圖像以反映任何給定像素的棕色。也許你可以從一些標稱的棕色顏色中選擇L * a * b *單位的歐幾里德距離(通常稱爲ΔE)。當然,如果你是給定顏色的紅色,綠色或藍色(全部是相同的量),這會給你同樣的棕色。假設我們直接從中性軸移動k個單位,而不是直接移動到中性軸k個單位。當然,遠離中性會產生更多的棕色,但上述定義(以德耳塔E表示)並不是這樣。

您可能會考慮將顏色空間中的某些路徑定義爲棕色。因此,考慮從白色到您將定義爲「棕色」的點的路徑。 (仔細挑選這一點,它是否在色域邊界上?如果不是,當你朝那個方向進一步移動時會發生什麼?)現在,棕褐色基本上是沿着你的路徑從白色到白色的距離。對於不在該路徑上的任何顏色,將該點正交投影到路徑上以確定其基本的棕色。請注意,如果您的路徑定義在您的色彩空間中是直線,則會有所幫助,否則此正交投影會變得有點令人討厭。

給定一段時間,我可能會想出另一種方法來定義棕色,但這是你的問題,而不是我的。只有你可以定義你的意思。

編輯:鑑於修改後的問題中顯示的圖片,我會建議一個簡單的方案。這些「褐色」斑點似乎由深褐色組成,並且是淡淡的,幾乎淡黃色的「棕褐色」,但在這兩種替代品之間並不真正。所以,將你的圖像轉換成像CIE Lab這樣的色彩空間。現在,每個像素將以實驗室空間中的相應座標表示,而不是RGB。現在,選擇名義上的棕色和名義上的黃色,然後從這兩點計算實驗室中的歐幾里德距離。如果像素在某個指定的容差範圍內,則將其稱爲棕色或黃色。這是您的問題的常見解決方案。

+0

感謝您的解釋。我會盡力去走這條路。我已經更新了我的問題,並附有我想要承認的棕色斑點圖片的鏈接。 – 2012-03-13 15:01:12

0

我會去通過照片搜索我的棕褐色

我鏽褐色將是「165; 42; 42」的RGB。

調色板
http://web.njit.edu/~kevin/rgb.txt.html#Brown

我將遍歷每個像素,並檢查是否有任何類似的值。如果其中一個通道足夠接近基準(比如+/- 5),我會將這個pixcel的座標保存在單獨的列表中。

這也使我靈敏度的控制 - 我能決定的解決方案應該如何準確的是...

而且隨着保存pixcels的列表,你可以簡單地重新着色,即它們作爲黃,以顯示您的應用程序向用戶發現了什麼。

這個解決方案可能會很慢,但是...如果有任何內建的解決方案我不知道,使用它們可能會更明智。

+0

感謝您的建議。如果沒有其他事情發生,我會使用這種方法。但我更喜歡更「先進」的東西。 – 2012-03-13 11:16:15

1

您可以嘗試使用歐幾里德距離來測量像素顏色和目標顏色之間的距離。然後,您可能會在此之上添加閾值技術,以僅選擇在目標顏色的定義範圍內的像素。

在RGB空間中的歐幾里德距離很簡單:距離= SQRT((RT-RP)^ 2 +(RT-RP)^ 2 +(RT-RP)^ 2)

使用XT和XP成爲目標顏色和圖像像素的RGB分量。

您可以通過最大可能的距離(即黑白之間的距離(我對最後一部分不確定,可以嘗試交替標準化))對此進行標準化。

這裏有一個例子在Matlab:

% Load image in RGB encoding 
file='rust.jpg'; 
img=imread(file); 
% Target 
brown=[165 42 42]; 
imgd=double(img); 
% Compute the euclidean distance so that 255 is exactly this color and 0 the maximum possible distance (between black and white) 
browndistance=uint8(255-255*sqrt((brown(1)-imgd(:,:,1)).^2+(brown(2)-imgd(:,:,2)).^2+(brown(3)-imgd(:,:,3)).^2)/sqrt(255^2+255^2+255^2)); 
figure; 
imshow(browndistance,[0 255]); 

只測試,它可以工作,也許這將是不準確的滿足你的需求。

相關問題