1. HE.h HE.c
HE.h
#ifndef _HE_H_
#define _HR_H_
#ifdef __cplusplus
extern "C"
{
#endif
//直方图均衡化
int HE(unsigned char * data, int width, int height);
//图像一般拉伸
int HETemp(unsigned char * data, int width, int height);
#ifdef __cplusplus
}
#endif
#endif
HE.c
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include "HE.h"
int HE(unsigned char * data, int width, int height){
int ret = 0;
int i, j;
int arr[255] = {0};
float p[255] = {0.0f};
float c[255] = {0.0f};
int minValue = 255, maxValue = 0;
unsigned char * dstData = NULL;
int temp = 0;
for(i = 0; i < height; i ++)
{
for(j = 0; j < width; j ++)
{
arr[(int)data[i * width + j]] += 1;
if((int)data[i * width + j] > maxValue)
{
maxValue = (int)data[i * width + j];
}else if((int)data[i * width + j] < minValue)
{
minValue = (int)data[i * width + j];
}
}
}
for(i = minValue; i < maxValue; i ++)
{
p[i] = arr[i] * 1.0f / (width * height);
}
for(i = minValue; i < maxValue; i ++)
{
for(j = minValue; j <= i; j ++)
{
c[i] += p[j];
}
}
dstData = (unsigned char *)malloc(sizeof(unsigned char) * width * height);
for(i = 0; i < height; i ++)
{
for(j = 0; j < width; j ++)
{
temp = (int)(c[(int)data[i * width + j]] * 255);
dstData[i * width + j] = (unsigned char)temp;
}
}
memcpy(data, dstData, sizeof(unsigned char) * width * height);
free(dstData);
return 0;
}
int HETemp(unsigned char * data, int width, int height)
{
int i, j;
int maxValue = 0, minValue = 255;
int temp = 0;
for(i = 0; i < height; i ++)
{
for(j = 0; j < width; j ++)
{
if(maxValue < (int)data[i * width + j])
{
maxValue = (int)data[i * width + j];
}else if(minValue > (int)data[i * width + j])
{
minValue = (int)data[i * width + j];
}
}
}
for(i = 0; i < height; i ++)
{
for(j = 0; j < width; j ++)
{
temp = (int)((data[i * width + j] - minValue) * 1.0f / (maxValue - minValue) * 255.0f);
data[i * width + j] = (unsigned char)temp;
}
}
return 0;
}
2. HistogramEqualization.cpp
#include "HE.h"
#include <opencv2\opencv.hpp>
using namespace cv;
int main(void)
{
Mat img;
img = imread("source.bmp", 0);
//HE(img.data, img.cols, img.rows);
HETemp(img.data, img.cols, img.rows);
imwrite("HETemp.bmp", img);
return 0;
}
3.
原始图像
直方图均衡化后图像
一般图像拉伸后图像