版权声明:本文为博主原创文章,未经博主允许不得转载。 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);