2013-06-06 29 views
3

我试图根据直方图相似性进行某种图像排序。我拍摄一张图像,需要将其直方图与图像数据库进行比较,排序方式取决于与源图像的相似程度。这应该像过滤器一样工作,拍摄具有最相似图像的子组,然后将它们与其他方法进行比较,从而更准确并且计算更为昂贵(模式匹配,SURF等)。BGR使用EmguCV进行直方图比较

背后的想法是,一些图像有很多蓝色,而在图书馆有6个图像有很多蓝色,所以它会将这些图像排在更高的位置。其他图像有大量黄色(蓝色和绿色)的...

在这一点上我的代码是这样的:

Image<Bgr, byte> colorCard = frame.Copy(); 

DenseHistogram histBlue = new DenseHistogram(256, new RangeF(0.0f, 255.0f)); 
DenseHistogram histRed = new DenseHistogram(256, new RangeF(0.0f, 255.0f)); 
DenseHistogram histGreen = new DenseHistogram(256, new RangeF(0.0f, 255.0f)); 

Image<Gray, byte> imgBlue = colorCard[0]; 
Image<Gray, byte> imgRed = colorCard[1]; 
Image<Gray, byte> imgGreen = colorCard[2]; 
imgBlue._EqualizeHist(); 
imgRed._EqualizeHist(); 
imgGreen._EqualizeHist(); 
//Also tried whithout equalizing histograms 

histBlue.Calculate(new Image<Gray, byte>[] { imgBlue }, true, null); 
histRed.Calculate(new Image<Gray, byte>[] { imgRed }, true, null); 
histGreen.Calculate(new Image<Gray, byte>[] { imgGreen }, true, null); 

List<Match> matchList = new List<Match>(); 

foreach (String filename in image_paths) 
{ 
    Image<Bgr, byte> imgToCompare = new Image<Bgr, byte>(filename); 
    imgToCompare = imgToCompare.PyrDown().PyrUp().PyrDown().PyrUp(); 

    DenseHistogram histBlueToCompare = new DenseHistogram(256, new RangeF(0.0f, 255.0f)); 
    DenseHistogram histRedToCompare = new DenseHistogram(256, new RangeF(0.0f, 255.0f)); 
    DenseHistogram histGreenToCompare = new DenseHistogram(256, new RangeF(0.0f, 255.0f)); 

    Image<Gray, byte> imgBlueToCompare = colorCard[0]; 
    Image<Gray, byte> imgRedToCompare = colorCard[1]; 
    Image<Gray, byte> imgGreenToCompare = colorCard[2]; 
    imgBlueToCompare._EqualizeHist(); 
    imgRedToCompare._EqualizeHist(); 
    imgGreenToCompare._EqualizeHist(); 

    histBlueToCompare.Calculate(new Image<Gray, byte>[] { imgBlueToCompare }, true, null); 
    histRedToCompare.Calculate(new Image<Gray, byte>[] { imgRedToCompare }, true, null); 
    histGreenToCompare.Calculate(new Image<Gray, byte>[] { imgGreenToCompare }, true, null); 

    double cBlue = CvInvoke.cvCompareHist(histBlue, histBlueToCompare, Emgu.CV.CvEnum.HISTOGRAM_COMP_METHOD.CV_COMP_CORREL); 
    double cRed = CvInvoke.cvCompareHist(histRed, histRedToCompare, Emgu.CV.CvEnum.HISTOGRAM_COMP_METHOD.CV_COMP_CORREL); 
    double cGreen = CvInvoke.cvCompareHist(histGreen, histGreenToCompare, Emgu.CV.CvEnum.HISTOGRAM_COMP_METHOD.CV_COMP_CORREL); 

    double matchValue = (cBlue + cGreen + cRed)/3.0; 

    matchList.Add(new Match(matchValue, Path.GetFileNameWithoutExtension(filename))); 
} 

matchList = matchList.OrderBy(X => X.MatchValue).ToList<Match>(); 
foreach (Match m in matchList) 
{ 
    Logger.Log(m.Card + ": " + m.MatchValue); 
} 

我可以比较每个颜色直方图,但不知道如何合并这个比较获得单一的价值。女巫(cBlue + cGreen + cRed)/3.0我没有得到好的结果。

我读过一个方法来做到这一点是地球移动距离(EMD)。 EmguCV有一个名为cvCalcEMD2的函数,但我不知道如何使用(这些参数意味着什么),并且无法找到它的用法示例。

回答

1

如果你想相对于平均直方图,你也可以直接计算它的灰度图像上,像这样:

https://stackoverflow.com/a/4906403/586754

也许你的样品中

(cBlue + cGreen + cRed)/3.0 

,由于该范围被裁剪它以字节计算?但是,你也应该说如何更好地理解问题是不够的。

0

代替计算强度如

(cBlue + cGreen + CRED)/ 3.0

你可能想当三个颜色成分相结合,使用的相对亮度,即在帐户取眼灵敏度

的获得“灰度级”。

Y = 0.2126 * CRED + 0.7152 * cGreen + 0.0722 * cBlue

你可以找到更多关于relative luminance here