C#用EmguCV实现获取2个图的相似度

By qq84628151 没有评论

相似度值越接近越0,表示越相似,末尾有程序效果截图。

static void Main(string[] args)
{
    ImageComparator test = new ImageComparator();
    test.setBaseImage(new Mat(@"D:/test22 - 副本.jpg"));
    test.setInputImage(new Mat(@"D:/test_jiaoyan_2.jpg"));

    Console.WriteLine(test.calculateDifference());
    Console.ReadLine();
}

public class ImageComparator
{
    private Mat baseImg;
    private Mat inputImg;
    int nBins;//每个颜色通道使用的箱子数量
    public ImageComparator()
    {
        nBins = 8;//默认8个箱子
    }
    public void setBaseImage(Mat img)
    {
        baseImg = img;
    }
    public void setInputImage(Mat img)
    {
        inputImg = img;
    }
    /// <summary>
    /// 计算相似度
    /// </summary>
    public double calculateDifference()
    {
        DenseHistogram[] histogramOfBaseImage = new DenseHistogram[3];
        DenseHistogram[] histogramOfInputImage = new DenseHistogram[3];
        for (int i = 0; i < 3; i++)
        {
            histogramOfBaseImage[i] = new DenseHistogram(nBins, new RangeF(0f, 255.1f));
            histogramOfBaseImage[i].Calculate<byte>(new Image<Gray, byte>[] { baseImg.ToImage<Bgr, byte>().Split()[i] }, false, null);
            histogramOfInputImage[i] = new DenseHistogram(nBins, new RangeF(0f, 255.1f));
            histogramOfInputImage[i].Calculate<byte>(new Image<Gray, byte>[] { inputImg.ToImage<Bgr, byte>().Split()[i] }, false, null);
        }
        Image<Bgr, float> histOfBaseImg = new Image<Bgr, float>(nBins, 1);
        Image<Bgr, float> histOfInputImg = new Image<Bgr, float>(nBins, 1);
        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < nBins; j++)
            {
                histOfBaseImg.Data[0, j, i] = (float)histogramOfBaseImage[i].GetBinValues()[j];
                histOfInputImg.Data[0, j, i] = (float)histogramOfInputImage[i].GetBinValues()[j];
            }
        }
        return CvInvoke.CompareHist(histOfBaseImg, histOfInputImg, HistogramCompMethod.Bhattacharyya);
    }
}