//======================================================================================\\
// 如果您对安装opencv或在vc6.0下配置opencv有疑问,请访问opencv中文网站:
// http://www.opencv.org.cn/
//=======================================================================================//
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
/*********************************************************************\
函数名: Increase
功 能: 图像增强
参 数: src - 源图像(1通道)
dst - 目图像(1通道)
\*********************************************************************/
#define HDIM 256 // bin of HIST, default = 256
void Increase(IplImage** src, IplImage** dst){
int n = HDIM;
// 计算直方图
CvHistogram *hist = cvCreateHist( 1, &n, CV_HIST_ARRAY, 0, 1 );
cvCalcHist( src, hist, 0, 0 );
// 生成累计直方图
int i;
double val;
double nn[HDIM];
for ( i = 0, val = 0; i < n; i++){
val = val + cvGetReal1D (hist->bins, i);
nn[i] = val;
}
// 计算变换函数的离散形式
uchar T[HDIM];
int sum = (*src)->height * (*src)->width; // 源图像中象素点的总数
for( i = 0; i < n; i++ ){
T[i] = (uchar) (255 * nn[i] / sum); // 范围为 [0,255]
}
// 转换强度
*dst = cvCloneImage( *src );
CvMat *T_mat = cvCreateMatHeader( 1, 256, CV_8UC1 );
cvSetData( T_mat, T, 0 );
// 直接调用内部函数完成 look-up-table 的过程
cvLUT( *src, *dst, T_mat );
cvReleaseHist ( &hist );
}
int main( int argc, char** argv ){
IplImage* src = cvLoadImage("sample.jpg", 0);
if(src == NULL){
printf("Failed to load image.\n");
return 0;
}
IplImage* dst = cvCreateImage(cvGetSize(src), 8, 1);
cvNamedWindow("src", 1);
cvNamedWindow("dst", 1);
Increase(&src, &dst);
cvShowImage("src", src);
cvShowImage("dst", dst);
cvWaitKey(0);
cvReleaseImage(&src);
cvReleaseImage(&dst);
cvDestroyWindow("src");
cvDestroyWindow("dst");
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
前往页