众所周知,
图像方面的3A算法有:
AF自动对焦(Automatic Focus)
自动对焦即调节摄像头焦距自动得到清晰的图像的过程
AE自动曝光(Automatic Exposure)
自动曝光的是为了使感光器件获得合适的曝光量
AW自动白平衡(Automatic White Balance)
白平衡的本质是使白色物体在任何光源下都显示白色
前面的文章也有提及过,在刚开始做图像算法的时候,我是先攻克的自动白平衡算法。
后来攻克自动曝光的时候,傻啦吧唧的,踩了不少坑。
我相信一定不止我一个,一开始的时候抱着对图像均衡化,
软磨硬泡,想要做出兼顾自动曝光和自动白平衡的算法。
可惜,图像均衡化去做白平衡或者自动曝光,这条路是错的。
严格意义上来说,图像均衡化是拉伸曲线,这种做法有个弊端。
它没有考虑到图像的空间信息,也就是局部信息。
当然如果是处理音频之类的算法,肯定要考虑时间信息,因为数据是时序性为主的。
而图像,明显是空间信息为主的。
所以从理论上来说,用拉伸曲线这种不具备空间信息的操作,来做空间信息处理的事情,是不科学的。
我记得这博客刚开始写的时候,好多网友问我,为什么你要写那么多图像模糊算法,
图像模糊算法好像很鸡肋啊,没什么用的吧。
这就大错特错了,因为模糊算法是图像算法中,典型的包含空间信息的全局算法。
也就是说,如果要玩好图像算法,玩好模糊算法就是标配。
本次分享的算法为《Local Color Correction using Non-Linear Masking》,是ImageShop博主,
彭兄发出来的,安利一下他的博客https://www.cnblogs.com/imageshop 。
这个文章里的算法比较简单,
主要是通过图像模糊获取局域权重信息,然后映射回图片上。
matlab代码如下:
复制代码
% Read the image
A=imread('input.jpg');
% Seperate the Channels
R=A(:,:,1);
G=A(:,:,2);
B=A(:,:,3);
% Calculate Intensity Component
I=(R+G+B)/3;
% Invert the image
I_inverted=255-I;
% Apply Average Filter to obtain the Mask Image
h_average=fspecial('average',15);
M=imfilter(I_inverted,h_average);
% Color Correction for R channel
R_new=zeros(size(R));
[c_y, c_x,~] = size(R);
for j = 1:c_x
for i = 1:c_y
p=double(R(i,j));
q=double(M(i,j));
R_new(i,j,:)=int8(255*((p/255)^(2^((128-q)/128))));
end
end
% Color Correction for G channel
G_new=zeros(size(G));
[c_y, c_x,~] = size(G);
for j = 1:c_x
for i = 1:c_y
p=double(G(i,j));
q=double(M(i,j));
G_new(i,j,:)=int8(255*((p/255)^(2^((128-q)/128))));
end
end
% Color Correction for B channel
B_new=zeros(size(B));
[c_y, c_x,~] = size(B);
for j = 1:c_x
for i = 1:c_y
p=double(B(i,j));
q=double(M(i,j));
B_new(i,j,:)=int8(255*((p/255)^(2^((128-q)/128))));
end
end
% Output Image
O=zeros(size(A));
O(:,:,1)=R_new;
O(:,:,2)=G_new;
O(:,:,3)=B_new;
% Convert the double output image to uint8
O=uint8(O);
% Plot the images
subplot(1,3,1), imshow(A), title('Original Image');
subplot(1,3,2), imshow(M), title('Mask');
subplot(1,3,3), imshow(O), title('Output Image');
复制代码
算法步骤很清晰,就不展开了。
图像方面的3A算法有:
AF自动对焦(Automatic Focus)
自动对焦即调节摄像头焦距自动得到清晰的图像的过程
AE自动曝光(Automatic Exposure)
自动曝光的是为了使感光器件获得合适的曝光量
AW自动白平衡(Automatic White Balance)
白平衡的本质是使白色物体在任何光源下都显示白色
前面的文章也有提及过,在刚开始做图像算法的时候,我是先攻克的自动白平衡算法。
后来攻克自动曝光的时候,傻啦吧唧的,踩了不少坑。
我相信一定不止我一个,一开始的时候抱着对图像均衡化,
软磨硬泡,想要做出兼顾自动曝光和自动白平衡的算法。
可惜,图像均衡化去做白平衡或者自动曝光,这条路是错的。
严格意义上来说,图像均衡化是拉伸曲线,这种做法有个弊端。
它没有考虑到图像的空间信息,也就是局部信息。
当然如果是处理音频之类的算法,肯定要考虑时间信息,因为数据是时序性为主的。
而图像,明显是空间信息为主的。
所以从理论上来说,用拉伸曲线这种不具备空间信息的操作,来做空间信息处理的事情,是不科学的。
我记得这博客刚开始写的时候,好多网友问我,为什么你要写那么多图像模糊算法,
图像模糊算法好像很鸡肋啊,没什么用的吧。
这就大错特错了,因为模糊算法是图像算法中,典型的包含空间信息的全局算法。
也就是说,如果要玩好图像算法,玩好模糊算法就是标配。
本次分享的算法为《Local Color Correction using Non-Linear Masking》,是ImageShop博主,
彭兄发出来的,安利一下他的博客https://www.cnblogs.com/imageshop 。
这个文章里的算法比较简单,
主要是通过图像模糊获取局域权重信息,然后映射回图片上。
matlab代码如下:
复制代码
% Read the image
A=imread('input.jpg');
% Seperate the Channels
R=A(:,:,1);
G=A(:,:,2);
B=A(:,:,3);
% Calculate Intensity Component
I=(R+G+B)/3;
% Invert the image
I_inverted=255-I;
% Apply Average Filter to obtain the Mask Image
h_average=fspecial('average',15);
M=imfilter(I_inverted,h_average);
% Color Correction for R channel
R_new=zeros(size(R));
[c_y, c_x,~] = size(R);
for j = 1:c_x
for i = 1:c_y
p=double(R(i,j));
q=double(M(i,j));
R_new(i,j,:)=int8(255*((p/255)^(2^((128-q)/128))));
end
end
% Color Correction for G channel
G_new=zeros(size(G));
[c_y, c_x,~] = size(G);
for j = 1:c_x
for i = 1:c_y
p=double(G(i,j));
q=double(M(i,j));
G_new(i,j,:)=int8(255*((p/255)^(2^((128-q)/128))));
end
end
% Color Correction for B channel
B_new=zeros(size(B));
[c_y, c_x,~] = size(B);
for j = 1:c_x
for i = 1:c_y
p=double(B(i,j));
q=double(M(i,j));
B_new(i,j,:)=int8(255*((p/255)^(2^((128-q)/128))));
end
end
% Output Image
O=zeros(size(A));
O(:,:,1)=R_new;
O(:,:,2)=G_new;
O(:,:,3)=B_new;
% Convert the double output image to uint8
O=uint8(O);
% Plot the images
subplot(1,3,1), imshow(A), title('Original Image');
subplot(1,3,2), imshow(M), title('Mask');
subplot(1,3,3), imshow(O), title('Output Image');
复制代码
算法步骤很清晰,就不展开了。