2011-03-24 71 views
8

我試圖根據像素值分隔greylevel圖像:假設像素從0到60在一個箱,60-120在另一個,120-180 ...等等直到255。範圍大致等於空間在這種情況下。 但是,通過使用K-means聚類,可以更準確地測量我的像素值範圍應該是什麼?試圖獲得相似的像素在一起,而不是浪費像素濃度較低的區域。K-means可以用來幫助基於像素值的圖像分離嗎?

EDITS(包括所獲得的結果): enter image description here enter image description here

k均值沒有簇的= 5

+0

這聽起來像直方圖均衡很糟糕... http://fourier.eng.hmc.edu/e161/lectures/contrast_transform/node3.html – 2011-03-24 02:20:42

+0

正如@ Throwback1986所說的那樣並不是那麼相似。我不是想要均衡直方圖,而是儘可能高效地分割直方圖。 – AruniRC 2011-03-24 09:07:28

回答

10

當然K-Means可以用於顏色量化。這非常方便。

讓我們看看在Mathematica一個例子:

我們先從灰度(150×150)圖像:

enter image description here

讓我們來看看代表在8位圖像時多少灰度級有:

ac = ImageData[ImageTake[i, All, All], "Byte"]; 
[email protected]@[email protected]@ac 
-> 234 

好的。讓我們減少這234個級別。我們的第一次嘗試將獨自讓算法來確定有多少羣是有默認配置:

ic = ClusteringComponents[[email protected]]; 
[email protected]@[email protected]@ic 
-> 3 

它選擇3個集羣,以及相應的圖像是:

enter image description here

現在,如果沒關係,或者你需要更多的羣集,取決於你。

假設您決定需要更細粒度的分色。讓我們索要6個集羣,而不是3:

ic2 = ClusteringComponents[[email protected], 6]; 
[email protected] // ImageAdjust 

結果:

enter image description here

,這裏是每個箱中使用的像素範圍:

Table[{[email protected]#, [email protected]#} &@(Take[orig, {#[[1]]}, {#[[2]]}] & /@ 
    Position[clus, n]), {n, 1, 6}] 
-> {{0, 11}, {12, 30}, {31, 52}, {53, 85}, {86, 134}, {135, 241}} 

和像素數在每個箱中:

Table[Count[[email protected], i], {i, 6}] 
-> {8906, 4400, 4261, 2850, 1363, 720} 

所以,答案是肯定的,而且很簡單。

編輯

也許這將幫助你瞭解你在你的新的例子做錯了什麼。

如果我clusterize您的彩色圖像,並使用羣集數來表示的亮度,我得到:

enter image description here

這是因爲簇不被按升序亮度順序編號。

但如果我計算每個分類中的平均亮度值,並用它來表示簇的價值,我得到:

enter image description here

在我前面的例子,這是不需要的,但是這是隻是運氣:D(即集羣被發現亮度升序)

+0

感謝您的詳細解釋,得到了基本的概念。不過,我會用OpenCV和VC++來做這件事 - 任何想法會是多麼直截了當? – AruniRC 2011-03-24 08:34:03

+0

@阿妮我真的不知道,對不起。請注意,我在一維色彩空間中進行了聚類,而不是在圖像空間中。這意味着檢測物體是沒有用的,但是會壓縮和簡化圖像A LOT。如果你需要做空間聚類,也許mean-shift也是一個不錯的選擇。 – 2011-03-24 08:51:00

+0

大聲笑我剛剛在OpenCV中運行它。釣魚後,關於文件和雅虎討論組。工作正常。不管怎麼說,多謝拉。 – AruniRC 2011-03-24 09:08:52

2

k均值可以被應用到您的問題。如果是我,我首先會嘗試從決策樹中借用的基本方法(雖然「更簡單」取決於您的精確聚類算法!)

假設存在一個bin,開始將像素強度填充到bin中。當垃圾箱「足夠」時,計算垃圾箱(或節點)的平均值和標準偏差。如果標準偏差大於某個閾值,則將節點分成兩半。繼續這個過程,直到所有的強度都完成了,你將會得到更有效的直方圖。

這種方法可以用,當然更多的細節進行改進:

  1. 您可以考慮使用峯度作爲分裂準則。
  2. 其中發生分裂
  3. 你可能會一路越境進入決策樹的土地和借用Jini的指標來指導分裂(有的拆分技術依賴於更多的「異國情調」的統計數據,比如T字偏態可能會被用來確定測試)。
  4. 最後,您可以執行最終合併階段來合併任何稀疏填充的節點。

當然,如果您已經應用了所有的上述「改善」,那麼你已經基本落實的K-均值聚類算法;-)

注意一個變化:我不同意以上評論 - 你所描述的問題沒有出現密切相關的直方圖均衡。

+0

真的,它不是直方圖均衡 - 在OpenCV中有一個單線函數調用(當實際項目是從真正模糊的街景中提取文本時,我不會重新發明輪子)。 – AruniRC 2011-03-24 08:36:02