直方图均衡化理论及公式的描述及C++程序实现
时间: 2023-05-29 20:05:15 浏览: 64
直方图均衡化是一种用于图像增强的方法,可以增加图像的对比度,使得图像更加清晰。其原理是将图像的灰度值分布做均衡化,使得图像的灰度值范围更均匀地分布在整个灰度级范围内。具体地说,可以通过以下步骤实现直方图均衡化:
1. 统计图像的灰度值分布,得到灰度直方图。
2. 计算灰度直方图的累积分布函数(CDF)。
3. 根据CDF计算灰度级变换函数,将原图像的灰度级映射到新的灰度级。
4. 对原图像进行灰度级变换,得到均衡化后的图像。
直方图均衡化的公式如下:
$$
s_k = T(r_k) = \frac{(L-1)}{MN}\sum_{j=0}^{k}n_j
$$
其中,$s_k$是均衡化后的灰度值,$r_k$是原始图像的灰度值,$n_j$是原始图像中灰度值为$j$的像素点数,$L$是灰度级数,$M$和$N$分别是图像的宽度和高度。
以下是C语言程序实现直方图均衡化的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_GRAY_LEVEL 256
void histogram_equalization(unsigned char *image, int width, int height)
{
int i, j, k;
int hist[MAX_GRAY_LEVEL] = {0};
int cdf[MAX_GRAY_LEVEL] = {0};
int equalized[MAX_GRAY_LEVEL] = {0};
int total_pixels = width * height;
// 计算灰度直方图
for (i = 0; i < height; i++) {
for (j = 0; j < width; j++) {
hist[image[i * width + j]]++;
}
}
// 计算累积分布函数
cdf[0] = hist[0];
for (i = 1; i < MAX_GRAY_LEVEL; i++) {
cdf[i] = cdf[i-1] + hist[i];
}
// 计算灰度级变换函数
for (i = 0; i < MAX_GRAY_LEVEL; i++) {
equalized[i] = (int)((cdf[i] * (MAX_GRAY_LEVEL - 1)) / total_pixels + 0.5);
}
// 对原图像进行灰度级变换
for (i = 0; i < height; i++) {
for (j = 0; j < width; j++) {
k = image[i * width + j];
image[i * width + j] = equalized[k];
}
}
}
int main()
{
unsigned char image[] = {
30, 30, 30, 30, 40, 40, 40, 40,
30, 30, 30, 30, 40, 40, 40, 40,
30, 30, 30, 30, 40, 40, 40, 40,
30, 30, 30, 30, 40, 40, 40, 40,
50, 50, 50, 50, 60, 60, 60, 60,
50, 50, 50, 50, 60, 60, 60, 60,
50, 50, 50, 50, 60, 60, 60, 60,
50, 50, 50, 50, 60, 60, 60, 60,
};
int width = 8;
int height = 8;
printf("Original Image:\n");
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
printf("%d ", image[i * width + j]);
}
printf("\n");
}
histogram_equalization(image, width, height);
printf("\nEqualized Image:\n");
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
printf("%d ", image[i * width + j]);
}
printf("\n");
}
return 0;
}
```
以上代码使用一个8x8的灰度图像作为示例,输入为原始图像的像素值数组、图像的宽度和高度,输出为均衡化后的像素值数组。程序中使用了一个256元素的数组来保存灰度直方图、累积分布函数和灰度级变换函数。函数`histogram_equalization`中首先计算灰度直方图,然后根据公式计算累积分布函数和灰度级变换函数,最后对原图像进行灰度级变换得到均衡化后的图像。最后输出原图像和均衡化后的图像,可以看到均衡化后的图像的灰度值更加均匀地分布在整个灰度级范围内。