簡體   English   中英

使用EmguCV進行BGR直方圖比較

[英]BGR Histogram comparison using EmguCV

我試圖根據直方圖的相似性進行某種圖像排序。 我拍攝一張圖像,需要將其直方圖與根據與源圖像的相似程度排序的圖像數據庫進行比較。 這應該像過濾器一樣工作,使用具有最相似圖像的子組,然后將它們與其他方法進行比較,更准確,計算成本更高(模式匹配,SURF等等)。

這背后的想法是,一些圖像具有例如大量的藍色,並且在庫中有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的函數,但我不知道如何使用(參數是什么意思)它並且找不到它的用法示例。

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

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

也許在你的樣本中

(cBlue + cGreen + cRed) / 3.0

范圍被裁剪,因為它以字節計算? 但是,你應該說如何更好地理解這個問題是不夠的。

而不是計算強度

(cBlue + cGreen + cRed)/ 3.0

你可能想要使用相對亮度,它在組合三個顏色分量時考慮到眼睛的靈敏度,以獲得“灰度級”。

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

您可以在此處找到有關相對亮度的更多信

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM