06_OpenCv调整图像对比度与亮度

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gzx110304/article/details/88871565

06_调整图像对比度与亮度

一.公式

  • dst = alpha*src + beta

  • alpha > 0,控制图像对比度

  • beta是增益变量,控制图像亮度

  • 在通过bitmap.setPixels(pixels, 0, width, 0, 0, width, height)操作像素时,要求bitmap对象的isMutable为true,可通过如下方式来设置:

    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inPreferredConfig = Bitmap.Config.ARGB_8888;
    //在android中通过Bitmap去操作像素的时候,必须保证Bitmap对象的isMutable属性为true,否则抛出java.lang.IllegalStateException
    options.inMutable = true;
    Bitmap bitmap = BitmapFactory.decodeResource(
            context.getResources(),
            drawableId,
            options);
    

二.遍历Mat中的像素信息

  • 可以通过src.get(i, j, bgra)遍历图像,表示从第i行j列开始遍历bgra.length个像素信息,并存入bgra中

  • 像素值的范围处理:保证运算后的像素值在0-255之间:

    private static int saturateCast(double pixelValue) {
        int newValue = (int) Math.round(pixelValue);
        if(newValue > 255) {
            newValue = 255;
        }
        if(newValue < 0) {
            newValue = 0;
        }
        return newValue;
    }
    

三.通过遍历Mat对象的方式实现图像对比度和亮度的调节

//1.将输入图像的Bitmap对象转换为Mat对象
Mat srcMat = new Mat();
Utils.bitmapToMat(src, srcMat);
//2.通过Mat对象获取图像的宽度、高度以及通道数
int width = srcMat.cols();
int height = srcMat.rows();
int channels = srcMat.channels();
//3.定义一个字节数组,接收Mat对象中的每一个像素信息
byte[] bgra = new byte[channels];
//4.遍历Mat对象
for (int row = 0; row < height; row++) {
    for (int col = 0; col < width; col++) {
        srcMat.get(row, col, bgra);
        for (int i = 0; i < channels; i++) {
            bgra[i] = (byte) saturateCast((alpha * (bgra[i] & 0xff) + 0.5) + beta);
        }
        srcMat.put(row, col, bgra);
    }
}
Utils.matToBitmap(srcMat, src);

三.通过遍历Bitmap的方式实现图像对比度和亮度的调节

int width = src.getWidth();
int height = src.getHeight();

//1.开辟像素缓冲区(int数组),其长度为(bitmap的宽度 * bitmap的高度)
int[] pixels = new int[width * height];
//2.将所有像素取到缓冲区中
src.getPixels(pixels, 0, width, 0, 0, width, height);
//3.通过pixel遍历每一个像素
int a = 0, r = 0, g = 0, b = 0;
for(int i=0; i<pixels.length; i++) {
    int pixel = pixels[i];
    a = (pixel >> 24) & 0xff;
    r = (pixel >> 16) & 0xff;
    g = (pixel >> 8) & 0xff;
    b = pixel & 0xff;

    a = saturateCast(a*alpha + beta);
    r = saturateCast(r*alpha + beta);
    g = saturateCast(g*alpha + beta);
    b = saturateCast(b*alpha + beta);

    pixel = ((a&0xff) << 24) | ((r&0xff) << 16) | ((g&0xff) << 8) | (b&0xff);
    pixels[i] = pixel;
}
src.setPixels(pixels, 0, width, 0, 0, width, height);

四.通过OpenCv的接口实现图像对比度和亮度的调节

//1.将输入图像的Bitmap对象转换为Mat对象
Mat srcMat = new Mat();
Utils.bitmapToMat(src, srcMat);
//2.生成一个Mat与srcMat相加
Mat betaMat = new Mat(srcMat.size(), srcMat.type(), Scalar.all(beta));
Core.addWeighted(srcMat, alpha, betaMat, 1.0, 0.0, srcMat);
//3.将srcMat转为Bitmap对象
Utils.matToBitmap(srcMat, src);

五.运行结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/gzx110304/article/details/88871565