第2页
样片
第3页
使用普通 8M 手机拍摄: 1. 噪点高、细节不足 2. 色域窄、白平衡失真
第5页
PC 端多帧合成软件:
第6页
对同一场景进行大量采样后进行多帧合成:
第7页
处理完成:
第10页
PC 端多帧合成特点: 1. 象素能够达到 78M 以上(达到印刷画质的要求) 2. 能够实现降噪(尤适合高 ISO 夜景画面)及景深扩展 3. 相对手机端,适合进行几分钟至半小时不等的耗时处理
第13页
接下来解决的问题:
拓展色域范围
第15页
HDR (高动态范围图像)技术:
使用多张不同曝光程度的照片及图片,以一定算法映射合成一张包含更为 丰富的色彩与细节的图片。
第16页
引用自 wikipedia.org HDR 词条
第17页
能够用于制作 HDR 图像的图像处理软件: Fotor (好照片)、 Luminance HDR ( Qtpfsgui )、 easyHDR 等
* 其中 Luminace HDR 能够用于编程批处理
第18页
Fotor 样片
第19页
Fotor 样片
第20页
Luminace HDR 样片
第21页
Luminace HDR 样片
第22页
接下来
多帧合成 +HDR : 1. 对于相同场景以不同曝光参数各拍摄一组照片 2. 对每组照片进行多帧合成(降噪) 3. 对上述合成图片进行 HDR 映射,合成最终图片
第23页
分组多帧合成: 1. 对同一场景以多种曝光程度各拍摄几组照片
2. 分别对这几组照片进行多帧合成
第24页
裁剪图片: HDR 软件要求所使用的图片具有相同的尺寸,故需要
将多帧合成后的各张照片裁剪成相同尺寸。
第25页
HDR 合成后的最终结果
第28页
一键生成
第29页
使用 Python 对采样照片进行自动化批处理:
1. 使用照相设备拍摄相同场景,以不同曝光程度拍摄出多组照片。
2. 编写脚本,调用外部的多帧合成软件(例如 Photoacute2.x 的命令行)将已分组的各 组照片,逐组处理,每组生成一张高清图片。
3. 使用 PIL 将这些高清图片剪裁成统一尺寸的图片,并进一步缩小到合适的尺寸 ( HDR 软件难以处理 3000 万以上像素的图片,或者将非常耗时)。
4. 编写脚本,调用外部的 HDR 软件(例如 Luminance HDR )将多张不同曝光的同尺 寸高清图片以合适的映射算法生成高清的 HDR 图片。
5. 使用 GIMP 等图像处理软件,将不同 HDR 映射算法生成的候选图片进行叠混,并对 白平衡进行调整,生成最终图片。有必要时,可以使用 Python 编写 GIMP 插件来进行 自动化处理。
第30页
对于 Linux&Unix 玩家
第31页
# 使用 Docker&Wine 在沙箱中安装 Windows 软件( Dockfile for linux & Unix users ):
FROM ubuntu:14.10
RUN echo 'deb http://mirrors.163.com/ubuntu/ utopic-backports main restricted universe multiverse' > /etc/apt/sources.list && \
sed -i '1ideb http://mirrors.163.com/ubuntu/ utopic-proposed main restricted universe multiverse' /etc/apt/sources.list && \
sed -i '1ideb http://mirrors.163.com/ubuntu/ utopic-security main restricted universe multiverse' /etc/apt/sources.list && \
sed -i '1ideb http://mirrors.163.com/ubuntu/ utopic-updates main restricted universe multiverse' /etc/apt/sources.list && \
sed -i '1ideb http://mirrors.163.com/ubuntu/ utopic main restricted universe multiverse'
/etc/apt/sources.list
RUN dpkg --add-architecture i386
RUN apt-get update -y
RUN apt-get upgrade -y
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get install -y aptitude openssh-server xterm
RUN echo X11Forwarding yes >> /etc/ssh/ssh_config
RUN sed -i 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd
RUN sed -i 's/PermitEmptyPasswords no/PermitEmptyPasswords yes/g' /etc/ssh/sshd_config
RUN dpkg-divert --local --rename --add /sbin/initctl && ln -sf /bin/true /sbin/initctl
RUN mkdir /var/run/sshd
RUN useradd -m -d /home/ubuntu -p pfPLljOsvzRMQ ubuntu
RUN sed -Ei 's/adm:x:4:/ubuntu:x:4:ubuntu/' /etc/group
RUN adduser ubuntu sudo
RUN chsh -s /bin/bash ubuntu
EXPOSE 22
# USER ubuntu
ENV HOME /home/ubuntu
WORKDIR /home/ubuntu
CMD ["/usr/sbin/sshd", "-D"]
第32页
ssh -Yp49153 ubuntu@172.17.42.1
第33页
然后就可以在 Docker 沙箱中使用 Windows 程序了:
第34页
跨平台批处理技能 get√
第35页
图片尺寸批量对齐
第36页
#!/usr/bin/python2
from PIL import Image import inspect, os, posixpath, sys
thumb_size = 4096
def whereami(): if not hasattr(sys.modules[__name__], '__file__'): base = posixpath.dirname(inspect.getfile(inspect.currentframe())) else: base = posixpath.dirname(__file__) return posixpath.abspath(base)
def adjust(): base = whereami() imgobase = posixpath.join(base, 'img-out') imgibase = posixpath.join(base, 'img-in') imgs = os.listdir(imgibase) min_w = min_h = 1000000 for filename in imgs: imgi = Image.open(posixpath.join(imgibase, filename)) w, h = imgi.size if min_w > w: min_w = w if min_h > h: min_h = h if min_w > min_h: thumb_w = thumb_size thumb_h = int(float(min_h)/(float(min_w)/float(thumb_size))) else: thumb_h = thumb_size thumb_w = int(float(min_w)/(float(min_h)/float(thumb_size))) for filename in imgs: imgi = Image.open(posixpath.join(imgibase, filename)) w, h = imgi.size w1 = (w - min_w)/2 h1 = (h - min_h)/2 imgo = imgi.crop((w1, h1, w1 + min_w, h1 + min_h)) imgo.thumbnail((thumb_w, thumb_h)) imgo.save(posixpath.join(imgobase, filename))
if '__main__' == __name__: adjust()
base = whereami() imgobase = posixpath.join(base, 'img-out') imgibase = posixpath.join(base, 'img-in') imgs = os.listdir(imgibase) min_w = min_h = 1000000 for filename in imgs:
imgi = Image.open(posixpath.join(imgibase, filename)) w, h = imgi.size if min_w > w:
min_w = w if min_h > h:
min_h = h if min_w > min_h:
thumb_w = thumb_size thumb_h = int(float(min_h)/(float(min_w)/float(thumb_size))) else: thumb_h = thumb_size thumb_w = int(float(min_w)/(float(min_h)/float(thumb_size))) for filename in imgs: imgi = Image.open(posixpath.join(imgibase, filename)) w, h = imgi.size w1 = (w - min_w)/2 h1 = (h - min_h)/2 imgo = imgi.crop((w1, h1, w1 + min_w, h1 + min_h)) imgo.thumbnail((thumb_w, thumb_h)) imgo.save(posixpath.join(imgobase, filename))
第37页
分组多帧合成
尺寸对齐 & 缩小
HDR
第43页
1. 需要脚架、 B 门,将画面抖动降至最低。 2. 采样需要拍摄十几张乃至上百张照片,需要有一定耐心。
2. 手持拍摄成功率一般。
3. 无法拍摄人像(及运动物体)。
第44页
交错式曝光自动连拍相机
第45页
当按下拍照键以后,相机在一至数秒内以不同的 iso 及 ev 参数进行交替式快速连拍,实现对同一场景用不同曝 光参数完成分组大量采样:
● 基于 kivy 实现 ● 使用 jnius 调用系统原生 camera ● 使用 buildozer 打包成手机 app
第46页
技术原型
第47页
分组多帧合成
尺寸对齐 & 缩小
交替曝光自动连拍 app ( kivy )
前、后期一键成像
HDR
第48页
手持拍摄 ok√ 人像摄影 ok√ 延时摄影 ok√
第49页
谢谢观赏
沈崴
2015 年 9 月 12 、 13 日 于上海、广州 PyCon 大会