嗨,OpenCV/Emgu 高手们,
我有一个正在为其生成轮廓的图像,如下所示。我正在尝试基于颜色直方图修剪搜索空间以查找图像。如何获取仅围绕显着物体轮廓的掩码并阻止其余部分。因此,我有两个问题:
如何“反转”轮廓外的图像?洪水填充反转,不是吗?我对 OpenCV 中的所有选项感到困惑。
其次,在这种情况下(红色汽车),如何从轮廓对象生成 1-d 颜色直方图来排除黑色背景,并仅生成包括汽车的颜色直方图。
如何在 OpenCV 中执行此操作(最好使用 Emgu/C# 代码)?
嗨,OpenCV/Emgu 高手们,
我有一个正在为其生成轮廓的图像,如下所示。我正在尝试基于颜色直方图修剪搜索空间以查找图像。如何获取仅围绕显着物体轮廓的掩码并阻止其余部分。因此,我有两个问题:
如何“反转”轮廓外的图像?洪水填充反转,不是吗?我对 OpenCV 中的所有选项感到困惑。
其次,在这种情况下(红色汽车),如何从轮廓对象生成 1-d 颜色直方图来排除黑色背景,并仅生成包括汽车的颜色直方图。
如何在 OpenCV 中执行此操作(最好使用 Emgu/C# 代码)?
#!/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)
# 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)
我认为这更符合原意,因为掩码是单独生成并应用于完全不同的图像。在两种情况下,直方图大致相同...