2017-03-08 11 views
3

私は白から黄色のスケールの比色計を作ろうとしています。ヒストグラムを使って画像から色を測定する

私はよく説明しようとしますが、私はPythonとImage Processingで新しいので、間違ったことを言ってください。

私は3つのコンポーネント(色相、彩度、値)の色の特徴をよりよく表すことができると私が読んでいる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) 

、私が希望色相、彩度、および値のヒストグラムの類似性を示す3つの別々の値を持っていれば、dh、ds、dvの各組み合わせのyスコア値を得るためにいくつかの数学的モデリングを試すことができます。

黄色のピクセル画像の色相ヒストグラムを比較すると、相関比較では、白と黄の色合いがわずかに変化するため、類似していると解釈されても完全に異なることが示されます。私は、ヒストグラム上のピクセルの頻度だけに依存するものではなく、色相値の近接性も必要とします。

ヒストグラムの加重平均を計算することを考えていたので、類似の分布についてはもっと近い値 を使用することもできました。30色相のピクセルピークとピークを持つ別の画像 の25色相のピクセル(完全に離れているわけではありません)。私はまだこれを試していない。

これを達成するためのよりよい方法があるかどうか、または少なくともそのようなアプリケーションを実行する正しい方法を知っていますか?

+0

どのように完全に黒い画像を扱いたいですか? – Bill

+0

実際には、私の特定の目的のために黒い画像を処理する必要はありませんが、もしそうなら、私は白から黄色の色に興味があるので、完全に仕様色から検出すると予想します。 –

+0

砂糖の結晶の画像は、あなたが白から黄色までの色のレベルが異なるため、私がやろうとしている処理の種類を取り除くことができます。 –

答えて

2

画像の「黄色さ」を得るには、まず色相を取ります。その後、それをセクターに分割し、180-300-60(C-M-Y)でカットします。 60と180の間のものは、イエローとシアンの線形結合です。 60と300の間のものは、イエローとマゼンタの線形結合になります。 160と300の間の値は0の黄色の値になります。線形の組み合わせを0〜100%の黄色に変換します。この値をyとします。

白色の「白色度」を得るには、彩度を使用します。 S = 0は100%白、S = 30は70%白である。この値をwとします。

次に、あなたは私が白の色合いとしてHSV空間を使用することはありません

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

リニアライゼーションには良いアイデアのようですが、同じ画像上の各ピクセルに色々な色相を持つことができるので、単純であれば分かりません。そのため、ヒストグラムを使用しようとしていて、各色相値のピクセル数を評価してから、彩度と明度について同じ処理を行うと、ヒストグラムを比較する正しい方法を適用すればより正確になります。私は、ピクセルの頻度だけに頼らず、色相値の近さにも依存するものが必要です。 –

+0

この変換は、ヒストグラムを作成するのを止めません。あなたのヒストグラムが何であるかを変えるだけです。または、ヒストグラムを使用しないメソッドが必要でしたか?そして、あなたは "近接"の意味を詳しく説明できますか? – Bill

+0

いいえ、いいえ、画像に色成分がどのように配分されているかについて正確な情報を提供できると考えて、ヒストグラムに固執したいと思います。私が近接と言うとき、私は分布の形状を考慮する比較方法が必要であることを意味します.30色の3000ピクセルのヒストグラムは30色相の3000ピクセルから完全に離れていません。これがうまくいくと思いますか?興味深いことに、RGB色空間内でいくつかの結果を試してみることができます。 –

1

ような何かを行うことができます(ノイズのため、あなたが任意の値を得ることができます)未定です。

まず、RGB空間内のピクセルの広がりを観察します。 (しかし、サンプル画像は一切提供していません。)

+0

HSVでは、色相値が限界内にあることを確認するためにフィルターマスクの使用を検討しました。 サンプル[画像](http://rkintl.org/wp-content/uploads/2016/01/sugar-crystals-photograph.jpg)があります。 紫色の背景を意識していないと、砂糖の結晶が白と黄色の色合いを持つことがあります。 –

+0

違いは非常に微妙です。再現性の高い結果を得るために工業用の照明を使用して、制御された条件で作業する必要があります。もちろん、色のついた背景はヒープ全体を汚染するので疑問にはなりません。このイメージでは青糖が見つかります。 –

+0

"色相値が限界内にあることを確認する":これは、色相が不定である場合には役に立たない。 –

関連する問題