目的:改善图像的视觉效果,便于对图像的分析和处理。
直方图均衡化:通过修改直方图来增强图像。
图像锐化法:增强图像的边缘或轮廓。
直方图均衡化
将原图像通过某种变换,得到一幅具有均匀分布灰度直方图的新图像。g(i,j)=G(f(i,j))
变换函数满足条件:
在 0≤f(i,j)≤255内为单调递增函数,灰度级从黑到白次序不变。
0≤g(i,j)≤255,确保映射函数变化后的像素在允许的范围内。
//直方图均衡化
Mat equalizeHist(Mat image)
{
//图像灰度化
Mat image_gray = Mat::zeros(image.size(), CV_8UC1);
for (int i = 0; i < image.rows; i++)
{
for (int j = 0; j < image.cols; j++)
{
image_gray.at<uchar>(i, j) = 0.11 * image.at<Vec3b>(i, j)[0] + 0.59 * image.at<Vec3b>(i, j)[1] + 0.3 * image.at<Vec3b>(i, j)[2];
}
}
//统计灰度直方图
double hist[256];
for (int j = 0; j < 256; j++)
{
hist[j] = 0;
}
for (int i = 0; i < image.rows; i++)
{
for (int j = 0; j < image.cols; j++)
{
hist[image_gray.at<uchar>(i, j)]++;
}
}
Mat frame(257, 256, CV_8U, Scalar(0));
for (int i = 0; i < 256; i++)
{
double max_value = max_double(hist, 256); //
//cout << "Value of str is : " << endl;
int pointend = cvRound(hist[i] / max_value * 256 * 0.9);
line(frame, Point(i, 0), Point(i, pointend ), Scalar(255, 255, 255), 2);//
//line(frame, (i,0),(i,hist[0][i]/ src.rows/ src.cols), Scalar(0, 0, 255), 2);
}
imshow("灰度直方图", frame);
waitKey(0);
double hist_norm[256];
for (int i = 0; i < 256; i++)
{
hist_norm[i] = hist[i]/ image.rows / image.cols;
}
double hist_sum[256] ;
for (int i=0; i < 256; i++)
{
hist_sum[i] = 0;
}
for (int i = 0; i < 256; i++)
{
for (int j = 0; j <= i; j++)
{
hist_sum[i] = hist_sum[i] + hist_norm[j] * 255;
}
}
Mat dst= Mat::zeros(image.size(), CV_8UC1);
for (int i = 0; i < image.rows; i++)
{
for (int j=0; j < image.cols; j++)
{
dst.at<uchar>(i, j) = hist_sum[image_gray.at<uchar>(i, j)];
}
}
imshow("灰度图", image_gray);
imshow("灰度均衡化", dst);
return(dst);
}
void CMFCworkDlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码
Mat image = imread("ema.jpg", 1);
Mat dst = Mat::zeros(image.size(), CV_8UC1);
Mat gray_blance = equalizeHist(image);
//Mat image_gray = gray_img(image);
grayhist(gray_blance);
}