OpenCV4入门教程084:图像直方图变换-累计

索引地址:系列索引

和上一篇的查找方式差不多。

直方图变换——累计

  • 将源图像转换为灰度图,计算图像的灰度直方图
  • 建立映射表,对直方图进行像素累计
  • 根据映射表进行元素映射得到最终的直方图变换

测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
// 功能:代码 3-13 直方图变换—累计
// 作者:朱伟 zhu1988wei@163.com
// 来源:《OpenCV图像处理编程实例》
// 博客:http://blog.csdn.net/zhuwei1988
// 更新:2016-8-1
// 说明:版权所有,引用或摘录请联系作者,并按照上面格式注明出处,谢谢。//
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
int main() {
// 图像获取及验证
cv::Mat srcImage = cv::imread("circles.jpg");
if (!srcImage.data)
return 1;
// 转化为灰度图像
cv::Mat srcGray;
cvtColor(srcImage, srcGray, cv::COLOR_BGR2GRAY);
// 计算图像的直方图
const int channels[ 1 ] = {0};
const int histSize[ 1 ] = {256};
float hranges[ 2 ] = {0, 255};
const float *ranges[ 1 ] = {hranges};
cv::MatND hist;
calcHist(&srcGray, 1, channels, cv::Mat(), hist, 1, histSize, ranges);
float table[ 256 ];
int nPix = srcGray.cols * srcGray.rows;
// 建立映射表
for (int i = 0; i < 256; i++) {
float temp[ 256 ];
// 像素变换
temp[ i ] = hist.at<float>(i) / nPix * 255;
if (i != 0) {
// 像素累计
table[ i ] = table[ i - 1 ] + temp[ i ];
} else {
table[ i ] = temp[ i ];
}
}
// 通过映射进行表查找
cv::Mat lookUpTable(cv::Size(1, 256), CV_8U);
for (int i = 0; i < 256; i++) {
lookUpTable.at<uchar>(i) = static_cast<uchar>(table[ i ]);
}
cv::Mat histTransResult;
cv::LUT(srcGray, lookUpTable, histTransResult);
// 显示图像
cv::imshow("srcGray", srcGray);
cv::imshow("histTransResult", histTransResult);
cv::waitKey(0);
return 0;
}

效果

calc


OpenCV4入门教程084:图像直方图变换-累计
https://feater.top/opencv/opnecv-image-histogram-transform-calc/
作者
JackeyLea
发布于
2020年10月5日
许可协议