2012-03-09 19 views
3

Hey OpenCV/Emgu gurus、輪郭を描いたオブジェクトの周りにカラーヒストグラムを生成する

私は輪郭を生成している画像を持っています。私は探している画像の検索スペースの枝刈りに基づいてカラーヒストグラムを生成しようとしています。どのようにして、目立つオブジェクト輪郭の周りでマスクを取得し、残りの部分をブロックすることができますか?だから私は2つの部分の質問があります:

  1. 私はどのように輪郭の外にイメージを "反転"できますか? Floodfill反転、ない?私はOpenCVのすべてのオプションと混同しています。

  2. 次に、黒い背景を除外して車を含む色ヒストグラムのみを生成するために、赤い車の輪郭オブジェクトから1次元の色ヒストグラムを生成するにはどうすればよいですか?

私はOpenCV(好ましくはEmgu/C#コード)でそれをどうしますか?

Source Image Contoured Image

答えて

2
おそらく

このような何か? Pythonバインディングを使用して行いますが、他のバインディングにメソッドを変換するのは簡単... ​​

#!/usr/local/bin/python 

import cv 
import colorsys 

# get orginal image 
orig = cv.LoadImage('car.jpg') 

# show orginal 
cv.ShowImage("orig", orig) 

# get mask image 
maskimg = cv.LoadImage('carcontour.jpg') 

# split original image into hue and value 
hsv = cv.CreateImage(cv.GetSize(orig),8,3) 
hue = cv.CreateImage(cv.GetSize(orig),8,1) 
val = cv.CreateImage(cv.GetSize(orig),8,1) 
cv.CvtColor(maskimg,hsv,cv.CV_BGR2HSV) 
cv.Split(hsv, hue, None, val, None) 

# build mask from val image, select values NOT black 
mask = cv.CreateImage(cv.GetSize(orig),8,1) 
cv.Threshold(val,mask,0,255,cv.CV_THRESH_BINARY) 

# show the mask 
cv.ShowImage("mask", mask) 

# calculate colour (hue) histgram of only masked area 
hue_bins = 180 
hue_range = [0,180] 
hist = cv.CreateHist([hue_bins], cv.CV_HIST_ARRAY, [hue_range], 1) 
cv.CalcHist([hue],hist,0,mask) 

# create the colour histogram 
(_, max_value, _, _) = cv.GetMinMaxHistValue(hist) 
histimg = cv.CreateImage((hue_bins*2, 200), 8, 3) 
for h in range(hue_bins): 
    bin_val = cv.QueryHistValue_1D(hist,h) 
    norm_val = cv.Round((bin_val/max_value)*200) 
    rgb_val = colorsys.hsv_to_rgb(float(h)/180.0,1.0,1.0) 
    cv.Rectangle(histimg,(h*2,0), 
       ((h+1)*2-1, norm_val), 
       cv.RGB(rgb_val[0]*255,rgb_val[1]*255,rgb_val[2]*255), 
       cv.CV_FILLED) 
cv.ShowImage("hist",histimg) 

# wait for key press 
cv.WaitKey(-1) 

これは、マスクを見つける少し不格好です - 私は、画像に起因するJPEGのブロックノイズにおそらく不思議...場合元の輪郭を持っていたので、代わりにこれをマスクに「レンダリング」するだけで十分です。

mask

例ヒストグラムのレンダリング機能もほんの少しの基本である - 私はそれがアイデアを示すと思う(とどのように車は主に赤ですが!)。 OpenCVの色相の解釈は、[0-180]度のにしか及ばないことに注意してください。

histogram

EDIT:あなたは画像の色をカウントするためにマスクを使用する場合 - ラインからそう15を下方として編集:

# split original image into hue 
hsv = cv.CreateImage(cv.GetSize(orig),8,3) 
hue = cv.CreateImage(cv.GetSize(orig),8,1) 
cv.CvtColor(orig,hsv,cv.CV_BGR2HSV) 
cv.Split(hsv, hue, None, None, None) 

# split mask image into val 
val = cv.CreateImage(cv.GetSize(orig),8,1) 
cv.CvtColor(maskimg,hsv,cv.CV_BGR2HSV) 
cv.Split(hsv, None, None, val, None) 

(私はこれがあると思いますマスクは別々に導出され、完全に異なる画像に適用されるため、意図したものより多くのものが得られます。ヒストグラムはどちらの場合もほぼ同じです...)

関連する問題