2017-03-08 77 views
3

我試圖製作一種白色至黃色比色計。通過直方圖測量圖像中的顏色

我會盡力解釋,但由於我是Python和圖像處理方面的新手,請糾正我,如果我說錯了什麼。

我使用HSV色彩空間,因爲我可以更好地表示三個組件(色調,飽和度和值)中的顏色特徵。假設我有一些白色的圖像,程序應該能夠根據像素的色調,飽和度和圖像的值計算出一個值,如果我提供的圖像具有略帶白色到黃色的色調,它應該給出類似的值。

以下是image of sugar crystals的示例。無視紫色背景時,糖有白色和黃色的色調。

我的第一次嘗試是計算幾乎全白的圖像的直方圖並將其用作參考,然後計算另一圖像的直方圖並比較它們以檢查它們是否相似。隨着越來越多的黃色是,大致相似的應該是,記住,單個圖像可具有白色和黃色像素,或在色相直方圖甚至一系列不同的黃色色調):

import numpy as np 
import cv2 
from matplotlib import pyplot as plt 

image = cv2.imread("C:\...\im1.png") 
image2 = cv2.imread("C:\...\im2.png") 

hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) 
hsv_image2 = cv2.cvtColor(image2, cv2.COLOR_BGR2HSV) 

hue_hist = cv2.calcHist([hsv_image], [0], None, [180], [0, 180]) 
sat_hist = cv2.calcHist([hsv_image], [1], None, [256], [0, 256]) 
val_hist = cv2.calcHist([hsv_image], [2], None, [256], [0, 256]) 

hue_hist2 = cv2.calcHist([hsv_image2], [0], None, [180], [0, 180]) 
sat_hist2 = cv2.calcHist([hsv_image2], [1], None, [256], [0, 256]) 
val_hist2 = cv2.calcHist([hsv_image2], [2], None, [256], [0, 256]) 

dh = cv2.compareHist(hue_hist, hue_hist2, cv2.cv.CV_COMP_CORREL) 
ds = cv2.compareHist(sat_hist, sat_hist2, cv2.cv.CV_COMP_CORREL) 
dv = cv2.compareHist(val_hist, val_hist2, cv2.cv.CV_COMP_CORREL) 

在那之後,我會有三個分開的值表示色調,飽和度和值的直方圖相似性,然後我可以嘗試一些數學建模以獲得每個dh,ds,dv組合的某個y分值。

問題在於,如果您比較黃色像素圖像的色相直方圖,則相關性比較將顯示它們完全不同,即使它們可能會被解釋爲相似,因爲白色到黃色色調略有變化。我需要的東西不僅僅依賴於直方圖上像素的頻率,還需要色調值的接近度。

我認爲的另一個解決方案是計算直方圖的加權平均值,所以也許我可以得到更接近的值 甚至如果將圖像與具有30色調的像素峯值和具有峯值的另一圖像具有25種色調的像素的 (它們不會完全離開彼此)。我還沒有嘗試過這個。

你知不知道是否有更好的方法來實現這個目標,或者至少如果我正確的方式來做這樣的應用程序?

+0

你想如何處理一個完全黑色的圖像? – Bill

+0

實際上,爲了我的特定目的,我不必處理黑色圖像,但是如果我這樣做,我期望將其檢測爲完全超出規格顏色,因爲我對白色至黃色感興趣。 –

+0

糖晶體的圖像可以ilustrate我試圖做的處理,因爲你會有不同程度的顏色從白色到黃色。 –

回答

2

要獲得圖像的「黃色」,首先採取色相。然後將其劃分爲180-300-60(C-M-Y)區段。 60到180之間的任何東西都是黃色和青色的線性組合; 60和300之間的任何東西都是黃色和洋紅色的線性組合。 160到300之間的任何值都將爲0的黃色值。將線性組合轉換爲0-100%黃色。調用此值y

要獲得白色「白度」,請使用飽和度。 S = 0是100%白色,S = 30是70%白色。調用此值w

然後,你可以做這樣的事情

yellowness = y/(y + w) 
whiteness = w/(y + w) 
+0

這似乎是一個線性化的好主意,雖然我不確定它是否會工作簡單,因爲我可以爲同一圖像上的每個像素提供許多不同的色調。這就是爲什麼我試圖使用直方圖,評估每個色相值上的像素數量,然後對飽和度進行相同處理,亮度將提供更高的精度。如果我使用正確的方法比較直方圖。我需要的東西不僅僅依賴於像素的頻率,而且還依賴於色調值的接近度。 –

+0

這種轉變不會阻止你做直方圖。它只會改變你的直方圖。還是你想要一個不使用直方圖的方法?你能詳細說明你的意思嗎?「接近」? – Bill

+0

不,不,我想堅持直方圖,因爲我相信他們可以提供關於顏色分量如何分佈在圖像上的準確信息。當我說接近度時,我的意思是我需要一個考慮分佈形狀的比較方法,那麼在29色調上具有3000像素的直方圖將不會完全遠離30色相上的3000像素。你認爲這會起作用嗎? –

1

我不會用HSV空間的白色色調未定(因爲噪音,您可以得到任何價值)。

我首先會觀察RGB空間中像素的擴散。 (但是你沒有提供任何示例圖片。)

+0

聽起來有趣,我可以在RGB色彩空間中嘗試一些結果。對於HSV,我考慮使用過濾器掩模來確保色相值在極限內。 有一個示例[image](http://rkintl.org/wp-content/uploads/2016/01/sugar-crystals-photograph.jpg)。 考慮到紫色背景,你會發現糖晶體可以有白色和黃色的色調。 –

+0

差異很微妙,您需要在良好控制的條件下工作,使用工業級照明才能獲得可重現的結果。當然,彩色背景是無可爭議的,因爲它會污染整個堆:在這個圖像上,你會發現藍糖。 –

+0

「確保色相值在極限內」:當色相不確定時,這是沒有用的。 –