学习OPENCV过程中,会学到图像增强。图像增强是指,按特定的需要突出一幅图像的某些信息,同时削弱或去除不需要信息的处理方法。
目的:使处理后的图像在某些特定的应用中比原图像更适用。
图像增强方法有很多,目前学习到直方图均衡法。
直方图代码如下:
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
using namespace cv;
void m_calcHist(Mat grayImage)
{
const int channels[] = { 0 };
MatND hist;
int dims = 1;
const int histSize[] = { 256 };
float pranges[] = { 0, 255 };
const float* ranges[] = { pranges };
calcHist(&grayImage, 1, channels, Mat(), hist, dims, histSize, ranges, true, false);
int scale = 2;
int hist_height = 256;
Mat hist_img = Mat::zeros(hist_height, 256 * scale, CV_8UC3);
double max_val;
minMaxLoc(hist, 0, &max_val, 0, 0);
for (int i = 0; i < 256; i++) //遍历每个像素
{
float bin_val = hist.at<float>(i); //注意hist中是float类型
int intensity = cvRound(bin_val*hist_height / max_val); //要绘制的高度 ,转为整数
rectangle(hist_img, Point(i*scale, hist_height - 1), Point((i + 1)*scale - 1, hist_height - intensity), Scalar(255, 255, 255));
}
imshow("【灰度直方图】", hist_img);
}
int main()
{
//【1】加载源图像
Mat dstImage;
Mat srcImage = imread("暗色.jpg", 1);
if (!srcImage.data)
{
printf("读取图片错误");
return false;
} //【2】转为灰度图并显示出来
cvtColor(srcImage, srcImage, COLOR_BGR2GRAY);
imshow("原始图", srcImage);
//m_calcHist(srcImage); //【3】进行直方图均衡化
equalizeHist(srcImage, dstImage); //【4】显示结果
imshow("直方图均衡化后的图像", dstImage);
m_calcHist(dstImage); //等待用户按键退出程序
waitKey(0);
return 0;
}
均衡化前后直方图:
效果图: