ISP算法-----Gamma实现

Gamma原理

从数学角度看gamma实际是一个值域范围(0,1)的指数运算;
对于数字图像处理而言,由于数值范围0~255,因此需要做归一化处理,Gamma指数运算后再反归一化处理,因此公式如下:
ISP算法-----Gamma实现_第1张图片

对于显示硬件而言,gamma是成像设备到显示设备的传递;
从图像增强、图像处理的角度来说gamma,gamma可以提高或者降低亮/暗处的对比度。

通过Gamma,亮处的像素点发生非线性变换,如图所示,此时,亮处的对比度增加,暗处的对比度降低;

Matlab源码

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%代码---Matlab中Gamma实现
%Author:Zhu
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clc;
clear;
close all;
image = imread("E:1.bmp");
[height,width,channels]=size(image);
imshow(image);
title("原图像");

image_R=image(:,:,1);
image_R=double(image_R);
image_G=image(:,:,2);
image_G=double(image_G);
image_B=image(:,:,3);
image_B=double(image_B);

%%%求解的新通道矩阵
R_image = zeros(height,width);
G_image = zeros(height,width);
B_image = zeros(height,width);

%%%Gamma值
GammaValue = 0.5;

%%%遍历RGB像素点
for i=1:1:height
    for j=1:1:width
       %%像素点数值需要先归一化到0-1内,然后反归一化
       R_image(i,j)= 255.*(image_R(i,j)/255).^(1/gammaValue);
       G_image(i,j)= 255.*(image_G(i,j)/255).^(1/gammaValue);
       B_image(i,j)= 255.*(image_B(i,j)/255).^(1/gammaValue);
    end
end

B_image = uint8(B_image);
R_image = uint8(R_image);
G_image = uint8(G_image);

%%%将三个矩阵叠加显示颜色
figure;
out_image=cat(3,R_image,G_image,B_image);
imshow(cat(3,R_image,G_image,B_image));
title('Gamma image');

成像效果

经过Gamma=0.5变换后

可以看到,经过Gamma变换后,亮处对比度提高,暗处对比度降低;

C++源码

void Gamma(unsigned char *srcData,const double gammaValue,int channelNum,int height,int width)
{
	//更新查找表,也可以作为全局数组
	unsigned char gammaLUT[256] = {0};
	int i = 0;
#pragma omp parallel for num_threads(3)
	for (i = 0; i < 256;i++)
	{
		gammaLUT[i] = (unsigned char)(255*pow((unsigned  char)i*1.0/255,1.0/gammaValue));
	}
	//更新Gamma
	int num = 0;
	1 == channelNum ? num = width*height : num = width*height * 3;
	if (1 == channelNum)
	{
#pragma omp parallel for num_threads(3)
		for (i = 0; i < num;i++)
		{
			srcData[i] = gammaLUT[(int)srcData[i]];
		}
	}
	else if (3 == channelNum)
	{
#pragma omp parallel for num_threads(3)
		for (i = 0; i < num; i++)
		{
			srcData[i] = gammaLUT[(int)srcData[i]];
		}
	}
	else
	{
		//通道错误
		return;
	}
}

你可能感兴趣的:(图像处理,算法,matlab)