core核心模块--改变图像对比度和亮度

1.目的
(1)访问像素值
(2)用0初始化矩阵
(3)saturate_cast作用
(4)像素变换的内容

2.图像处理
一般来说,图像变换可以分为两种:点算子和临域算子
(1)点算子
点算子
PS:alpha为增益,beta为偏置。

(2)临域算子
临域算子是通过像素临域内的像素值来改变像素值,可以使用掩码操作(http://blog.csdn.net/nnuyi/article/details/72870532

3.代码实现

(1)个人实现

void Convert(const Mat& src, Mat& result, double alpha, double beta){
    int channels = src.channels();
    int rows = src.rows;
    int cols = src.cols;
    result.create(src.size(), src.type());
    for(int i = 0; i<rows; i++)
        for(int j=0; j<cols; j++)
            for(int k=0; k<channels; k++){
                //saturate_cast<rtype>对计算结果进行转换,避免像素值超出单位
                result.at<Vec3b>(i,j)[k] = saturate_cast<uchar>(alpha*src.at<Vec3b>(i,j)[k]+beta);
            }
}

(2)调用openCV API

    /**
    convertTo函数参数解释:
    result:结果矩阵
    -1:目标矩阵类型,或者在当前通道数与源矩阵通道数相同的情况下的depth,如果为负数,则目标矩阵与源矩阵类型相同
    alpha:增益(缩放倍数)
    beta:偏置
    */
    src.convertTo(result, -1, alpha, beta);

(3)完整代码

#include<iostream>
using namespace std;
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;

void Convert(const Mat& src, Mat& result, double alpha, double beta){
    int channels = src.channels();
    int rows = src.rows;
    int cols = src.cols;
    result.create(src.size(), src.type());
    for(int i = 0; i<rows; i++)
        for(int j=0; j<cols; j++)
            for(int k=0; k<channels; k++){
                //saturate_cast<rtype>对计算结果进行转换,避免像素值超出单位
                result.at<Vec3b>(i,j)[k] = saturate_cast<uchar>(alpha*src.at<Vec3b>(i,j)[k]+beta);
            }
}

int main(int argc, char** argv){
    cout << argc << endl;
    if(argc < 2){
        cout << "more parameters are required!!!" << endl;
        return(-1);
    }
    double alpha,beta;
    cout << "Input alpha:" << endl;
    cin >> alpha;
    cout << "Input beta:" << endl;
    cin >> beta;
    Mat src = imread(argv[1]);
    if(!src.data){
        cout << "error to read image!!!" << endl;
        return(-1);
    }
    /*
    convertTo函数参数解释:
    result:结果矩阵
    -1:目标矩阵类型,或者在当前通道数与源矩阵通道数相同的情况下的depth,如果为负数,则目标矩阵与源矩阵类型相同
    alpha:增益(缩放倍数)
    beta:偏置
    Mat result = Mat::zeros(src.size(), src.type());
    src.convertTo(result, -1, alpha, beta);
    */
    Mat result;
    Convert(src, result, alpha, beta);
    namedWindow("original image");
    imshow("original image", src);
    namedWindow("new image");
    imshow("new image", result);
    waitKey(0);
    return(0);
}

参考文献
1.http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/core/basic_linear_transform/basic_linear_transform.html#basic-linear-transform

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值