2012-03-09 2 views
3

Эй OpenCV/Emgu гуру,Генерация цвета Гистограмма вокруг контурного объекта

У меня есть изображение, которое я генерирующий контур для см ниже. Я пытаюсь создать основанную на цветовой гистограмме обрезку пространства поиска изображений для поиска. Как я могу получить маску вокруг только выделенного контура объекта и блокировать оставшиеся. Поэтому у меня есть вопрос с 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

Пример функции гистограммы рендеринга также чуть-чуть основной - но я думаю, что это показывает идею (и как автомобиль преимущественно красный!). Обратите внимание на то, что интерпретация Hue 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) 

(я думаю, что это более того, что предназначалось, так как затем маска выводится отдельно и применяется к совершенно другому изображению. Гистограмма примерно одинакова в обоих случаях ...)

Смежные вопросы