数字图像基本处理——白平衡(color balance)

摘要:
② 数据类型问题:在matlab中读取图片后保存的数据是uint8,而matlab的默认数据类型是double。尽管在matlab中读取的图像的数据类型为uint8,但图像矩阵运算的数据类型是双重的。将图像转换为双格式:im2double()函数:当参数为uint8时,转换结果矩阵元素的值为(0,1)。

下面介绍两种简单的处理图像色彩平衡问题的算法,色彩平衡就是说将一张图片中RGB三个通道的值处理的相对均衡,也就是将图像中物体原本的颜色恢复出来,而不是在光照或者阳光下变色。

算法1:White Balance

数字图像基本处理——白平衡(color balance)第1张

matlab实现如下:

function res = WhiteBalance(img)
RGB=imread(img);
R=RGB(:,:,1);
G=RGB(:,:,2);
B=RGB(:,:,3);
I=0.299*R+0.587*G+0.114*B;
kr=mean(I(:))/mean(R(:));
kg=mean(I(:))/mean(G(:));
kb=mean(I(:))/mean(B(:));
% res(:,:,1)=kr*R;
% res(:,:,2)=kg*G;
% res(:,:,3)=kb*B;
res=cat(3,kr*R,kg*G,kb*B);
end

算法2:Maximum Value Balance

数字图像基本处理——白平衡(color balance)第2张

TR,TG,TB的含义:首先统计三个通道中高于SRGB的强度的个数,找到最大个数为Nmax,最后在每个通道中找到第Nmax个最大的强度值(也就是从大到小排序第Nmax个值)分别为TR,TG,TB

matlab实现如下:

function res = MaxValueBalance(img)
RGB=imread(img);
R=RGB(:,:,1);
% figure, imhist(R);
G=RGB(:,:,2);
% figure, imhist(G);
B=RGB(:,:,3);
% figure, imhist(B);
Srgb=min([max(R(:)) max(G(:)) max(B(:))]);
Nmax=max([sum(sum(R>=Srgb)) sum(sum(G>=Srgb)) sum(sum(B>=Srgb))]);
Tr_temp=sort(R(:),'descend');
Tr=Tr_temp(Nmax);
Tg_temp=sort(G(:),'descend');
Tg=Tg_temp(Nmax);
Tb_temp=sort(B(:),'descend');
Tb=Tb_temp(Nmax);
kr=Srgb/Tr;
kg=Srgb/Tg;
kb=Srgb/Tb;
% res(:,:,1)=kr*R;
% res(:,:,2)=kg*G;
% res(:,:,3)=kb*B;
res=cat(3,kr*R,kg*G,kb*B);
end

最后主函数测试一些示例图片,主函数如下:

clear;close all;clc;
addpath('E:Digital_img_processingLecture_3_dicussion_color_balance');
fig1='BW1.png';
fig2='BW2.png';
fig3='BW3.jpg';
wb_algorithm3=WhiteBalance(fig3);
% wb_algorithm2=WhiteBalance(fig2);
% wb_algorithm1=WhiteBalance(fig1);
% 
figure, imshow(wb_algorithm3);
title('White Balance algorithm 3');
% figure, imshow(wb_algorithm2);
% title('White Balance algorithm 2');
% figure, imshow(wb_algorithm1);
% title('White Balance algorithm 1');

% mvb_algorithm3=MaxValueBalance(fig3);
% mvb_algorithm2=MaxValueBalance(fig2);
% mvb_algorithm1=MaxValueBalance(fig1);

% figure, imshow(mvb_algorithm3);
% title('Max Value Balance algorithm 3');
% figure, imshow(mvb_algorithm2);
% title('Max Value Balance algorithm 2');
% figure, imshow(mvb_algorithm1);
% title('Max Value Balance algorithm 1');

测试结果如下:

算法1(输入->输出):

数字图像基本处理——白平衡(color balance)第3张

数字图像基本处理——白平衡(color balance)第4张

数字图像基本处理——白平衡(color balance)第5张

值得注意的是,后面两个测试图片有白色的边框,这在平衡后的图像中也可以看出,如果去掉这些白色的边框效果会更好,如下:

数字图像基本处理——白平衡(color balance)第6张

算法2(输入->输出):

数字图像基本处理——白平衡(color balance)第7张

数字图像基本处理——白平衡(color balance)第8张

数字图像基本处理——白平衡(color balance)第9张


需要注意的问题:(这些问题是一些使用matlab或者是处理数字图像的基本问题,查了一些其他资料,予以总结)

①变量清除的问题:如果重复执行某一脚本命令文件,需要在最前面加上在前面clc; close all; clear all; 为了清除工作空间中之前的变量,否则会影响后续的变量值。(clc: 清空命令窗口内容,不影响变量;close all: 关闭所有figure窗口;clear all: 清除工作空间所有变量,函数,MEX文件)

本实验没有加...作为一个好习惯以后都应该加上。

②数据类型的问题:

matlab中读取图片后保存的数据是uint8类型(8位无符号整数,即1个字节),而matlab默认数据类型双精度浮点double(64位,8个字节)。虽然matlab中读入图像的数据类型是uint8,但图像矩阵运算时的数据类型是double类型(这是因为精度及计算溢出问题)。

