android使用opencv之亮度与对比度处理

网上收集了两种亮度与对比度的计算公式:

第一种:
一副图像的亮度对比度调节属于图像的灰度线性变换,其公式如下:
y = [x - 127.5 * (1 - B)] * k + 127.5 * (1 + B);
x为调节前的像素值,y为调节后的像素值。
其中B取值[-1,1],调节亮度;
k调节对比度,arctan(k)取值[1,89],所以
k = tan( (45 + 44 * c) / 180 * pi );
其中c取值[-1,1]。通常我们用该值来设置对比度
特别的,
当B=0 时:y = (x - 127.5) * k + 127.5; 这时只调节对比度。
当c=0 时,k = 1:y = x + 255 * B; 这时只调节亮度。

第二种:g(i,j)=a*f(i,j)+b
参数f(i,j)表示源图像像素
参数g(i,j)表示输出图像像素
参数a(需要满足a>0)被称为增益(gain),常常被用来控制图像的对比度
参数b通常被称为偏置,常常被用来控制图像的亮度。

我更倾向于使用后者,公式简单,经过测试,后者出入比较小。

NDK代码如下:

JNIEXPORT jintArray JNICALL
Java_com_xy_opencv_ndk_1opencv002_MainActivity_lightPixels(JNIEnv *env, jclass type,
                                                           jintArray pixels_, jint w, jint h) {
    jint *pixels = env->GetIntArrayElements(pixels_, NULL);

    //颜色数据转换 ARGB的颜色数据被转成BGRA
    Mat img(h, w, CV_8UC4, pixels);

    //获取行数和列数
    int row = img.rows;
    int col = img.cols;
       //亮度
    double b = 50;
    //对比度 (值越小图片越灰暗)
    double c = 0.3;

    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            //Blue
            img.at<Vec4b>(i, j)[0] = (uchar) (img.at<Vec4b>(i, j)[0] * c + b);
            //Green
            img.at<Vec4b>(i, j)[1] = (uchar) (img.at<Vec4b>(i, j)[1] * c + b);
            //Red
            img.at<Vec4b>(i, j)[2] = (uchar) (img.at<Vec4b>(i, j)[2] * c + b);
            //Alpha
            img.at<Vec4b>(i,j)[3] = 255;
        }
    }

    int size = w * h;

    jintArray result = env->NewIntArray(size);

    env->SetIntArrayRegion(result,0,size,pixels);

    env->ReleaseIntArrayElements(pixels_, pixels, 0);

    return result;
}

结果图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值