选用400*400的yuv灰度图像,如下图所示,对其进行直方图均衡。
代码如下:
#include <iostream>
#include <fstream>
using namespace std;
int accurNum[256];
double sum[256];
int map[256];
int main()
{
int height = 500, weight = 500;
ifstream in("seed.yuv", ios::binary);
unsigned char* yBuffer, *uBuffer, *vBuffer;
int size = height * weight;
yBuffer = new unsigned char[size];
uBuffer = new unsigned char[size];
vBuffer = new unsigned char[size];
in.read((char*)yBuffer,size);
in.read((char*)uBuffer,size);
in.read((char*)vBuffer,size);
for( int i = 0; i < size; ++ i ) accurNum[yBuffer[i]] ++;
for( int i = 0; i < 256; ++ i )
{
if(!i) sum[i] = accurNum[i];
else sum[i] = sum[i -1] + accurNum[i];
}
for( int i = 0; i < 256; ++ i )
{
sum[i] /= size;
map[i] = int((255) * sum[i] + 0.5);
}
for( int i = 0; i < size; ++ i )
{
yBuffer[i] = map[yBuffer[i]];
}
in.close();
ofstream out("processed_seed.yuv", ios::binary );
out.write((char*)yBuffer, size);
out.write((char*)uBuffer, size);
out.write((char*)vBuffer, size);
out.close();
}
结果如下: