文章目录

注意

1、直方图: 对数据进行统计的一种方法,可以直观的观察到图像数值的分布情况;直方图可分为:灰度直方图,RGB直方图,HSV直方图等等;
2、直方图的3个特点: dims(维度)、bins(组距个数)、range(直方图取值范围);
3、calcHist() : 计算直方图
images : VectorOfMat 类型;

4、直方图均衡化:EqualizeHist() : 增强图像对比度的一种方法;
src : 8位单通道图像; dst : 均衡化后图像,与src相同尺寸和类型;


5、直方图对比: CompareHist() : 用来比较两幅图像之间的相似度;计算结果通过函数返回值返回;

6、反向投影: EmguCV中使用CvInvoke.CalcBackProjection() 计算反向投影,使用该函数首先需要计算模板图像的直方图(calcHist),然后将直方图归一化到0-255之间,便于显示,然后计算反向投影可之间调用Imshow()直接显示。手的反向投影一般使用HS直方图来投影


Code

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Emgu.CV;
using Emgu.Util;
using Emgu.CV.Structure;
using Emgu.CV.CvEnum;
using Emgu.CV.Util;
using System.Drawing;

namespace lesson19
{
   
    class Program
    {
   
        static void Main(string[] args)
        {
   
            ///计算直方图
            //Mat srcImg = CvInvoke.Imread("1.jpg");
            //CvInvoke.Imshow("input", srcImg);
            //Mat grayImg = new Mat();
            //CvInvoke.CvtColor(srcImg, grayImg, ColorConversion.Bgr2Gray);
            //Mat dHist = new Mat();
            //int[] channels = new int[] { 0 }; //初始化数组
            //float[] ranges = new float[] { 0, 255 };
            //int[] histSize = new int[] { 256 };
            //VectorOfMat vMatImgs = new VectorOfMat();
            //vMatImgs.Push(grayImg);
            //CvInvoke.CalcHist(vMatImgs, channels, new Mat(), dHist, histSize, ranges, false);
            //CvInvoke.WaitKey(0);

            ///直方图均衡化
            ///彩色图像三通道分离,分别对每个通道进行直方图均衡化,再通道合并
            //Mat srcImg = CvInvoke.Imread("06.jpg", ImreadModes.Grayscale);
            //CvInvoke.Imshow("input", srcImg);
            //Mat dstImg = new Mat();

            //CvInvoke.EqualizeHist(srcImg, dstImg); //只能处理单通道图像;
            //CvInvoke.Imshow("result", dstImg);
            //CvInvoke.WaitKey(0);

            ///直方图对比: 比较两幅图像直方图相似度,进而判断图像相似度
            //Mat src1 = CvInvoke.Imread("05.jpg");
            //Mat src2 = CvInvoke.Imread("06.jpg");
            //CvInvoke.Imshow("input1", src1);
            //CvInvoke.Imshow("input2", src2);
            //Mat grayImg1 = new Mat();
            //Mat grayImg2 = new Mat();
            //CvInvoke.CvtColor(src1, grayImg1, ColorConversion.Bgr2Gray);
            //CvInvoke.CvtColor(src2, grayImg2, ColorConversion.Bgr2Gray);

            //int[] channels_1 = new int[] { 0 };
            //int[] histSize_1 = new int[] { 256 }; //bins(柱子个数)
            //float[] range_1 = new float[] { 0, 256 }; //每一维数值的取值范围
            //Mat dHist_1 = new Mat();
            //Mat dHist_2 = new Mat();
            //VectorOfMat vMatImg1 = new VectorOfMat();
            //VectorOfMat vMatImg2 = new VectorOfMat();
            //vMatImg1.Push(grayImg1);
            //vMatImg2.Push(grayImg2);
            //CvInvoke.CalcHist(vMatImg1, channels_1, new Mat(), dHist_1, histSize_1, range_1, false);
            //CvInvoke.CalcHist(vMatImg2, channels_1, new Mat(), dHist_2, histSize_1, range_1, false);

            //double matchValue0 = CvInvoke.CompareHist(dHist_1, dHist_2, HistogramCompMethod.Correl); //相关性测量
            //double matchValue1 = CvInvoke.CompareHist(dHist_1, dHist_2, HistogramCompMethod.Chisqr); //卡方测量
            //double matchValue2 = CvInvoke.CompareHist(dHist_1, dHist_2, HistogramCompMethod.Intersect); //直方图相交法
            //double matchValue3 = CvInvoke.CompareHist(dHist_1, dHist_2, HistogramCompMethod.Bhattacharyya);//Bhattacharyya测量

            //Console.WriteLine(" match0 = {0}\n match1 = {1}\n match2 = {2}\n match3 = {3}\n",
            // matchValue0, matchValue1, matchValue2, matchValue3);
            //CvInvoke.WaitKey(0);

            ///直方图反向投影
            Mat src = CvInvoke.Imread("1.jpg");
            CvInvoke.Imshow("src", src);
            Mat hsvImg = new Mat();
            CvInvoke.CvtColor(src, hsvImg, ColorConversion.Bgr2Hsv);
            Mat dHist = new Mat();
            VectorOfMat vMatImg = new VectorOfMat();
            vMatImg.Push(hsvImg);
            int[] channels = new int[] {
    0 };
            int[] histSize = new int[] {
    256 };
            float[] range = new float[] {
    0, 256 };
            CvInvoke.CalcHist(vMatImg, channels, new Mat(), dHist, histSize, range, false);//计算直方图
            CvInvoke.Normalize(dHist, dHist, 0, 255, NormType.MinMax);      //将直方图归一化到0-255之间
            Mat backProject = new Mat();
            CvInvoke.CalcBackProject(vMatImg, channels, dHist, backProject, range);
            CvInvoke.Imshow("backProject", backProject);
            CvInvoke.WaitKey(0);
        }
    }
}

效果

1、直方图均衡化

2、直方图比较:

3、手掌反向投影: