这篇文章是一次课程作业,发到网上以供参考,由于时间有点紧张导致有些部分不够详尽以及有些方法没有实现,之后如果有机会再进行补充。

作业要求

以下两题任选一道完成,自选合适的测试图象,提交代码、实验结果和作业报告。

  1. 编程实现一种色调转移或饱和度调整算法。
  2. 使用彩色图像处理技术实现一种照片编辑算法。例如:白平衡/HDR多图融合/彩色图像风格化,等等……

​ 本次作业中我对基本的白平衡算法进行了调研并实现了其中的部分,原理和实现在之后详述。

白平衡原理

​ 白平衡(White Balance),或者称之为色彩恒常性(Color Constancy),即在光照变化的情况下保持景物色彩一致的能力。人类大脑拥有有关色彩恒常性的相关机制,可以使同一个物体(通常认为自然界中物品大多数不会变色,改变的是光源)在不同的光源条件下都被大脑识别为近似的颜色。而相机实际上是利用内部复杂的图像处理管线(image processing pipeline),将进入传感器的光强(准确来说是辐照度irradiance)变换到像素值。而由于不同的光源条件,导致同一个物体反射的光线会有所差别,这也导致了最终相机会认为同一个物品在不同光线条件下为不同的颜色。为了解决这一问题,现代相引入了白平衡调整的功能。

​ 在了解白平衡之前还需要讲解色温的概念,色温是假定某一黑体,能够吸收外来的所有电磁辐射,随着温度的上升黑体辐射出的电磁波与光线则称作黑体辐射。随着温度的升高,黑体的颜色会从暗红到亮红、再到金黄色最后到蓝色。这一变化也符合可见光频率的分布。在日常生活中最重要的光源就是太阳,太阳发出的光很接近黑体光谱,其表面温度约为5500K,而这个温度对应黑体发出的光基本就为白色。
参考链接:
色温、白平衡与色彩恒常性 知乎专栏
色彩恒常性:你看到什么颜色的裙子?

​ 据此相机可以对当前记录的数据进行处理,通过预设的补偿,对颜色进行偏移。也即下图中White Balance步骤,此时相机会对RAW文件(往往是12bit、14bit或更高)进行颜色上的偏移,由于RAW文件记录的数据远大于最终RGB图像8bit的范围,所以这种调整往往是无损的(但若偏移过大仍会有可能产生损失)。

​ 以具体的画面为例,下图中相机白平衡设置为4500K,即认为4500K的色温为白色,此时色温高于这个数值的光线会显现出蓝色(色温高),低于这个数值会显现出红橙色(色温低)。

​ 如果将白平衡设置为6500K,会呈现如下画面。此时色温低于6500K的光线都会呈现低色温的暖色。

​ 同理,将色温设置为2800K,会有如下画面,所有色温高于2800K的光线都会呈现高色温的冷色。

以上所有图片来自于视频截图,链接如下。

White Balance & Kelvin Color temp explained

白平衡算法

灰色世界算法

​ 灰色世界基于这样一种假设:对于一幅有着大量色彩变化的图片,RGB三个分量的平均值趋于同一个灰度值Gray‾\overline{Gray}Gray​。即灰度世界法假设自然界景物对于光线的反射的平均值在总体上近似为“灰色”。通过这一假设,可以对RGB三个通道均值进行计算,并尽可能消除环境光的影响。

