首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于EmguCV的BGR直方图比较

基于EmguCV的BGR直方图比较
EN

Stack Overflow用户
提问于 2013-06-06 17:45:16
回答 2查看 4.7K关注 0票数 3

我正在尝试根据直方图的相似性进行某种类型的图像排名。我取了一张图像,需要将它的直方图与图像数据库进行比较,根据与源图像的相似程度对它们进行排序。这应该像过滤器一样工作,取一个具有最相似图像的子组,然后将它们与其他更准确且计算成本更高的方法进行比较(模式匹配、SURF等)。

这背后的想法是,例如,一些图像有很多蓝色,在库中有6个图像有很多蓝色,所以它会将这些图像排序得更高。其他图像有很多黄色(蓝色和绿色)...

此时,我的代码是:

代码语言:javascript
复制
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);
}

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

我读到了这样做的一个方法是地球移动距离(EMD)。EmguCV有一个名为cvCalcEMD2的函数,但我不知道如何使用它(参数是什么意思),也找不到它的用法示例。

EN

回答 2

Stack Overflow用户

发布于 2014-11-10 19:16:04

如果你想要平均直方图,你也可以直接在灰度图像上计算它,如下所示:

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

也许在你的样本中

代码语言:javascript
复制
(cBlue + cGreen + cRed) / 3.0

范围被裁剪了,因为它是以字节为单位计算的?但是,你也应该说,要更好地理解这个问题是不够的。

票数 1
EN

Stack Overflow用户

发布于 2017-12-21 15:45:58

而不是像这样计算强度

(cBlue + cGreen + cRed) / 3.0

您可能想要使用相对亮度,它在组合三种颜色分量以获得“灰度”时考虑了眼睛的敏感度。

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

您可以找到有关relative luminance here的更多信息

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16958834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档