天天看點

如何擷取彩色圖像中的主色彩

一:基本思路

對于一張RGB色彩空間的彩色圖像,很多時間我們想通過程式獲得該圖像有幾種主要的色彩,但是對一般圖像來說,在色彩交界處都是通過像素混合來實作自然過渡,是以直接掃描圖像的像素值,得到的不同顔色值可能多達上百中,而實際上圖像可能隻有3~4種的主要色彩,如何去掉那些混合顔色,準确提取出來這3~4中的主色彩,根據一般圖像的特征,圖像在不同色彩的邊界處混合不同的顔色值,此可以視為圖像的邊緣特性之一,是以可以根據簡單的邊緣梯度算法實作這些混合像素的提取得到輸出的像素值數組,然後掃描每個像素值,尋找指定半徑參數R周圍的像素,發現為零,而且距離中心像素最近的像素點的值做為中心像素的像素值,掃描結束以後輸出像素數組,然後對數組線性掃描,即可得到圖檔的主要色彩RGB值。

二:實作步驟

1.      輸入圖像數組,對彩色圖像灰階化

2.      對灰階化以後的圖像,計算圖像梯度,這裡使用sobol算子

3.      對得到每一個非零像素點實作半徑為R的範圍内的掃描,找出與之最相近的為零的原像素值

4.      對得到數組進行簡單的掃描,得到主色彩

其中參數R是要根據不同應用場景,找到最合适的值。理論上圖像越大,R的取值也應該越大,否則算法會失準。

三:原圖及運作效果

如何擷取彩色圖像中的主色彩

原圖

如何擷取彩色圖像中的主色彩

算法運作之後提取到四種主要色彩

四:算法實作源代碼

需要定義的常量值如下:

梯度求取使用是sobol算子,對處理以後的BufferedImage對象掃描擷取主色彩的代碼如下:

測試代碼如下:

注意:主要的關鍵在于對待處理圖像輸入正确大小的半徑,這個半徑大小跟圖像實際大小相關,而且算法可以近一步優化成不依賴半徑參數的版本,知道找到等于零的像素為止。

繼續閱讀