// 图像直方图提供了利用现有像素强度值进行场景渲染的方法。
// 通过分析图像中像素值的分布情况,可以利用这个信息来修改图像,甚至是提高图像质量
效果
代码:
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
// 利用查找表修改图像外观
// 图像直方图提供了利用现有像素强度值进行场景渲染的方法。
// 通过分析图像中像素值的分布情况,可以利用这个信息来修改图像,甚至是提高图像质量
// 查找表是一个一对一(或多对一)的函数,定义了如何把像素值转换成新的值。
//它是一个一维数组,对于规则的灰度图像,它包含256个项目。
// 利用查找表的项目i,可得到对应灰度级的新强度值
// 如: newIntensity = lookup[oldIntensity]
// OpenCV中的cv::LUT函数在图像上应用查找表示生成一个新的图像。
// 查找表通常根据直方图生成
int main()
{
int channels[1]; // 要检查的通道数量
int histSize[0]; // 直方图中的箱子数量
float hranges[2]; // 值范围
const float * ranges[1]; // 值范围的指针
channels[0] =0;
histSize[0]=256;
hranges[0] = 0.0;
hranges[1] = 256.0;
ranges[0] = hranges;
Mat dog, hist;
dog = imread("/home/jason/work/01-img/dog.png",IMREAD_GRAYSCALE);
Rect rect(90, 50,450,340);
dog = dog(rect);
// 计算直方图
cv::calcHist(&dog, 1,
channels,
cv::Mat(),
hist,
1,
histSize,
ranges);
// 把计算得到的直方图用作查找表
Mat response;
cv::LUT(dog, hist, response);
// 查看是否提高了图像质量
imshow("dog", dog);
imshow("dog1", response);
//-------------------------------------------------------------------------------
// 图像反转
// 创建一个图像反转的查找表
cv::Mat lookup(1, 256, CV_8U);
for (int i=0; i<256; i++){
lookup.at<uchar>(i) = 255 -i;
}
// 应用查找表
Mat result;
cv::LUT(dog, lookup, result);
imshow("hist", dog);
imshow("lut", result);
//__________________________________________________________________
// 在彩色图像上应用查找表
// 第2章的减色函数,现在很容易实现哦
Mat look(1, 256, CV_8U), result2;
int div=64; //
for (int i=0; i<256; i++){
look.at<uchar>(i) = i/div*div + div/2;
}
cv::LUT(dog, look, result2);
imshow("减色", result2);
//------------------------------------------------------------------------
// 伸展直方图以提高图像对比度
//定义一个修改原始直方图的查找表可以提高图像的对比度。例如,某个图像
waitKey(0);
return 0;
}