2013-06-06 3 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 + КРЭД)/3.0

вы можете захотеть использовать относительную яркость, которая принимает во внимание чувствительность глаза, когда объединить три цветовые компоненты получить «серый уровень».

Y = 0,2126 * КРЭД + 0,7152 * cGreen + 0.0722 * cBlue

Вы можете найти больше о relative luminance here

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