您的位置:首页 > 其它

图像直方图均衡化和图像一般的拉伸

2016-07-11 18:09 387 查看
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.

原始图像



直方图均衡化后图像



一般图像拉伸后图像

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息