原为机器人视觉课程作业,作业原要求如下
例1:输入图像如下
得到灰度图和均衡化演示后的图
得到直方图和均衡化后的直方图:
可以看出来起到了一定的增强效果,但平滑性降低,整体起到了反效果
- 例2:输入图像如下
得到灰度图和均衡化演示后的图
得到直方图和均衡化后的直方图:
效果难以分辨
- 例3:输入图像如下
得到灰度图和均衡化演示后的图
得到直方图和均衡化后的直方图:
可以看到明显效果,lena脸部亮度及其他位置像素被增强
下附代码
绘制函数
Mat version_lesson::print_hist_demo(Mat &img) {
int bins = 256;
int hist_size[] = { bins };
float range[] = { 0,256 };
const float *ranges[] = { range };
MatND hist;
int channels[] = { 0 };
//计算出灰度直方图
calcHist(&img, 1, channels, Mat(), hist, 1, hist_size, ranges);
//画出直方图
double max_val;
minMaxLoc(hist, 0, &max_val, 0, 0);//定位矩阵中最小值、最大值的位置
int scale = 2;
int hist_height = 256;
Mat hist_img = Mat::zeros(hist_height, bins*scale, CV_8UC3);//创建一个全0的特殊矩阵
for (int i = 0; i < bins; i++)
{
float bin_val = hist.at<float>(i);
int inten = cvRound(bin_val*hist_height / max_val);//要绘制高度
//画矩形
rectangle(hist_img, Point(scale*i, hist_height - 1), Point((i + 1)*scale - 1, hist_height - inten), CV_RGB(255, 255, 255));
}
return hist_img;
}
Mat version_lesson::version_excersize_2(Mat &image) {
Mat dst;
equalizeHist(image, dst);
imshow("直方图均衡化演示", dst);
return dst;
}