注意
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、手掌反向投影: