#include <iostream>
#include <cv.h>
#include <highgui.h>
using namespace std;
/*************************************
*目的:亮度变换(亮度增强或者亮度减弱)
*原理:对每个通道的每个像素增加一个增益来达到亮度变换的效果
*参数:
srcImg 输入的源图像
dstImg 输出的图像,大小与源图像完全相同
brightness 增益,用于与每个像素相加。为正,亮度增强;为负,亮度减弱。
**************************************/
int BrightnessAdjust(const IplImage* srcImg, IplImage* dstImg, float brightness)
{
int x,y,i;
float val;
for (i = 0; i < srcImg->nChannels; i++)//要处理的通道
{
for (y = 0; y < srcImg->height; y++)
{
for (x = 0; x < srcImg->width; x++)
{
val = ((uchar*)(srcImg->imageData + srcImg->widthStep*y))[x*3+i];
val += brightness;
//对灰度值的可能溢出进行处理
if(val>255) val=255;
if(val<0) val=0;
((uchar*)(dstImg->imageData + dstImg->widthStep*y))[x*3+i] = (uchar)val;
}
}
}
return 0;
}
/*************************************
*目的:对比度变换
*原理:
对比度的公式参考自Photoshop的公式:
nRGB = Threshold + (RGB – Threshold) * Contrast
*参数:
srcImg 输入的源图像
dstImg 输出的图像,大小与源图像完全相同
Contrast 对比度,小于1时,降低对比度,大于1时,增加对比度。
Threshold 阈值,这里默认为128
**************************************/
void ContrastAdjust(const IplImage* srcImg, IplImage* dstImg, float Contrast, int Threshold=128)
{
int x,y,i;
float val;
for (i = 0; i < srcImg->nChannels; i++)
{
for (y = 0; y < srcImg->height; y++)
{
for (x = 0; x < srcImg->width; x++)
{
val = ((uchar*)(srcImg->imageData + srcImg->widthStep*y))[x*3+i];
val = Threshold + (val - Threshold) * Contrast;
//对灰度值的可能溢出进行处理
if(val>255) val=255;
if(val<0) val=0;
((uchar*)(dstImg->imageData + dstImg->widthStep*y))[x*3+i] = (uchar)val;
}
}
}
}
int main()
{
IplImage* srcImg = cvLoadImage("E://pic//view.jpg");
IplImage* brightnessImg = cvCloneImage(srcImg);
//亮度变换,最后数值取值为正时变亮,负则变暗
BrightnessAdjust(srcImg, brightnessImg, 80.0f);
IplImage* contrastImg = cvCloneImage(srcImg);
//对比度变换,数值小于1降低对比度,大于1增强对比度
ContrastAdjust(srcImg, contrastImg, 1.3f);
cvNamedWindow("Source",CV_WINDOW_AUTOSIZE);
cvNamedWindow("BrightnessAdjust",CV_WINDOW_AUTOSIZE);
cvNamedWindow("ContrastAdjust",CV_WINDOW_AUTOSIZE);
cvShowImage("Source",srcImg);
cvShowImage("BrightnessAdjust",brightnessImg);
cvShowImage("ContrastAdjust",contrastImg);
cvWaitKey(0);
cvReleaseImage(&srcImg);
cvReleaseImage(&brightnessImg);
cvReleaseImage(&contrastImg);
cvDestroyWindow("Source");
cvDestroyWindow("BrightnessAdjust");
cvDestroyWindow("ContrastAdjustrast");
return 0;
}
转载于:https://my.oschina.net/u/923087/blog/279296