我試圖製作一種白色至黃色比色計。通過直方圖測量圖像中的顏色
我會盡力解釋,但由於我是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種色調的像素的 (它們不會完全離開彼此)。我還沒有嘗試過這個。
你知不知道是否有更好的方法來實現這個目標,或者至少如果我正確的方式來做這樣的應用程序?
你想如何處理一個完全黑色的圖像? – Bill
實際上,爲了我的特定目的,我不必處理黑色圖像,但是如果我這樣做,我期望將其檢測爲完全超出規格顏色,因爲我對白色至黃色感興趣。 –
糖晶體的圖像可以ilustrate我試圖做的處理,因爲你會有不同程度的顏色從白色到黃色。 –