文章目录
一、实验目的:
掌握对图像直方图进行操作,实现图像的直方图均衡算法。 1、掌握求灰度图像归一化直方图方法 2、掌握灰度图像的直方图均衡算法 3、掌握对彩色图像进行直方图均衡的算法
二、实验内容:
1、计算灰度图像的归一化直方图。
具体内容:利用 OpenCV 对图像像素进行操作,计算归一化直方图.并在
窗口中以图形的方式显示出来
2、灰度图像直方图均衡处理
具体内容:通过计算归一化直方图,设计算法实现直方图均衡化处理。
3、彩色图像直方图均衡处理
具体内容: 在灰度图像直方图均衡处理的基础上实现彩色直方图均衡处理。
三.实验过程
(一).1、计算灰度图像的归一化直方图。
具体内容:利用 OpenCV 对图像像素进行操作,计算归一化直方图.并在
窗口中以图形的方式显示出来
实现代码:
首先主函数将图像以灰度图像读入。
int main(int argc,char* argv[]){
const char* imageName="/Users/Admin/Desktop/myProject/2.jpg";
Mat img,grayImage;
img=imread(imageName);
//以灰度图像读入
grayImage=imread(imageName,0);
if (img.empty()||grayImage.empty()){
fprintf(stderr, "Can't load image %s\n",imageName);
return -1;
}
进行实验一相关,计算图像的归一化直方图并显示出来
主函数中写入:
//实验一:归一化直方图
Mat result1=grayImage.clone();
result1=show_histogram(result1);
imshow("灰度直方图归一化", result1);
//waitKey(0);
直方图打印:
//打印直方图
Mat show_histogram(Mat img){
int channels=0;
MatND dstHist;
//设定像素取值范围
int hisSize[]={
256};
float midRanges[]={
0,255};
const float *ranges[]={
midRanges};
//计算直方图
calcHist(&img, 1, &channels, Mat(), dstHist, 1, hisSize, ranges,true,false);
Mat drawImage=Mat::zeros(Size(256,256), CV_8UC3);
double MaxValue;
minMaxLoc(dstHist,0,&MaxValue,0,0);//图像最小最大值
for (int i=0;i<256;i++){
int value=cvRound(dstHist.at<float>(i)*256*0.9/MaxValue);//四舍五入
//在直方图画布上画出直方图
line(drawImage, Point(i,drawImage.rows-1), Point(i,drawImage.rows-1-value), Scalar(255,255,255));
}
return drawImage;
}
实验结果:
(二).2、灰度图像直方图均衡处理
2、灰度图像直方图均衡处理
具体内容:通过计算归一化直方图,设计算法实现直方图均衡化处理。
首先统计像素总数,每个灰度级别下的像素个数,记录灰度分布密度,然后统计 p r ( r k ) p_r(r_k) pr(rk)灰度级别出现频率
代码实现:
//实验二:均衡化直方图
int gray_sum=0;//像素总数
int gray[256]={
0};//记录每个灰度级别下的像素个数
int gray_rate[256]={
0};//记录灰度分布密度
gray_sum=grayImage.rows*grayImage.cols;
//统计每个灰度下的像素个数
for(int i=0;i<grayImage