我采取的方法是计算三通道的均值作为灰色,Gray‾=R‾+G‾+B‾3计算三通道的增益系数,kR=Gray‾R‾,kG=Gray‾G‾,kB=Gray‾B‾对于每一个像素C,调整RGB分量C(R′)=C(R)∗kR,C(G′)=C(G)∗kG,C(B′)=C(B)∗kB我采取的方法是\\ 计算三通道的均值作为灰色,\overline{Gray}=\frac{\overline R+\overline G + \overline B}{3}\\ 计算三通道的增益系数,k_R = \frac{\overline{Gray}}{\overline R},k_G = \frac{\overline{Gray}}{\overline G},k_B = \frac{\overline{Gray}}{\overline B}\\ 对于每一个像素C,调整R G B分量\\C(R')=C(R)*k_R,C(G') = C(G)*k_G,C(B') = C(B)*k_B 我采取的方法是计算三通道的均值作为灰色,Gray​=3R+G+B​计算三通道的增益系数,kR​=RGray​​,kG​=GGray​​,kB​=BGray​​对于每一个像素C,调整RGB分量C(R′)=C(R)∗kR​,C(G′)=C(G)∗kG​,C(B′)=C(B)∗kB​

​ 代码实现于文件greyWorld.m中。

​ 效果如下,左图是我用相机拍摄的白平衡明显偏低(即色温偏高)的图片,右图是使用Gray World算法生成的白平衡经过校准的图片。

完美反射算法

​ 完美反射基于这样的假设:假设图片上最亮点就是白色点,则该点可以完美反射三种颜色,并以此点为参考对图像进行自动白平衡。

步骤如下:\

  1. 计算每个像素RGB之和,作为亮度\
  2. 选定一个ratio如10%,作为阈值,高于此阈值的点可以认为近似白色\
  3. 对所有高过阈值的点各分量求平均\
  4. 对每一个像素点,利用上面算出的数据将亮度量化到[0,255]之间\

​ 使用相同的测试图片,效果如下。

​ 这部分代码位于perfReflect.py中,这部分使用Python来实现,因为MATLAB遇到一些奇怪的bug…

二者对比

​ 一般来说灰度世界虽然是最简单的算法,但往往效果还算不错,且执行速度非常快。但如果有较大区域有相同颜色,这显然会导致灰度世界的假设不成立,也会使效果产生偏差。

​ 完美反射计算量会更大,导致每次执行计算都会花费更多时间,但由于ratio的影响,可能会导致图片偏白,或高光溢出。且对于某些极端情况,比如白平衡偏移加上暗光,会导致结果严重失真。如下图。


​ 作为对比放上Grayworld算法的结果。

附上代码:
(第一次用CSDN,为什么代码块没有matlab呢)

function [] = greyWorld(fileName)source = imread(fileName);R = source(:, :, 1);G = source(:, :, 2);B = source(:, :, 3);aveR = mean(mean(R));aveG = mean(mean(G));aveB = mean(mean(B));aveGrey = (aveR + aveG + aveB) / 3;scaleR = aveGrey / aveR;scaleG = aveGrey / aveG;scaleB = aveGrey / aveB;res(:, :, 1) = scaleR * R;res(:, :, 2) = scaleG * G;res(:, :, 3) = scaleB * B;figure;imshow(source);figure;imshow(res);
end
import cv2
import numpy as np
import randomdef perfReflect(fileName):img = cv2.imread(fileName)cv2.namedWindow("source", 0)cv2.resizeWindow("source", 640, 480)cv2.imshow("source", img)b, g, r = cv2.split(img)m, n, t = img.shapesum_ = np.zeros(b.shape)for i in range(m):for j in range(n):sum_[i][j] = int(b[i][j]) + int(g[i][j]) + \int(r[i][j])  # 每个像素rgb相加hists, bins = np.histogram(sum_.flatten(), 766, [0, 766])  # 亮度做索引的数组Y = 765num, key = 0, 0ratio = 10while Y >= 0:  # 根据ratio 选择阈值num += hists[Y]if num > m * n * ratio / 100:key = YbreakY = Y - 1sum_b, sum_g, sum_r = 0, 0, 0time = 0for i in range(m):for j in range(n):if sum_[i][j] >= key:  # 所有大于阈值的像素做平均sum_b += b[i][j]sum_g += g[i][j]sum_r += r[i][j]time = time + 1avg_b = sum_b / timeavg_g = sum_g / timeavg_r = sum_r / timemaxvalue = np.max(img)for i in range(m): #对每个像素进行量化 for j in range(n):b = int(img[i][j][0]) * maxvalue / int(avg_b)g = int(img[i][j][1]) * maxvalue / int(avg_g)r = int(img[i][j][2]) * maxvalue / int(avg_r)if b > 255:b = 255if b < 0:b = 0if g > 255:g = 255if g < 0:g = 0if r > 255:r = 255if r < 0:r = 0img[i][j][0] = bimg[i][j][1] = gimg[i][j][2] = rcv2.namedWindow("result", 0)cv2.resizeWindow("result", 640, 480)cv2.imshow("result", img)cv2.waitKey(0)perfReflect("DSCF0817.jpg")

代码参考:基于灰度世界、完美反射、动态阈值等图像自动白平衡算法的原理、实现及效果

白平衡算法简单原理以及灰色世界、完美反射实现相关推荐

  1. 概率图模型推断算法简单原理+实现

    本文是一个记录薄,记录一下我关于概率图模型的推断算法的理解 利用连接树算法进行精确推断 联合树算法 library("gRbase") library("gRain&qu ...

  2. α-β剪枝算法简单原理说明

    看了一大堆文章实在看不懂,看视频也看不懂,但是看着看着突然顿悟了.这篇文章只讲大概的原理,不讲具体过程. 好了既然会搜这个算法,想必已经知道最大值最小值算法了(不知道就去搜吧).这里直接讲例子. 如图 ...

  3. 基于灰度世界、完美反射、动态阈值等图像自动白平衡算法

    文章目录 一.灰度世界算法 二.完美反射算法 三.动态阈值算法 一.灰度世界算法 C++ 算法: 灰度世界 灰度世界算法(Gray World)是以灰度世界假设为基础的,该假设认为对于一幅有着大量色彩 ...

  4. 基于灰度世界、完美反射、动态阈值等图像自动白平衡算法的原理、实现及效果...

    原文:http://www.cnblogs.com/Imageshop/archive/2013/04/20/3032062.html 白平衡是电视摄像领域一个非常重要的概念,通过它可以解决色彩还原和 ...

  5. 白平衡之完美反射算法

    一.算法背景   白平衡是图像处理比较常见的一个概念,在采集图像的过程中,相机的感光元件或者镜头会对原始色彩造成影响,而白平衡技术通常可以用来校正这种光线和镜头对颜色影响.所以现在先记录一个白平衡算法 ...

  6. JavaCV - 白平衡(完美反射算法)

    一.效果图 如图所示,左侧为原图,右侧是白平衡处理后的图片 二.实现原理 白平衡的意义在于,对在特定光源下拍摄时出现的偏色现象,通过加强对应的补色来进行补偿,使白色物体能还原为白色. 完美反射算法是白 ...

  7. 自动白平衡之完美反射算法原理及C++实现

    自动白平衡之完美反射算法原理及C++实现 原文:https://blog.csdn.net/just_sort/article/details/85982871 算法原理 https://www.cn ...

  8. 图像处理里的简单白平衡算法

    # -*- coding: utf-8 -*- # @FileName: 白平衡算法 # @Software: PyCharm # @Author : li Xu # @Time :2020//11/ ...

  9. matlab 图像白平衡算法,Matlab常用白平衡算法

    <Matlab常用白平衡算法>由会员分享,可在线阅读,更多相关<Matlab常用白平衡算法(21页珍藏版)>请在人人文库网上搜索. 1.1 灰色世界法灰色世界法(grey wo ...

最新文章

  1. Science:中科院植物所马克平组揭示土壤真菌与树木密度的关系
  2. android开发(30) 使用WebView,点击网页中的链接建立QQ 临时会话 WPA
  3. 使用技巧_信用卡的使用技巧
  4. Android技术应用实验指导书,Android应用开发实验指导书
  5. java中replace函数
  6. 浅析人类最贵、最大的机器学习模型GPT-3及背后隐含的商业逻辑
  7. 为 git 设置 http 代理
  8. 使用SAP HANA Web-based Development Workbench进行SQLScript练习
  9. Ubuntu下的文件安全删除工具
  10. 当年叱咤风云的框架Struts2,你可知Struts2内功如何修炼之体系结构
  11. ios7之后的一些更改
  12. 亚洲新首富出炉!富豪榜单大洗牌,马云3年来首次跌出中国前三
  13. 阿里巴巴宣布成立半导体公司,要自主研发芯片
  14. JAVA JDK windows环境搭建
  15. 公众号回复单个图文消息
  16. 数据结构与算法-学习笔记(18)
  17. 0011-绝对值函数
  18. 直播盒子APP源码AlijuheCMS™开发手册之接口文档 for Android
  19. 数据风云、十年变迁(DTCC会议总结)
  20. 制作Win7多合一原版系统光盘镜像

热门文章

  1. C陷阱与缺陷 要点总结
  2. Java打包后运行jar包报错Caused by: org.springframework.beans.factory.BeanCreationException: Error creating be
  3. Twisted基本模型
  4. 总结陈丹琦博士论文(二):NEURAL READING COMPREHENSION AND BEYOND
  5. 计算机网络实训报告:宿舍校园网网络设计
  6. @vant/weapp
  7. 李乐园:读懂微生物王国的故事
  8. python使用双线性插值计算网格内数据
  9. mui框架android,mui框架安卓离线打包高级应用
  10. KEIL4/5的背景色修改