matlab 自动阈值白平衡算法 程序可编译实现
一种效果很好的自动白平衡技术(WhiteBalance)
白平衡是图像处理的一个极重要概念。所谓白平衡(英文名称为White Balance),就是对白色物体的还原。当我们用肉眼观看这大千世界时,在不同的光线下,对相同的颜色的感觉基本是相同的,比如在早晨旭日初升时,我们看一个白色的物体,感到它是白的;而我们在夜晚昏暗的灯光下,看到的白色物体,感到它仍然是白的。这是由于人类从出生以后的成长过程中,人的大脑已经对不同光线下的物体的彩色还原有了适应性。但是,作为拍摄设备,如数码相机,可没有人眼的适应性,在不同的光线下,由于CCD输出的不平衡性,造成数码相机彩色还原失真。一般情况下,我们习惯性地认为太阳光是白色的,已知直射日光的色温是5200K左右,白炽灯的色温是3000K左右。用传统相机的日光片拍摄时,白炽灯光由于色温太低,所以偏黄偏红。所以通常现场光线的色温低于相机设定的色温时,往往偏黄偏红,现场光线的色温高于相机设定时,就会偏蓝。
为了解决不同色温下,引起的白色漂移现象。由于白色对色温变化的响应最大,通常用白色来作为调整的基色。通常的白平衡技术有:自动白平衡、钨光白平衡、荧光白平衡、室内白平衡、手动调节。本文仅介绍其中的一种自动白平衡。
白平衡算法通常分为两步:白色点的检测,白色点的调整。本方法采用一个动态的阀值来检测白色点。详细算法过程为:
1. 把图像w*h从RGB空间转换到YCrCb空间。
2. 选择参考白色点:
a. 把图像分成3*4个块(块数可选)。
b. 对每个块,分别计算Cr,Cb的平均值Mr,Mb。
c. 对每个块,根据Mr,Mb,分别计算Cr,Cb的方差Dr,Db。
d. 判定每个块的近白区域(near-white region)。
判别表达式为:Cb(i, j) − (Mb + Db × sign(Mb )) < 1.5× Db && Cr(i, j) − (1.5×Mr + Dr × sign(Mr )) < 1.5× Dr
设一个“参考白色点”的亮度矩阵RL,大小为w*h。
若符合判别式,则作为“参考白色点”,并把该点(i,j)的亮度(Y分量)值赋给RL(i,j);
若不符合,则该点的RL(i,j)值为0。
3. 选取参考“参考白色点”中最大的10%的亮度(Y分量)值,并选取其中的最小值Lu_min.
4. 调整RL,若RL(i,j)<Lu_min, RL(i,j)=0; 否则,RL(i,j)=1;
5. 分别把R,G,B与RL相乘,得到R2,G2,B2。 分别计算R2,G2,B2的平均值,Rav,Gav,Bav;
6. 得到调整增益: Ymax=double(max(max(Y)))/15;
Rgain=Ymax/Rav;
Ggain=Ymax/Gav;
Bgain=Ymax/Bav;
7. 调整原图像:Ro= R*Rgain; Go= G*Ggain; Bo= B*Bgain;
代码如下:
- function autoWhiteBalanceTest
- clear all;
- close all;
- clc;
- im=imread('13.jpg');
- im2=im;
- im1=rgb2ycbcr(im);%将图片的RGB值转换成YCbCr值%
- Lu=im1(:,:,);
- Cb=im1(:,:,);
- Cr=im1(:,:,);
- [x y z]=size(im);
- tst=zeros(x,y);
- %计算Cb、Cr的均值Mb、Mr%
- Mb=mean(mean(Cb));
- Mr=mean(mean(Cr));
- %计算Cb、Cr的均方差%
- Db=sum(sum(Cb-Mb))/(x*y);
- Dr=sum(sum(Cr-Mr))/(x*y);
- %根据阀值的要求提取出near-white区域的像素点%
- cnt=;
- for i=:x
- for j=:y
- b1=Cb(i,j)-(Mb+Db*sign(Mb));
- b2=Cr(i,j)-(1.5*Mr+Dr*sign(Mr));
- if (b1<abs(1.5*Db) & b2<abs(1.5*Dr))
- Ciny(cnt)=Lu(i,j);
- tst(i,j)=Lu(i,j);
- cnt=cnt+;
- end
- end
- end
- cnt=cnt-;
- iy=sort(Ciny,'descend');%将提取出的像素点从亮度值大的点到小的点依次排列%
- nn=round(cnt/);
- Ciny2(:nn)=iy(:nn);%提取出near-white区域中10%的亮度值较大的像素点做参考白点%
- %提取出参考白点的RGB三信道的值%
- mn=min(Ciny2);
- for i=:x
- for j=:y
- if tst(i,j)<mn
- tst(i,j)=;
- else
- tst(i,j)=;
- end
- end
- end
- R=im(:,:,);
- G=im(:,:,);
- B=im(:,:,);
- R=double(R).*tst;
- G=double(G).*tst;
- B=double(B).*tst;
- %计算参考白点的RGB的均值%
- Rav=mean(mean(R));
- Gav=mean(mean(G));
- Bav=mean(mean(B));
- Ymax=double(max(max(Lu)))/;%计算出图片的亮度的最大值%
- %计算出RGB三信道的增益%
- Rgain=Ymax/Rav;
- Ggain=Ymax/Gav;
- Bgain=Ymax/Bav;
- %通过增益调整图片的RGB三信道%
- im(:,:,)=im(:,:,)*Rgain;
- im(:,:,)=im(:,:,)*Ggain;
- im(:,:,)=im(:,:,)*Bgain;
- %显示图片%
- figure,imshow(im2),title('原图');
- figure,imshow(im),title('白平衡后的效果图');
参考地址:http://www.cnblogs.com/haar/articles/1392227.html
http://www.cnblogs.com/tiandsp/archive/2012/05/01/2477897.html
matlab 自动阈值白平衡算法 程序可编译实现的更多相关文章
- 亲测有效!一种完美动态阈值白平衡算法 Java实现。
几年没发文了,重新拿起技术! 最近做图像处理,要自动处理颜色平衡问题,很多什么直方图优化之类的,都不完美.所以在博客园找到了这个前辈的文章. http://www.cnblogs.com/Images ...
- matlab灰度变彩色+白平衡算法实现
% matlab彩色图像分离通道并合并成处理后的彩色图像(彩色变灰度再变彩色) % 白平衡算法(灰度世界法)消除RGB受光照影响 clear all; close all; %读入原始图像 srcIm ...
- MFC:“Debug Assertion Failed!” ——自动生成的单文档程序项目编译运行就有错误
今天照着孙鑫老师的VC++教程学习文件的操作,VS2010,单文档应用程序,项目文件命名为File,也就有了自动生成的CFileDoc.CFileView等类,一进去就编译运行(就是最初自动生成的项目 ...
- 用gcc进行程序的编译
在Linux系统上,一个档案能不能被执行看的是有没有可执行的那个权限(x),不过,Linux系统上真正认识的可执行文件其实是二进制文件(binary program),例如/usr/bin/passw ...
- 关于一个程序的编译过程 zkjg面试
http://blog.csdn.net/gengyichao/article/details/6544266 一 以下是C程序一般的编译过程: 从图中看到: 将编写的一个c程序(源代码 )转换成可以 ...
- C/C++程序从编译到链接的过程
编译器是一个神奇的东西,它能够将我们所编写的高级语言源代码翻译成机器可识别的语言(二进制代码),并让程序按照我们的意图按步执行.那么,从编写源文件代码到可执行文件,到底分为几步呢?这个过程可以总结为以 ...
- OpenCV白平衡算法之灰度世界法(消除RGB受光照影响)
在用OpenCV对图像进行处理时,利用颜色定位是常常会接触到的方法,但RGB受光照影响比较严重,转换到HSV XYZ等空间也解决不了时, 可以用白平衡算法进行修正,使其发黄.发蓝.发红的照片更加趋于自 ...
- 灰度图像的自动阈值分割(Otsu 法)(转载)
灰度图像的自动阈值分割(Otsu 法) 机器视觉领域许多算法都要求先对图像进行二值化.这种二值化操作阈值的选取非常重要.阈值选取的不合适,可能得到的结果就毫无用处.今天就来讲讲一种自动计算阈值的方法. ...
- 附录三 嵌入式C程序的编译与调试
课程回顾 C语言库的特性和发展 C语言库的常用库函数 标准库函数的特色应用 git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysi ...
随机推荐
- laravel框架总结(一) -- 请求和响应
一.laravel请求 1.获取请求 1>获取请求的 URI path 方法会返回请求的 URI.所以,如果接收到的请求目标是 http://domain.com/foo/bar,那么 path ...
- qt中信号与槽机制
一. 简介 就我个人来理解,信号槽机制与Windows下消息机制类似,消息机制是基于回调函数,Qt中用信号与槽来代替函数指针,使程序更安全简洁. 信号和槽机制是 Qt 的核心机制,可以让编程人员将互不 ...
- android 入门 002 (拨打电话,发送短信)
一.拨打电话 1.首先做好界面,代码如下: layout =>activity_main.xml 中 <LinearLayout xmlns:android="http://sc ...
- 腾讯微博模拟登陆+数据抓取(java实现)
不多说,贴出相关代码. 参数实体: package token.def; import java.io.Serializable; import java.util.Properties; publi ...
- dubbo子模块
dubbo源码版本:2.5.4 经统计,dubbo一共有36个子模块,子模块如下: ---------------------------------------------------------- ...
- Hashtable与ConcurrentHashMap区别
Hashtable与ConcurrentHashMap区别 ConcurrentHashMap融合了hashtable和hashmap二者的优势. hashtable是做了同步的,是线性安全的,(2) ...
- C#单击按钮显示图片,带开始停止
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...
- 熟悉 Objective-C
## 1. OC 的起源 OC 的方法(本质上讲是消息)在运行时决定.使用函数调用的语言,由编译器决定.如果涉及多态,则用到虚函数表. ## 2. 少在头文件中引用其他文件 1. 两个头文件互相引用会 ...
- ASP.NET四则运算--策略模式
在ASP.NET中实现四则运算,同样使用了类的封装,以及策略模式.只不过是把封装的类.前台代码以及后台的代码分离开来,但同样是要达到功能的实现. Calculator.cs using System; ...
- ABAP WRITE、WRITE TO、FORMAT语句
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...