失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > OpenCvSharp函数:CalcHist直方图和EqualizeHist直方图均衡化

OpenCvSharp函数:CalcHist直方图和EqualizeHist直方图均衡化

时间:2018-12-28 21:18:34

相关推荐

OpenCvSharp函数:CalcHist直方图和EqualizeHist直方图均衡化

函数说明

//直方图均衡化,提高图像对比度void EqualizeHist(InputArray src, //待均衡化8位单通道图像OutputArray dst)//均衡化后的图像,与输入图像有相同的大小和类型

调用示例

public void Run(){//注意图像路径using var src = Cv2.ImRead(ImagePath.LenaColor);if (src.Empty()) throw new Exception("图像读取有误");Cv2.ImShow("Src", src);//统计BGR直方图GetHistResult(src, out Mat histBGR, out Mat histBGRImage);using var hsvSrc = src.CvtColor(ColorConversionCodes.BGR2HSV);//统计HSV直方图GetHistResult(hsvSrc, out _, out Mat histHSVImage);Cv2.NamedWindow("histBGRImage", WindowFlags.Normal);Cv2.ImShow("histBGRImage", histBGRImage);Cv2.NamedWindow("histHSVImage", WindowFlags.Normal);Cv2.ImShow("histHSVImage", histHSVImage);//转为灰度图using var srcGray = src.CvtColor(ColorConversionCodes.BGR2GRAY);Cv2.ImShow("srcGray", srcGray);//直方图均衡化必须为8位单通道Cv2.EqualizeHist(srcGray, srcGray);//均衡化后的灰度图Cv2.ImShow("srcGrayEQ", srcGray);//计算均衡化后的直方图GetHistResult(srcGray, out _, out Mat histGrayImage);Cv2.ImShow("histGrayImage", histGrayImage);//分离通道var splits = src.Split();string[] bgr = new string[] { "Blue", "Green", "Red" };Mat[] EqualizeHistMat = new Mat[3];int i = 0;foreach (var matSplit in splits){Cv2.EqualizeHist(matSplit, matSplit);GetHistResult(matSplit, out _, out Mat histSplitMat);Cv2.ImShow($"EqualizeHist of {bgr[i]}", histSplitMat);EqualizeHistMat[i] = matSplit;i++;}using var megreMat = new Mat();//合并各通道均衡化的图像Cv2.Merge(EqualizeHistMat, megreMat);Cv2.ImShow($"Merge BGR EqualizeHist", megreMat);Cv2.WaitKey();Cv2.DestroyAllWindows();}/// <summary>/// 计算并生成绘制直方图/// </summary>/// <param name="src">待统计的图像</param>/// <param name="hist">直方图结果</param>/// <param name="histImage">直方图的绘制结果</param>private void GetHistResult(Mat src, out Mat hist, out Mat histImage){hist = new Mat();const int histW = 512;const int histH = 400;histImage = new Mat(histH, histW, MatType.CV_8UC3, Scalar.All(0));int histSize = 64;//直方图数组大小var range = new Rangef(0, 256);//统计0至255(=266-1)//将图像像素灰度[0,255]共分为64个等级统计,//即值为[0,3]、[4,7]...和[252,255]分别统计,每个范围内的像素个数for (int channel = 0; channel < src.Channels(); channel++){Cv2.CalcHist(images: new[] { src },//待统计的图像channels: new[] { channel },//待统计的通道mask: null,//掩膜hist: hist,//输出的统计结果dims: 1,//直方图维度histSize: new[] { histSize },//将range分为histSize梯度ranges: new[] { range });//待统计通道像素的范围,不在这个范围内的不统计DrawHist(histImage, hist, (channel == 0 ? Scalar.Blue : (channel == 1 ? Scalar.Green : Scalar.Red)));}}/// <summary>/// 绘制直方图/// </summary>/// <param name="histImage">直方图绘制结果</param>/// <param name="histSize">直方图数组大小</param>/// <param name="color">线的颜色</param>private void DrawHist(Mat histImage, Mat hist, Scalar color){var binW = Math.Round((double)histImage.Width / hist.Height);//归一化Cv2.Normalize(hist, hist, 0, histImage.Rows, NormTypes.MinMax, -1);for (int i = 1; i < hist.Height; i++){var pt1 = new Point2d(binW * (i - 1), histImage.Height - Math.Round(hist.At<float>(i - 1)));var pt2 = new Point2d(binW * (i), histImage.Height - Math.Round(hist.At<float>(i)));Cv2.Line(histImage, (Point)pt1, (Point)pt2, color, 1, LineTypes.AntiAlias);}}

如果觉得《OpenCvSharp函数:CalcHist直方图和EqualizeHist直方图均衡化》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。