图像的亮度变换和对比度变换

#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值