c++ opencv 图像处理:直方图处理(直方图均衡化,直方图匹配(规定化))

您所在的位置:网站首页 灰度直方图怎么确定阈值 c++ opencv 图像处理:直方图处理(直方图均衡化,直方图匹配(规定化))

c++ opencv 图像处理:直方图处理(直方图均衡化,直方图匹配(规定化))

2023-11-30 18:18| 来源: 网络整理| 查看: 265

文章目录 前言一、直方图(histogram)二、直方图处理1.直方图均衡化2.直方图匹配(规定化) 三、opencv函数总结1.equalizeHist图像均衡化2.calcHist获取图像直方图3.LUT数据映射

前言

数字图像处理c++ opencv(VS2019 opencv4.53)持续更新

一、直方图(histogram)

非归一化直方图: h ( r k ) = n k h(r_k)=n_k h(rk​)=nk​ 其中 r k r_k rk​为图像像素灰度值,比如常见的0-255, n k n_k nk​为图像中某一灰度级的像素个数。 归一化直方图: p ( r k ) = h ( r k ) M N = n k M N p(r_k)=\frac{h(r_k)}{MN}=\frac{n_k}{MN} p(rk​)=MNh(rk​)​=MNnk​​ 其中MN为图像行数和列数,常说的图像直方图就是归一化直方图。

直方图的现状表现了图像的外观: 图摘自数字图像处理第四版图摘自数字图像处理第四版,直方图分布较广较均匀的图像对比度高,视觉效果好。

获取图像直方图示例: 代码如下(示例):

#include #include using namespace cv; using namespace std; int main() { Mat image, image_gray, hist; //定义输入图像,灰度图像, 直方图 image = imread("lena.png"); //读取图像; if (image.empty()) { cout ranges }; calcHist(&image_gray, 1, 0, Mat(), hist, 1, &histsize, &histRanges, true, false); //创建直方图显示图像 int hist_h = 300;//直方图的图像的高 int hist_w = 512; //直方图的图像的宽 int bin_w = hist_w / histsize;//直方图的等级 Mat histImage(hist_h, hist_w, CV_8UC3, Scalar(0, 0, 0));//绘制直方图显示的图像 //绘制并显示直方图 normalize(hist, hist, 0, hist_h, NORM_MINMAX, -1, Mat());//归一化直方图 for (int i = 1; i Mat image, image_gray, image_enhanced; //定义输入图像,灰度图像, 直方图 image = imread("lena.png"); //读取图像; if (image.empty()) { cout cout 0,256 }; const float* histRanges = { ranges }; calcHist(&image1_gray, 1, 0, Mat(), hist1, 1, &histsize, &histRanges, true, false); calcHist(&image2_gray, 1, 0, Mat(), hist2, 1, &histsize, &histRanges, true, false); //计算两个均衡化图像直方图的累积概率 float hist1_cdf[256] = { hist1.at(0) }; float hist2_cdf[256] = { hist2.at(0) }; for (int i = 1; i hist1_cdf[i] = hist1_cdf[i] / (image1_gray.rows * image1_gray.cols); hist2_cdf[i] = hist2_cdf[i] / (image2_gray.rows * image2_gray.cols); } // 两个累计概率之间的差值,用于找到最接近的点 float diff_cdf[256][256]; for (int i = 0; i diff_cdf[i][j] = fabs(hist1_cdf[i] - hist2_cdf[j]); } } Mat lut(1, 256, CV_8U); for (int i = 0; i if (min > diff_cdf[i][j]) { min = diff_cdf[i][j]; index = j; } } lut.at(i) = index; } LUT(image1_gray, lut, image_enhanced); //图像中进行映射 imshow("image_enhanced", image_enhanced); waitKey(0); //暂停,保持图像显示,等待按键结束 return 0; }

结果: 在这里插入图片描述

三、opencv函数总结 1.equalizeHist图像均衡化 equalizeHist(image1_gray, image1_gray); 2.calcHist获取图像直方图 int histsize = 256; float ranges[] = { 0,256 }; const float* histRanges = { ranges }; calcHist(&image1_gray, 1, 0, Mat(), hist1, 1, &histsize, &histRanges, true, false); 3.LUT数据映射 LUT(image1_gray, lut, image_enhanced); //图像中进行映射


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3