AirJD 焦点
AirJD

没有录音文件
00:00/00:00
加收藏

Python摄影指南-图片处理技巧

发布者 pyconf   简介 PyChina 大会
发布于 1454028765503  浏览 4368 关键词 Python 
分享到

第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 大会



支持文件格式:*.pdf
上传最后阶段需要进行在线转换,可能需要1~2分钟,请耐心等待。