将图像转为double格式:
(1) im2double()函数:参数为uint8型时,转化结果矩阵元素取值位于(0,1)。
(2) double()函数:参数为uint8型时,转化结果矩阵元素取值位于(0,255)。

图像显示:
matlab处理完图像矩阵后,用imshow()显示图像或用inwrite()写入图片。如果参数数据类型是double型,认为double型数据位于(0,1),对于数组中大于1的元素,会将其归为1,显示为白色。而imshow显示uint8型时是0~255范围。所以对double类型的图像显示的时候,要么归一化到0~1之间,要么将double类型的0~255数据转为uint8类型。解决方法如下:

imshow(I/255); % 将图像矩阵转化到0-1之间
imshow(I,[]); % 自动调整数据的范围以便于显示
inshow(uint8(I)); % 转成uint8

另外如果矩阵数据图像是double类型(0~1之间)可直接im2uint8,这样不仅完成数据类型转换,而且将0~1之间映射为了0~255之间的数据。但是如果图像矩阵数据是double类型的0~255,直接im2uint8转换的话,matlab会将大于1的数据都转换为255,0~1之间的数据才会映射到0~255之间整型的数据。

mat2gray()和im2double()区别

这两个如果都是对uint8数据操作,区别就在于前者是归一化操作,归一化后也在0~1之间,自然结果也是double类型,后者是将数据从0~255映射到0~1。计算公式如下(I 代表强度,也就是像素值):

mat2gray:

数字图像基本处理——白平衡(color balance)第10张

im2double:

数字图像基本处理——白平衡(color balance)第11张

总结:(均考虑uint8)

int->double:(读入图像并进行运算)

im2double: 映射 (0,1)

double: (0,255)

mat2gray: 归一化 (0,1)

double->int:(输出图像)

① double类型在(0,255)之间

imshow(I/255): (0,1)

imshow(I,[]): (0,255)

imshow(uint8(I)) : (0,255)

② double类型在(0,1)之间

im2uint8(): (0,255)

uint8(round(I*255))

总之,就像是一个解码-编码的过程,im_和im_ 配合食用,其他类似。

ref:

matlab中clc,close,close all,clear,clear all作用区别:https://blog.csdn.net/majinlei121/article/details/46605783

Matlab图像数据类型unit8,double关系:https://blog.csdn.net/cymy001/article/details/78038324

matlab图像类型转换以及uint8、double、im2double、im2uint8和mat2gray等说明:https://blog.csdn.net/FX677588/article/details/53301740?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

免责声明:文章转载自《数字图像基本处理——白平衡(color balance)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇jquery中的事件对象SQL CHECK 约束下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

机器学习(二十一)— 特征工程、特征选择、归一化方法

  特征工程:特征选择,特征表达和特征预处理。 1、特征选择   特征选择也被称为变量选择和属性选择,它能够自动地选择数据中目标问题最为相关的属性。是在模型构建时中选择相关特征子集的过程。   特征选择与降维不同。虽说这两种方法都是要减少数据集中的特征数量,但降维相当于对所有特征进行了重新组合,而特征选择仅仅是保留或丢弃某些特征,而不改变特征本身。 降维常...

matlab矢量场数值可视化(动态数值模拟)

https://blog.csdn.net/eric_e/article/details/81294092 D3.js实现数据可视化 三维可视化 风场可视化(数据插值):风场是动态变化的,实时刷新的,数据实时动态性较高 windy:https://download.csdn.net/download/weixin_38690337/10724155http...

matlab函数——shading函数

函数说明: 是阴影函数控制曲面和图形对象的颜色着色,即用来处理色彩效果的,包括以下三种形式: shading faceted:默认模式,在曲面或图形对象上叠加黑色的网格线; shading flat:是在shading faceted的基础上去掉图上的网格线; shading interp:对曲面或图形对象的颜色着色进行色彩的插值处理,使色彩平滑过渡 ;...

四大机器学习编程语言对比:R、Python、MATLAB、Octave

本文作者是一位机器学习工程师,他比较了四种机器学习编程语言(工具):R、Python、MATLAB 和 OCTAVE。作者列出了这些语言(工具)的优缺点,希望对想开始学习它们的人有用。 图源:Pixabay.com GitHub 地址:https://github.com/mjbahmani/10-steps-to-become-a-data-sci...

以神经网络使用为例的Matlab和Android混合编程

由于需要在一个Android项目中使用神经网络,而经过测试发现几个Github上开源项目的训练效果就是不如Matlab的工具箱好,所以就想在Android上使用Matlab神经网络代码(可是。。。) 这个问题大概处理了两天,原本预计5个小时的。。。 过程遇到了诸多一手坑以及看到相关资料的对新手不友好,所以就把过程记录下来希望能给后来者一些帮助 这个教程从0...

深度自编码器(Deep Autoencoder)MATLAB解读

深度自编码器(Deep Autoencoder)MATLAB解读作者:凯鲁嘎吉 - 博客园http://www.cnblogs.com/kailugaji/ 这篇文章主要讲解Hinton在2006年Science上提出的一篇文章“Reducing the dimensionality of data with neural networks”的主要思想与M...