ImageMagick 示例 —— 数码照片处理
- 提亮曝光不足的照片
-
分箱 - 降低数字噪点 (建设中)
-
轻微旋转校正 - 校正不太水平的照片
- 移轴效果 - 让风景看起来像人造模型
- PNG-JPEG 分层图像 - 在保持文字清晰的同时压缩页面
- 重叠照片 - 拼接照片的模糊重叠
- 双重曝光 - 混合同一场景的多张照片
- 保护他人隐私 - 模糊照片的某个部分
- 为图像添加纹理
- 色度键遮罩 - 按特定颜色的区域进行修改
- 儿童填色图
- 铅笔素描
- 暗角去除
ImageMagick 的主要用途之一,就是处理和修改用现代新型数码相机拍摄的照片。这些相机通常拍出相当大、高分辨率的照片,并在其中包含关于拍摄时间、比例、变焦、相机、方向等的元数据。甚至有计划将相机与手机联动,以便它能猜测你拍照时所在的位置,以及照片里可能有谁(根据它前面有哪些手机)。这里我们来看处理数码照片的基础,甚至将它们转换用于其他目的,例如艺术化的渲染。特别感谢数码相机用户 Walter Dnes,感谢他在增强数码照片方面的帮助。
数码相机元数据,EXIF 配置文件
数码相机拍照时,还会在 JPEG 保存文件中包含大量额外信息。这些元数据被称为 EXIF 配置文件,专门为照片冲印和显影而提供。用 ImageMagick 的「magick identify」配合「[-verbose](https://imagemagick.org/command-line-options/#verbose)」设置,可以显示这些 Exif 信息。以下是我在中国南方昆明动物园拍摄的宝塔照片的 EXIF 数据。
magick identify -format "%[EXIF:*]" pagoda_sm.jpg |\
sed 's/\(.\{46\}\).*/\1/' | column -c 110
| EXIF 数据,或者说 identify 的任何输出,都应以不区分大小写的方式处理。例如,许多较旧版本的 IM 会输出「EXIF:」(大写)而不是「exif:」(小写)。
---|---
以下是一个类似的例子,但使用 'globbing'(类似 shell 的)表达式,把输出限定为涉及 Time 的 EXIF 字段……
magick identify -format "%[exif:*time*]" pagoda_sm.jpg
此照片在 EXIF 配置文件中有很多信息。例如
- 我的相机是 Panasonic('
Make')的 DMC-LZ1('Model') - 相机被旋转过('
Orientation')。但我一定是在没有调整 EXIF 数据的情况下校正了那个旋转。相机还略微向上倾斜,但那个信息没有被记录。 - '
FocalLength' 为 '37mm表明我没有使用相机的“光学变焦”功能。我的相机最高可达 6 倍光学变焦,对应 'FocalLength' 为 '366/10',即 '222mm'。 - 而 '
DigitalZoomRatio' 表明我也没有进行数码变焦。 - 相机还使用了快速的 1/8 秒 '
ExposureTime',光圈 'MaxApertureValue' 为 3mm,即 'FNumber' 为 '5.6','ISOSpeedRating' 为 '64'。 - 闪光灯('
LightSource')没有被使用。 - 原始图像为 1728 × 2304 像素('
ExifImageLength' 与 'ExifImageWidth')。不过实际图像,如果你愿意检查的话,更小,所以我一定对它做了裁剪和/或调整尺寸。 - 而且可能最重要的是,根据 '
DateTime' 字符串,它拍摄于 2005 年 7 月 9 日 14:05 前后。这前提是我把相机的时间设置正确了(我确实设置了)。 - 更现代的相机甚至可能带有 GPS 位置,也许还有视角的罗盘方向!
此外还包含(但上面未列出)一张相机在自己显示屏上使用的小“缩略图”预览图像。还有一些功能,可以标记你希望由照片打印机“冲印”或打印的照片,并调整其他打印参数。不过大多数人很少用到这些。这些设置中有许多对用户很有用,但对人们最有用的一般是照片的日期和时间。这当然前提是拍照前相机上的日期和时间设置正确。另外,许多人关心图像的方向,以便显示时能正确旋转,而这正是我们接下来要看的内容。所有这些数据,尤其是预览图像,会在图像中占用相当多的空间。而且我或许并不真想让全世界都知道我 2005 年 7 月在中国昆明。因此,在真正把图像发布到万维网之前,你可能想从图像中移除 EXIF 数据。此外,数码相机的图像尺寸通常非常大(而且越来越大),能让你以照片品质打印,但对于 WWW 使用来说太大了,尤其不适合缩略图。因此,除非你希望用户真的能够打印照片品质的图像,否则我不会直接发布原始图像。例如上面的图像已为 IM 示例用途做了裁剪和调整尺寸,但为了示例我特意保留了 EXIF 数据不动。通常我会剥除这些信息。
数码照片方向
有人告诉我,Photoshop 会根据 EXIF 的 'Orientation' 设置自动旋转数码图像,IM 也可以做到,方法是在读入图像之后加上一个「[-auto-orient](https://imagemagick.org/command-line-options/#auto-orient)」运算符。不过,这一点很重要
JPEG 格式是有损的
这意味着,每当你解码并保存 JPEG 文件格式时,图像都会略微劣化。作为通用的图像处理器,IM 总是会完全解码并重新编码该格式,因此每当它重新保存图像时,都会劣化 JPEG 图像。关于 JPEG 格式性质的更多信息,参见 JPEG 图像文件格式。要点是:只有当你同时执行其他图像修改操作时,才使用 IM 来校正数码照片方向(使用「[-auto-orient](https://imagemagick.org/command-line-options/#auto-orient)」),例如 创建缩略图、为图像添加注释、添加水印,甚至 曝光调整。IM 可以使用 图像属性转义 从照片中提取当前方向(作为数字)…… | |
magick identify -format '%[exif:orientation]' pagoda_sm.jpg
![[IM Text]](../static/img/photos/orient_show.txt.gif)
IM 提供了一个特殊的「[-orient](https://imagemagick.org/command-line-options/#orient)」运算符(使用「[-list](https://imagemagick.org/command-line-options/#list) orientation」查看可能的取值)。 | |
magick pagoda_sm.jpg -orient bottom-right \
-format '%[exif:orientation]' info:
![[IM Text]](../static/img/photos/orient_setting.txt.gif)
这些元数据设置方法,让你可以调整已修改照片的方向,尤其是已经旋转过的照片。注意,方向正确的照片其方向为 'Top-Left',即 1。当然,如果你打算在后续图像处理中使用「[-auto-orient](https://imagemagick.org/command-line-options/#auto-orient)」,就不应移除 EXIF 元数据(使用「[-strip](https://imagemagick.org/command-line-options/#strip)」或「[-thumbnail](https://imagemagick.org/command-line-options/#thumbnail)」)。请在剥除图像元数据之前使用它。如果你确实想在不劣化或以其他方式修改图像的情况下校正照片方向,我建议你使用 JHead 程序。例如这里我校正照片方向,并删除某个目录中所有数码照片内置的预览缩略图。
jhead -autorot *.jpg
| _JPEG 无损旋转只有对尺寸能被 8 或 16 整除的图像才能正确工作。这对大多数(但并非全部)数码相机照片都成立。如果你用一张尺寸不是整除的图像来尝试,右边或下边的块(包含不完整尺寸的部分)在最终图像中将无法正确定位,因为这些块只能存在于右边或下边。
此示例参见这个具体讨论。_
---|---
JHead 程序还能让你调整照片日期(如果你的相机时间设置错误,或者你去了不同的时区)、提取/移除/替换预览缩略图、设置图像的注释字段、移除 photoshop 配置文件,以及做基本的图像裁剪(把那个走光的陌生人裁掉 ;-))等等,而不劣化 JPEG 图像数据。我推荐这个程序,或其他类似的程序(参见 其他 JPEG 处理程序),来修正这些信息。只要确保它不会真的对 JPEG 图像数据进行解码/重新编码即可。关于方向最后一点。如果你把相机几乎垂直朝上或朝下,EXIF 方向设置可能无法正确判定。斜角或倾斜的拍摄也一样。方向(以及相机)对这些情况根本没有感知。对于这类照片,你唯一的选择是使用较低层的无损「jpegtrans」、或 IM 的「[-rotate](https://imagemagick.org/command-line-options/#rotate)」自己进行旋转,然后要么重置 EXIF 方向设置(使用 JHead 或 IM 的「[-orient](https://imagemagick.org/command-line-options/#orient)」运算符),要么直接剥除 EXIF 配置文件。
其他 IM 有损修改……
如果你还在调整图像尺寸或以其他方式修改图像,例如为了网页使用而降低
其品质和尺寸,那么数据损失已经是既成事实。
因此,在那些操作过程中 IM 可以做类似的事情,让你在单个“载入-保存”
周期内完成所有所需的操作。
将所有图像旋转为横向 -rotate 90\<
纵向 -rotate -90\>
色彩改善
在继续之前,建议你先看一下 色彩修改,以了解将要用到的一般色彩修改技术。对高对比度的线条画和图形进行 归一化(使用「[-normalize](https://imagemagick.org/command-line-options/#normalize)」)效果可以很好。但归一化后的照片可能看起来不真实,而且,如前所述,也可能打印效果不佳。「[-contrast-stretch](https://imagemagick.org/command-line-options/#contrast-stretch)」运算符可以限制归一化的“边界”,而「[-levels](https://imagemagick.org/command-line-options/#levels)」和/或「[-sigmoidal-contrast](https://imagemagick.org/command-line-options/#sigmoidal-contrast)」运算符则能做出“更平滑”的调整(关于这些运算符具体作用的较低层讨论,参见 直方图调整)。上面的输入图像承蒙 IM 邮件列表的“Tong”提供。
提亮曝光不足的照片 由 Walter Dnes 贡献
有时候,可用的光线就是不够,无法获得合适的曝光。另一些时候,为了消除运动模糊,你可能不得不使用比最优更短的曝光时间。曝光不足的数码照片,可以通过使用「[-sigmoidal-contrast](https://imagemagick.org/command-line-options/#sigmoidal-contrast)」运算符并配合 '0%' 阈值水平,在不使高光溢出的情况下优先提亮较暗的区域。更多细节参见 S 形非线性对比度。以下是一个轻微曝光不足的例子,拍摄于日落后的一场免费音乐会。它有很多明亮照亮的区域,很清晰,但也有一些我想让它更明显的暗区。
magick night_club_orig.jpg -sigmoidal-contrast 4,0% night_club_fixed.jpg
| _与往常一样,中间工作应使用像 TIFF 或 PNG 这样的无损格式。这里使用 JPEG 格式,只是为了减少磁盘空间和网页发布的下载带宽。
选择图像可以看到示例实际使用的放大版本,而不是所显示的小缩略图。_
---|---
而以下是一个严重曝光不足的例子,这是我从阳台向南望向多伦多市拍摄的夜景。
magick night_scape_orig.jpg -sigmoidal-contrast 10,0% night_scape_fixed.jpg
主参数控制提亮的量。需要提亮得越多,使用的值就越高。而输出图像看起来也会越有颗粒感。这是因为较小的像素误差也被增强了。S 形对比度提亮往往会弱化光谱的红端。你最终可能不得不选择一个能产生最自然肤色的参数,而不是你真正想要的亮度水平。在严重曝光不足的情况下,提亮之后你最终得到的是一张被美化过的、有颗粒感的黑白图像。这是数字图像增强的物理限制。如果没有色彩数据存在,IM 不会替你生成它。现实中,我阳台右侧的砖是偏红的,下面的树是绿色的。
分箱 —— 降低数字噪点 由 Walter Dnes 贡献
许多严肃的摄影师对数码相机厂商的“百万像素竞赛”所带来的副作用感到不满。厂商通过把像素做得更小,在数码相机的传感器里塞进更多的百万像素。更小的像素在相同 ISO 设置下会产生噪点更多的画面,这迫使人们使用更低的 ISO 设置。用更低的 ISO 感光度来避免噪点,就需要更长的曝光时间。这反过来意味着,大多数消费级数码相机在室内、超出其内置闪光灯约 10 英尺的范围之外,实际上除了用三脚架拍摄静物之外几乎无用。许多数码相机用户很乐意用一些像素来换取更高 ISO 设置下噪点更少的画面,但控制着公司的营销人员拒绝把这当作一个选项来考虑。幸运的是,这种取舍可以在数码照片上事后完成。技术术语叫做“分箱”(binning)。简化的理论是这样的……
- 取一个 n×n 的像素网格,对它们的分量求平均,得到一个“超级像素”。
- 信号与合并后的像素面积成正比,这意味着信号量增加了 n^2 倍
- 噪点是随机的。这意味着它与合并后像素面积的平方根成正比,即 n 倍。最终结果是 SNR(信噪比)提高了 n 倍。更多细节参见 摄影术语表,分箱。
| 当一张 1600x1200 的数码照片被分箱缩减到 800x600(即 2x2 网格)时,信噪比翻倍。同样,一张 2560x1920 的照片以 3x3 分箱到 853x640 像素,信噪比会提高 3 倍。 | 为了利用分箱,照片图像必须是最终所需尺寸的整数倍。 |
|---|---|
在 ImageMagick 中,当你对图像执行「[-resize](https://imagemagick.org/command-line-options/#resize)」时,特殊的「[-filter](https://imagemagick.org/command-line-options/#filter)」设置 'box' 会把成组的像素平均缩减为单个像素(详见 重采样滤镜)。这意味着要做“分箱”,你只需正确地调整图像尺寸即可。 |
建设中
Walter Dnes 还提供了原始脚本 binn 来执行计算、对图像做最小限度的裁剪并执行“分箱”。分箱示例 3分箱示例 4
照片转换手册
轻微旋转校正 -- 让照片更水平
典型情况。你拍了一张照片,但图像不水平,你想校正它。
例如,这是我 2008 年在北京、从紫禁城正后方的景山公园山上用手持相机拍的一张照片。不,它拍的不是紫禁城本身,而是山另一侧的一座庙宇。点击缩略图可查看更大的图像。 是的,这张图像很小,你应当把解决方案应用到原始图像而不是小缩略图上,但对任何图像来说技术都是一样的。在这个例子里,需要把图像旋转 -1.8 度来校正它。现在,如果你只是简单地旋转图像,会得到一张略大的图像,四角带有色块,使校正看起来很明显、很难看。 |
magick beijing_tn.png -rotate -1.95 beijing_rotate.png
即使你把图像裁剪回原始尺寸,如 简单图像旋转 中所演示的那样,你仍然会得到一些带色的角。 ![[IM Output]](../static/img/photos/beijing_rotate.png)
最简单的解决方案是现在裁剪那个结果以移除这些边框,但这样你的图像就会变成一个相当奇怪的尺寸,这又相当明显地表明动过手脚了。虽然做那种裁剪的公式并不简单,不过它在 扭曲旋转方法 中有演示。更好的解决方案是不仅旋转图像,还稍微缩放它,从而产生一张与原图相同尺寸的旋转图像。 |
angle=-1.95
magick beijing_tn.png -distort SRT \
"%[fx:aa=$angle*pi/180;(w*abs(sin(aa))+h*abs(cos(aa)))/min(w,h)], $angle" \
beijing_rot_correction.png
![[IM Output]](../static/img/photos/beijing_rot_correction.png)
现在图像看起来很干净,墙壁完全水平。角度计算是相当直接的三角学,使用图像中一条长直线两端的像素位置。不过我发现,只要用各种小角度反复试错地旋转图像,就能相对快速地找到一个好的旋转角度。评估某个角度好不好时,把你所用的线或边缘上的像素放得很大来仔细看。在这张照片里就是墙的顶部。还要记住,在图像旋转中,向左或逆时针的旋转是负值(因为 Y 轴指向下方)。另外要记住,如果可能的话,始终把操作应用到原始图像上,避免使用中间图像(尤其是中间的 JPEG 图像)。任何照片修改,从原始源开始应用,总比从任何保存的中间副本开始要好。
移轴效果 -- 让风景看起来像人造模型
“移轴”是一种让图像上部和下部变模糊、而让图像中央保持清晰的技术。它最初是在非常古老的蛇腹式相机上实现的,通过倾斜镜头使图像的上部和下部脱离焦点。得益于 ImageMagick 在 v6.5.4-0 中加入的 可变模糊映射,现在这很容易做到。如果你在此基础上再加上非常高的对比度以增强阴影,并使颜色饱和,一个典型的结果是,普通图像可以被做得看起来很人造。几乎就像你在拍一个小巧、非常精细、被明亮照亮的模型。
我们首先需要做的,是增强图像中的颜色以赋予它非常高的对比度,或许再把它稍微提亮一点,让它看起来像被强烈的摄影棚灯光照得很亮。 |
magick beijing_md.jpg -sigmoidal-contrast 15x30% beijing_contrast.jpg
![[IM Output]](../static/img/photos/beijing_contrast_tn.gif)
注意我如何使用了一个强烈的 S 形对比度操作 来实现这些色彩效果。我没有只是简单地使用线性对比度,因为我不想“裁剪”图像中最亮和最暗的颜色。对比度值 '15' 是非常非常强的对比度。我还通过把对比度阈值的中心偏移到 '30%' 灰度值,把图像稍微提亮了一点。如果对比度增强后的图像颜色不够卡通化,你也许想试试用 调制运算符 提高图像的色彩饱和度。这张图像不需要这样做,因为瓦屋顶和明亮的绿树已经提供了足够的色彩效果。如果你看图像的放大版(点击缩略图),你会发现即便只是增强颜色,也给图像带来了人工照明的感觉,尽管它看起来不像模型,因为背景中的汽车和前景中的人物细节太多了。现在来做移轴。为此我们准备一张渐变图像,顶部和底部为白色,中间为黑色。有些人可能会用线性渐变来做这个,但我发现抛物线渐变更好。 |
magick beijing_contrast.jpg \
-sparse-color Barycentric '0,0 black 0,%h white' \
-function polynomial 4,-4,1 beijing_blurmap.jpg
![[IM Output]](../static/img/photos/beijing_blurmap_tn.gif)
注意,我用原始图像本身配合两点 重心坐标稀疏着色 在整张图像上生成了一个线性渐变。然后用一个基本的 多项式函数 修改该线性渐变,使其成为中间为黑色的抛物线渐变。现在只需根据模糊映射对图像进行模糊,就能制造出“移轴”效果。结果是原始图像看起来相当像一个缩尺模型,而不是对真实事物的随手快拍。
magick beijing_contrast.jpg beijing_blurmap.jpg \
-compose Blur -set option:compose:args 10 -composite \
beijing_model.jpg
正如你在最终图像中所见,由于颜色强烈,树木和建筑看起来非常人造,而近处和远处部分的模糊则赋予图像一种“小巧”的模型般的感觉。不过这一定是一个非常精细的模型!作为移轴处理的一部分执行一次 旋转校正(见前文),本可以让结果进一步改善。完美的相机方向只会增添这种人造感。当然,你可以把所有这些操作串联起来,在单条命令中全部完成,避免临时文件或品质损失。
magick beijing_md.jpg -sigmoidal-contrast 15x30% \
\( +clone -sparse-color Barycentric '0,0 black 0,%h gray80' \
-solarize 50% -level 50%,0 \) \
-compose Blur -set option:compose:args 10 -composite \
beijing_model.jpg
在上面,我把抛物线渐变替换成了一个更传统的线性黑-白-灰渐变(斜率相同),用作“移轴”模糊映射。使用了 曝光过度与色阶(Solarize & Level) 技术,让线性渐变的峰值大约在图像底部往上 1/3 处水平出现。不过我发现线性渐变中焦点区域太小,不太实用。生成适合移轴效果的渐变还有很多其他方法。例如使用 调整尺寸后的渐变。或者对单列像素的 Shepards 稀疏颜色 进行水平缩放。正弦曲线渐变也可能有用。
速度优化
可变模糊映射 操作本质上使用的是单趟的二维模糊方法(等价于均匀的高斯模糊)。不过,你可以把模糊操作分成两次一维可变模糊操作,从而获得整体的速度提升。例如,这里我先水平模糊,再垂直模糊……
magick beijing_md.jpg -sigmoidal-contrast 15x30% \
\( +clone -sparse-color Barycentric '0,0 black 0,%h gray80' \
-solarize 50% -level 50%,0 -write mpr:blur_map \) \
-compose Blur -set option:compose:args 10x0 -composite \
mpr:blur_map \
-compose Blur -set option:compose:args 0x10 -composite \
beijing_model_2pass.jpg
结果实际上几乎相同(虽然确实有些差异),但处理起来快得多。旁注:我认为交换这两个操作(先垂直模糊再水平模糊)会为这类模糊映射产生更精确的结果。基本上是因为水平模糊在其模糊趟的方向上是常数,所以应该最后进行。
移轴效果与真实模型的问题
如果你仔细检查所得的照片,你会看出它是一个假的移轴,而不是真实模型的照片。你可以从这一点看出来:与较大建筑的底部相比,它的屋顶太模糊了。尽管它与底部的距离大致相同。同样,“墙”的底部比墙的顶部更模糊。也就是说,可以看出它是假的。问题在于,大型垂直物体应当在整个表面上以相同的量被模糊,而不是仅仅按高度可变地模糊。记住,模糊渐变意在表示焦深,即图像中各物体的距离,因此一个垂直物体的表面都应是相同的“距离”,从而以相同的量被模糊。要修正,我需要调整模糊渐变,使那些区域相对于图像其余部分,具有该物体“底部”那种恒定(或近乎恒定)的颜色。也就是说,垂直表面具有恒定的模糊量,而所有水平表面则具有模糊渐变。基本上,模糊渐变应当表示图像中每个点的实际“深度”,对大多数图像而言这是一个非常复杂的渐变。这种调整可能很难实现,因为它很可能需要人为解读什么是水平的墙、物体在图像中有多远。它也不太可能轻易自动化。你能用这种效果做什么?把你的移轴图像发邮件给我!我会在这里引用它们。或者,也许你能修正上面例子中的移轴缺陷。
PNG-JPEG 分层图像
把一大张报纸或杂志页面分离成保存为 PNG 的文字层,和保存为 JPG 的图像层,两者都只使用白色背景,就有可能比两张图像合在一起占用少得多的磁盘空间!更重要的是,图像可以使用有损压缩(JPEG),而文字部分则保持锐利清晰(PNG)。这听起来又蠢又怪,但实际上是真的。分离后的图像可以节省单张合并图像所占磁盘空间的 3 到 4 倍。通常这两张图像是在出版过程中作为独立的图层生成的。但你也可以事后再分离图像。图像只是被叠加在一起……
magick ny_family.jpg ny_family.png -composite ny_family_merged.jpg
这使用普通的 Over 合成,它要求 PNG(叠加)图像是透明的。这种透明度有两种形式。要么是布尔(纯粹开/关)遮罩,如上面所见。欢迎提供图像分离的示例代码。
重叠照片 -- 拼接照片的模糊重叠
创建一系列重叠的照片(我指的不是全景)是一项常见的任务,尤其是在网站制作中。但除非你对 IM 运算符有正确的了解,否则做起来可能很棘手。最简单的方法是使用两张图像的 遮罩合成,再用一张遮罩来选择叠加哪张图像。不过,你首先需要做些简单的数学。在这个例子中,我使用两张尺寸为 120x90 像素的缩略图,想让它们在水平方向上重叠 40 像素。这意味着所得图像的宽度应为 120 + 120 - 40 像素,即一张 200x90 像素的图像。接下来我们需要一张遮罩。它需要一侧为黑、另一侧为白,中间有一段 40 像素的渐变,尺寸为最终输出图像的大小。也就是说,120 像素 - 40 像素,为两个不重叠区域各留出 80 像素的区域。那么让我们生成一张遮罩图像…… |
magick -size 90x80 xc:white xc:black -size 90x40 gradient: \
+swap -append -rotate 90 overlap_mask.png
![[IM Output]](../static/img/photos/overlap_mask.png)
生成遮罩图像的另一种方法是使用 Fred Weinhaus 的「[plmlut](http://www.fmwconcepts.com/imagemagick/plmlut/index.php)」水平渐变生成脚本。相比我上面生成的急剧线性渐变,它对渐变曲率有更精细的控制。现在数学都处理完了,剩下的就是用我们刚生成的遮罩做一次三图像遮罩合成。不过,我们还需要放大目标(左侧)图像,以便为重叠的右侧图像(任意颜色)提供足够的空间,并使用适当的 gravity(右,即 'East')正确定位第二张图像。
magick holocaust_tn.gif -extent 200x90 spiral_stairs_tn.gif \
overlap_mask.png -gravity East -composite overlap_photos.jpg
现在我们有了两张用线性渐变重叠起来的图像。当然,这两条命令可以合并为一条命令,这样你就不需要保存“遮罩”这个中间图像了。这留作读者的练习。一个小改进是在图像之间更大的重叠范围上使用更弯曲的渐变。这能减少最终图像重叠区域起始和结束处可见的急剧变化。尤其是对于含有大片截然不同颜色区域的图像。例如,这里使用了一些 扭曲渐变 技术,不仅生成更平滑的渐变曲线,还旋转该渐变,从而形成高度倾斜的重叠。 |
magick -page +0-15 -size 1x30 gradient: \
-sigmoidal-contrast 5,50% -contrast-stretch 0 \
-set option:distort:viewport 180x90-90-45 \
+distort SRT 115 +repage \
holocaust_tn.gif -extent 180x90 +swap \
spiral_stairs_tn.gif +swap \
-gravity East -composite overlap_angled.jpg
![[IM Output]](../static/img/photos/overlap_angled.jpg)
是的,上面这个相当复杂,但它展示了究竟能做到什么。如果你打算处理两张以上的图像,更好的方法是用遮罩直接设置第二张及之后各图像的透明度。然后可以用 分层图像示例 中所见的技术把多张图像叠加在一起。这些技术中有些不需要你计算最终图像尺寸,因为 IM 可以替你完成。你只需确保正确定位各图像即可。例如,这里我给第二和第三张图像各加了一段 30 像素的渐变,要求各图像彼此每隔 90 像素(宽度 120 减去 30 像素重叠)放置一张。当所有图像都被赋予适当的透明度和位置后,我们只需把这些图层 Mosaic(马赛克拼合) 在一起(所有偏移都是正的),让 IM 算出最终的画布尺寸。
magick -size 90x90 xc:white -size 90x30 gradient: -append -rotate 90 \
hatching_tn.gif \
\( chinese_chess_tn.gif -clone 0 \
-compose CopyOpacity -alpha off -composite -repage +90+0 \) \
\( holocaust_tn.gif -clone 0 \
-compose CopyOpacity -alpha off -composite -repage +180+0 \) \
\( spiral_stairs_tn.gif -clone 0 \
-compose CopyOpacity -alpha off -composite -repage +270+0 \) \
-delete 0 -compose Over -mosaic overlap_series.jpg
与其预先计算重叠遮罩图像的位置,你可以使用 连接重叠 中的技术,以及针对更长图像序列的 增量计算位置。最后的说明: 这样的照片重叠,对于整体颜色相当一致的图像效果最好。另外你可能会注意到,对于序列两端的图像,由于只在图像的一侧发生重叠,居中的主体看起来可能不太居中。这个问题可以通过把这些图像的外侧边缘淡化为透明,或切掉部分外侧边缘来帮助让这些图像的主体重新居中,从而得到改善。旁注:也许在不同的色彩空间中进行合成会效果更好。有谁愿意实验一下,并报告你的结果,无论好坏?
双重曝光 -- 混合同一场景的多张照片
在过去的胶片相机上,有一种技术是在不“卷动”胶片的情况下拍两次或更多次。这让你能创造出所谓的双重曝光,把在略微不同时刻拍下的两张图像合并在一起。结果往往是图像中移动或变化的部分出现重影或变暗。不过,通过对图像中的被摄体、照明效果、乃至显影过程的细心控制,就有可能做出一些非常怪异、甚至“不可能”的照片。对数码图像来说更容易,因为你对图像有更好的控制。基本上…… 眼见或许为实,但相机会撒谎! 例如,假设我想要一张自己出现两次的图像!这很容易做到。例如这里是我专为这个例子、用三脚架和定时器随手拍的两张照片的缩略图,我将直接使用它们。
我将把双重曝光技术直接应用到这些缩略图上,不过更典型的做法是用原始图像文件作为输入,以获得最高品质的结果。现在,如果我用旧式相机做传统的、类似胶片的“双重曝光”,结果会是这两张图像的平均,生成我自己透明的“重影”。以下是这种技术的数字模拟…… |
magick anthony_1.jpg anthony_2.jpg -evaluate-sequence mean anthony_ghosts.jpg
![[IM Output]](../static/img/photos/anthony_ghosts.jpg)
然而,如果我不想要重影,而是想要我自己正常实体的图像呢。那么你就需要用一张遮罩来选择哪些部分你想取自哪张图像。这张遮罩可以用两种方法生成。你可以只是沿着静态或不变的部分划分图像,手动创建遮罩。在这个特定情形下这相当简单…… |
magick -size 100x90 xc: -draw 'rectangle 0,0 50,89' \
-blur 0x3 anthony_mask.jpg
![[IM Output]](../static/img/photos/anthony_mask.jpg)
注意我对遮罩做了模糊,以便“羽化”两张图像之间的切换。而这里我使用 遮罩合成 来合并图像。 |
magick anthony_1.jpg anthony_2.jpg anthony_mask.jpg \
-composite anthony_doubled.jpg
![[IM Output]](../static/img/photos/anthony_doubled.jpg)
如果你有两张(或更多)家庭合影,其中有些人闭着眼、在说话、做鬼脸,或只是望向别处。你可以从不同图像中挑选每个“头”,把多张图像合并成一张蒙太奇,从而得到一张所有人都望向相机、并且睁着眼的照片。通过交换输入图像,或只是把遮罩反相,你可以把我从图像中完全去掉,从而得到静态背景不受遮挡的视野。 |
magick anthony_2.jpg anthony_1.jpg anthony_mask.jpg \
-composite anthony_removed.jpg
![[IM Output]](../static/img/photos/anthony_removed.jpg)
在拍摄公共纪念碑、又负担不起人群管控费用时,这会很方便。只要用三脚架拍大量、大量的照片,运气好的话你就能把它们组合起来,从场景中去掉所有人!当你有几百张图像(视频)时,生成背景图像的另一种替代做法是,只创建所有图像的平均。这会把所有人或其他一时的物体变成一层淡淡的“重影”雾。这本身可以是一种有趣的效果,但并不总是所需要的。平均图像可以是一个有用的步骤,因为一旦得到它,你就可以把它与每一张单独的图像对比,从每一帧中把人(一时的物体)遮罩掉,然后再把背景组合在一起,创建一张干净(无雾)的背景图像。关于从视频图像自动生成“干净背景”的一个重要讨论,在 IM 讨论论坛的 创建参考图像 和 提取变化事件 中。
有了一张干净的背景照片,我们就可以对差分图像做阈值处理,把图像中发生变化的部分遮罩掉。你可能需要再做一些模糊和阈值处理,把该遮罩适当地扩大,不仅覆盖图像中的物体,还覆盖它可能在背景景物上投下的任何阴影或反射。要做对,可能也需要一点试错。 |
magick anthony_removed.jpg anthony_2.jpg \
-compose difference -composite \
-threshold 5% -blur 0x3 -threshold 20% -blur 0x3 \
anthony_automask.jpg
![[IM Output]](../static/img/photos/anthony_automask.jpg)
现在让我们用这张遮罩,把我的“重影”图像和原始图像混合起来,让它看起来像是我的良心因为我做了这种“不可能”的照片而在“纠缠”我。 |
magick anthony_1.jpg anthony_ghosts.jpg anthony_mask.jpg \
-composite anthony_haunted.jpg
![[IM Output]](../static/img/photos/anthony_haunted.jpg)
作为最后一点,上面所有技术都假设照片是用牢牢固定在静止三脚架上的相机拍摄的。如果情况并非如此,而只是手持位置拍摄的,我可以保证,无论你多么努力,图像都不会正确地对上或“对齐”。在这种情况下,你可能需要对两张图像中至少一张做一些 仿射 变形、甚至 透视 变形,才能让背景正确对齐。背景越复杂,所需的重新对齐就越精确。如果使用了闪光灯,或者当天多云、光线多变,你可能还需要对照片做一些亮度调整。原因在于,大多数相机会“自动调整”图像的亮度,而闪光灯或多变的光线会改变它对每一张图像的“自动色阶”调整的处理。作为最后一个例子,这里是我用两张各自独立的照片创作的另一张图像,画的是我侄子在攀岩墙前与自己击剑。由于我手持相机并使用了闪光灯,我确实需要做一些仿射变形调整以及轻微的亮度调整,才能得到你所看到的天衣无缝的结果。
如果你想判断这张照片是不是假的,你会看照明、阴影和反射。在上图中,仔细检查地板会发现,右边的“Jacob”在地板上没有正确的反射(它被照片边缘裁掉了)。但你真的需要好好研究这张照片才能注意到这一点!现在想想你能把这种“双重曝光”技术用在什么地方。例如来点 哈哈镜 怎么样。把你的结果发邮件给我!如果你想更深入地研究这个,研究论文 「交互式数字照片蒙太奇」 深入探讨了使用“双重曝光”(或如它所称的“照片蒙太奇”),但利用了用“图像分割”扩展的用户选择,来选择图像的哪些部分取自何处。一个例子是,如果你有很多张一大群人的照片,每张照片里都有某个人“没拍好”。你可以用这种技术来选择哪个人取自哪张图像,从而得到一张完美的合影,其中每个人都:面朝前方、睁着眼、微笑着!
保护他人隐私 -- 模糊照片的某个部分
上面使用 3 图像合成遮罩的技术也可以用于其他方面。例如,你可以把图像“像素化”,然后用一张遮罩把效果限制在某人的脸上,从而“保护他们的身份”。
magick zelda_tn.gif -scale 25% -scale 400% zelda_pixelate.gif
magick zelda_tn.gif -gamma 0 -fill white \
-draw 'circle 65,53 50,40' zelda_face_mask.gif
magick zelda_tn.gif zelda_pixelate.gif zelda_face_mask.gif \
-composite zelda_anonymity.png
当然,你可以一次性完成所有这些,甚至让从像素化到正常的变化变得平滑。例如…… |
magick zelda_tn.gif \( +clone -scale 25% -scale 400% \) \
\( +clone -gamma 0 -fill white \
-draw 'circle 65,53 50,40' -blur 10x4 \) \
-composite zelda_anonymity.jpg
![[IM Output]](../static/img/photos/zelda_anonymity.jpg)
当然,与其把有问题的部分像素化,你也可以改为模糊该区域。只需把两个「[-scale](https://imagemagick.org/command-line-options/#scale)」运算符替换成单个「[-blur](https://imagemagick.org/command-line-options/#blur)」,把细节糊掉即可。这种替换遮罩区域的技术,也可以用来从图像中移除不需要的文字和标志。详情参见 孔洞填充。
为图像添加纹理
Hardlight(强光) alpha 合成法,甚至各种 照明合成法 中的任意一种,都提供了给图像添加纹理图案的方法。例如,这里我给一张我在中国南方昆明动物园拍的宝塔照片添加一层粗布纹理。
magick tile_fabric.gif -colorspace gray -normalize \
-fill gray50 +level 35% texture_fabric.gif
magick composite texture_fabric.gif pagoda_sm.jpg \
-tile -compose Hardlight photo_texture.jpg
注意,如果你想真正地把纹理 平铺 到图像上,你需要使用「magick composite」命令,而不是更通用的「magick」命令,尽管还有若干用 convert 来 在内存中平铺图像 的其他方法。还要注意,像这样添加纹理时,原照片中较小的细节可能会被叠加纹理的过多噪点淹没,纹理应当保持简单,或者把它的效果适当地节制,例如上面用到的 降对比色阶调整。要把一个图像图案用作纹理,应对它进行修改,使得原图像中不变的区域使用完全的灰色。也就是说,图像的平均颜色应约为 50% 灰。在这个例子里,我演示了一种几乎可以对任何可平铺图像使用的做法,尽管这种具体方法未必总能奏效。这类纹理在网上到处都能找到,作为网页的各种背景图案。它们甚至可能看起来不像纹理、可能色彩缤纷、也可能很亮或很暗。不过经过调整后,你会发现能得到一些非常有趣的效果。就像我们之前做的那样,你可以通过创建一张适当的遮罩来限制图像的哪些部分真正被加上纹理。例如,让我们只为宝塔照片中接近“白色”的天空创建一张遮罩。
magick pagoda_sm.jpg -fuzz 10% -transparent white \
-alpha extract -negate pagoda_mask.png
magick pagoda_sm.jpg photo_texture.jpg pagoda_mask.png \
-composite photo_texture_masked.jpg
现在想象一张穿着连衣裙的女士的照片。你可以取任意图案、适当地为它加上明暗,然后把它叠加到原图像上,从而把裙子替换成完全不同的设计。当然,为达到最终结果,上面的做法有很多变体,具体用哪种技术取决于你,但基本思路是一样的。给图像加纹理,遮罩,然后叠加结果。顺带一提,我还建议你看看 Overlay(叠加) alpha 合成法,它其实和 Hard_Light(强光) 合成相同,只是把两张图像交换了位置。还有很多其他 明暗合成法,可以用各种方式给图像加纹理。
色度键遮罩 -- 按特定颜色的区域进行修改
左边这张照片是某位用户在一次 IM 论坛讨论 中给出的。他想改变女孩衬衫的颜色,那是一种漂亮的“粉色”。问题在于,这颜色不只是“粉色”,而是一整片不同深浅的“粉色”。正如你在上面所见,要对图像进行修改,第一步通常是为你感兴趣的区域生成一张合适的遮罩。这里我将使用一种叫做 色度键 的技术来为那种特定颜色生成遮罩。这种技术一般在图像中寻找一种特定颜色用作遮罩。它也是电视和电影中大量使用的“蓝”幕和“绿”幕效果所用的技术。
这基本上包括通过 分离通道图像 来提取“色相(Hue)”,然后查找想要的“色相深浅”。例如……
|
magick shirt.jpg -colorspace HSL -channel Hue -separate shirt_hue.jpg
然而这张色相图像有几个问题。
- 首先,“粉色”非常接近“红色”,而红色正处在色相“翻转”的分界处。为确保这不成问题,我使用 Modulate(调制) 把色相调离色相中的那个“不连续处”。对于为“绿”幕或“蓝”幕提取“色度键”来说,这不是问题。
- 这种“粉色”也不是高度饱和的颜色,而是饱和度值很低。这意味着它的“色相”没有本应有的那么强。
- 另一个问题是灰色背景!!!!!灰色几乎没有色相,所以我需要从最终遮罩中移除任何饱和度很低或没有饱和度的区域,否则我会改动背景中的东西。注意,从技术上讲,如果我把改动限制在色相翻转上,这并不需要,因为色相翻转不影响不饱和的颜色。
简而言之,如果输入图像用的是更明亮、更强烈、而且不那么接近皮肤(或头发)颜色的颜色,效果会更好。例如一件强烈的蓝色或绿色衬衫。但我只能用手上现有的素材。 ![[IM Output]](../static/img/photos/shirt_hue.jpg)
那么让我们提取并合并这两张通道遮罩。注意,用调制把图像色相“翻转”之后,色相 = Gray64,而灰色背景的饱和处 = 黑色。 |
magick shirt.jpg -modulate 100,100,33.3 -colorspace HSL \
-channel Hue,Saturation -separate +channel \
\( -clone 0 -background none -fuzz 5% +transparent grey64 \) \
\( -clone 1 -background none -fuzz 10% -transparent black \) \
-delete 0,1 -alpha extract -compose multiply -composite \
shirt_mask.png
这样只剩下一些孤立的小“斑点”,可以用一些 形态学平滑(-morphology Smooth Square)去除。它并不完美,但能完成任务。更好的办法是手动编辑遮罩把它清理干净。现在,一张遮罩可以配合 合成遮罩 使用,就像我们在上面 双重曝光 和 匿名 例子中所做的那样。不过,如果你用一张遮罩去修改一张已有的图像(不做扭曲,也不改变图像尺寸),那么用它来定义哪些区域不可写会更容易。这些被称为 裁剪遮罩或写入遮罩(参见「[-mask](https://imagemagick.org/command-line-options/#-mask)」 ![[IM Output]](../static/img/photos/shirt_mask.png)
这里我清理掉前一张遮罩的小瑕疵(可选),并把它反相,以定义我想“写保护”的区域。然后我设置这张遮罩,移动色相把“粉色”变成“浅蓝色”,并保存所得图像。 |
magick shirt_mask.png -morphology Smooth Square \
-negate shirt_write_mask.png
magick shirt.jpg -mask shirt_write_mask.png \
-modulate 100,100,25 +mask shirt_blue.jpg
是的,有一圈轻微的“粉色”边缘,尤其在袖子内侧。此外她手臂上一小块皮肤变成了相当深的蓝色。基本上这些是遮罩的瑕疵,只要在完善遮罩上再多下点功夫,你就能修正这些问题。但结果不算差。生成更好遮罩的一种方法是使用一张大得多、分辨率更高的图像。当所得图像随后被调整尺寸时,这些小瑕疵(但愿)也会被缩减到微不足道。 ![[IM Output]](../static/img/photos/shirt_blue.jpg)
这个具体例子真正的问题在于,“键控色”与正常的皮肤颜色如此接近,你简直就是在自找麻烦!这就是为什么使用这种技术的人会用“绿”幕和“蓝”幕,因为这些颜色与幕前人物的“皮肤”颜色尽可能地不同。注意,最好不要用 JPEG 作为你的源图像或工作图像。JPEG 真的应该只用于你的最终图像!这也是一开始产生这么多“遮罩瑕疵”的部分原因。
绿幕
_未来的示例,使用对“绿幕背景”的色度键遮罩。扩展自维基百科文章 色度键
“绿幕”处理中真正的问题是“色溢出”,细软的浅色头发(金发)和半透明区域会产生最严重的色溢出效果。
简单的色溢出去除(颜色修正)_
g(r,g,b) => (r, min(g, b), b)
Alpha 判定……
a(r,b,g) => K0 * b − K1 * g + K2
_所有 K 系数都用 1.0 是一个不错的初始猜测。
由于背景颜色是已知的,而且一旦知道了“alpha”,你就可以使用 用两个背景去除背景 中所示的技术,比第一个颜色公式更好地去除可能存在的任何“绿幕光晕”。
图像的艺术家炭笔素描
炭笔素描变换 为用户提供了一种非常简单的方法,来生成图像的简化灰度渲染。它对“繁杂的图像”效果不好,但对较简单的图像,它能产生非常醒目的结果。
magick holocaust_sm.jpg -charcoal 5 charcoal.gif
儿童填色轮廓图
在 IM 用户论坛关于 生成填色页 的一次长时间讨论中,开发出了下面这份手册配方,用 magick 把一张简单的照片变成孩子们可以填色的东西。这是我们迄今为止最好的结果,应用于我拍的柏林大屠杀纪念碑的一张照片。
magick holocaust_sm.jpg \
-edge 1 -negate -normalize \
-colorspace Gray -blur 0x.5 -contrast-stretch 0x50% \
color-in.gif
# For heavily shaded pictures...
# #-segment 1x1 +dither -colors 2 -edge 1 -negate -normalize \
上面最后那些操作试图平滑线条并改善整体结果。当然,上面的技术只对颜色变化清晰锐利的图像有用,而且最好是比我上面所用分辨率更高的图像。对于已经带有黑色轮廓、背景为浅色的卡通图像,用上面的方法配合 边缘检测 会直接对黑色轮廓产生一种“成双”效果。你可以在左下角、通往纪念碑的小径上瓷砖成双的线条中看到这种效果。这是 边缘检测 工作方式所带来的一个假象,你可以在 IM 示例的那一节看到更多这样的例子。解决办法是在使用「[-edge](https://imagemagick.org/command-line-options/#edge)」勾勒有色区域的轮廓之前,先把这类图像反相。
magick piglet.gif -background white -flatten \
-colorspace Gray -negate -edge 1 -negate -normalize \
-threshold 50% -despeckle \
-blur 0x.5 -contrast-stretch 0x50% \
color-in_cartoon.gif
我还用了「[-threshold](https://imagemagick.org/command-line-options/#threshold)」,以便随后去除「[-edge](https://imagemagick.org/command-line-options/#edge)」似乎喜欢生成的一个个点。之后我再次尝试平滑图像中的锯齿线条。在关于 GIMP 复印滤镜 的一次讨论中,上面的做法得到了补充,利用了 Compose Divide(相除合成) 方法来查找轮廓。
magick taj_mahal_sm.png -colorspace gray \
\( +clone -blur 0x2 \) +swap -compose divide -composite \
-linear-stretch 5%x0% photocopy.png
上面的「[-linear-stretch](https://imagemagick.org/command-line-options/#linear-stretch)」操作调整图像暗区会有多黑,而「[-blur](https://imagemagick.org/command-line-options/#blur)」的 'sigma' 则定义明暗的锐利程度。
铅笔素描
来自 IM 用户论坛 的 dognose,借助一篇关于把图像转换成 铅笔素描 的 Photoshop(PSP)教程,成功创建了等效的 ImageMagick 命令。以下是他的转换,简化成了几条 IM 命令,让你能够批量把大量图像处理成“艺术家铅笔素描”的形式。首先我们需要一张特殊的「pencil.gif」图像。这可能要花很长时间,所以在这个例子里我把它做得小了一些,同时保留它能在更大图像上平铺的能力。这些技术的细节参见 修改平铺图像。这只需做一次,之后就可以重复使用。因此你可以为自己的用途生成一张大得多的,以避免任何平铺痕迹。理想情况下把它做得和你打算转换的图像一样大。 |
magick -size 256x256 xc: +noise Random -virtual-pixel tile \
-motion-blur 0x20+135 -charcoal 1 -resize 50% pencil_tile.gif
![[IM Output]](../static/img/photos/pencil_tile.gif)
现在只需把这张“铅笔”明暗图像与一张照片叠加并混合即可。铅笔图像被平铺成与我们正在处理的图像相同大小的画布。然后用 平铺画布 中的技术把它应用到图像上。这之后再合并进原始图像的灰度副本中。
magick pagoda_sm.jpg -colorspace gray \
\( +clone -tile pencil_tile.gif -draw "color 0,0 reset" \
+clone +swap -compose color_dodge -composite \) \
-fx 'u*.2+v*.8' sketch.gif
注意,由于「[composite](basics.html#composite)」命令的「[-blend](https://imagemagick.org/command-line-options/#blend)」运算符对「magick」命令不可用,我选择用手工的「[-fx](https://imagemagick.org/command-line-options/#fx)」运算符来做等效的操作。也许有更好、更快但更复杂的做法。(欢迎提出建议)这不是最终版本,因为该运算符缺少一些边缘增强,而这对于勾勒图像中某些更浅但很锐利的颜色变化是需要的。你能改进上面的做法吗?上面的算法已作为一种艺术变换「[-sketch](https://imagemagick.org/command-line-options/#sketch)」内置到 IM 中,不过没有对生成的“铅笔平铺”做「[-resize](https://imagemagick.org/command-line-options/#resize)」平滑……
magick pagoda_sm.jpg -colorspace gray -sketch 0x20+120 sketch_new.gif
暗角去除 拍照时(无论数码与否),相机镜头通常会使图像的边缘和四角变暗。这被称为“暗角(vignetting)”。事实上这种镜头效果非常常见,以至于人们常常故意用「[-vignette](https://imagemagick.org/command-line-options/#vignette)」运算符来伪造它。参见 暗角变换。Martin Herrmann Martin-Herrmann@gmx.de 想从照片中去除相机的暗角。基本上,他在明亮的光线下、不用闪光灯拍了一张白纸的照片。然后他想把这张照片与他实际的照片结合起来,以适当地提亮图像的边缘和四角。基本上,我们要做的是用那张被明亮照亮的白纸照片的灰度图像去除以原照片,这样就会按“白纸”照片被压暗的量来提亮图像的相应部分。这基本上就是合成方法 '[Divide](compose.html#divide)',它用“源”图像除以“背景”图像。例如,
magick nikon18-70dx_18mm_f3.5.jpg vegas_orig.jpg \
-compose Divide -composite vegas_fixed.jpg
不过,由于“白纸”的照片很可能不是纯白,而你大概也不想用这种“灰白”颜色去提亮图像。为修正这一点,我们需要把除数图像乘以它中心像素的颜色。以下是提供给 Martin 的最终解决方案,它使用了非常慢的 FX 手工运算符。这早于 除法合成方法 的加入,那个方法可以用来极大地加快这一过程。那张白色照片也被转成了灰度以去除任何色彩失真,注意我调换了顺序,这样也会保留原图像中的任何“元数据”(因为在这种情况下它是“目标”图像)。 |
magick vegas_orig.jpg \( nikon18-70dx_18mm_f3.5.jpg -colorspace Gray \) \
-fx '(u/v)*v.p{w/2,h/2}' vegas_fixed_fx.jpg
![[photo]](../static/img/img_photos/vegas_fixed_fx.gif)
如果你仔细看放大后的照片,尤其是左上和右上的“天空”角落,你可以看到暗角效果,以及所做的校正。这不是一个完美的解决方案,还可以再做一些微调。例如,与其使用一个缩放像素,我们可以对“白纸”图像做预处理,也对它进行调整,以获得更好的暗角去除结果。注意,任何摄影工作都不建议使用 JPEG,因为这种格式可能在结果中引入一些假象和不一致。这种格式只适合最终结果的存储和显示。关于校正暗角的一个重要讨论,在 IM 用户论坛的 针孔相机的算法暗角校正? 讨论中。会影响暗角的因素包括……
- 胶片到镜头的距离,越远意味着光扩散越多。
- 由于光线角度,光圈“圆”(镜头或针孔)的面积。
- 光圈周围相机材料的排布。例如镜头座或针孔的厚度。
![[IM Text]](../static/img/photos/pagoda_sm_exif.txt.gif)
![[IM Text]](../static/img/photos/pagoda_sm_time.txt.gif)
![[IM Output]](../static/img/img_photos/night_club_tn.gif)
![[IM Output]](../static/img/photos/night_club_fixed.gif)
![[IM Output]](../static/img/img_photos/night_scape_tn.gif)
![[IM Output]](../static/img/photos/night_scape_fixed.gif)
![[IM Output]](../static/img/photos/beijing_model.jpg)
![[IM Output]](../static/img/img_photos/ny_family_tn.jpg)
![[IM Output]](../static/img/img_photos/ny_family_tn.png)
![[IM Output]](../static/img/photos/ny_family_merged_tn.jpg)
![[IM Output]](../static/img/img_photos/holocaust_tn.gif)
![[IM Output]](../static/img/img_photos/spiral_stairs_tn.gif)
![[IM Output]](../static/img/photos/overlap_photos.jpg)
![[IM Output]](../static/img/photos/overlap_series.jpg)
![[IM Output]](../static/img/img_photos/anthony_1.jpg)
![[IM Output]](../static/img/img_photos/anthony_2.jpg)
![[IM Output]](../static/img/img_photos/jacob_vs_jacob_md.jpg)
![[IM Output]](../static/img/img_photos/zelda_tn.gif)
![[IM Output]](../static/img/photos/zelda_face_mask.gif)
![[IM Output]](../static/img/photos/zelda_anonymity.png)
![[IM Output]](../static/img/images/tile_fabric.gif)
![[IM Output]](../static/img/photos/texture_fabric.gif)
![[IM Output]](../static/img/photos/photo_texture.jpg)
![[IM Output]](../static/img/photos/pagoda_mask.png)
![[IM Output]](../static/img/photos/photo_texture_masked.jpg)
![[IM Output]](../static/img/img_photos/holocaust_sm.jpg)
![[IM Output]](../static/img/photos/charcoal.gif)
![[IM Output]](../static/img/photos/color-in.gif)
![[IM Output]](../static/img/images/piglet.gif)
![[IM Output]](../static/img/photos/color-in_cartoon.gif)
![[IM Output]](../static/img/img_photos/taj_mahal_sm.png)
![[IM Output]](../static/img/photos/photocopy.png)
![[IM Output]](../static/img/img_photos/pagoda_sm.jpg)
![[IM Output]](../static/img/photos/sketch.gif)
![[IM Output]](../static/img/photos/sketch_new.gif)
![[photo]](../static/img/img_photos/vegas_tn.gif)
![[photo]](../static/img/img_photos/nikon18-70dx_18mm_f3.5.gif)
![[photo]](../static/img/photos/vegas_fixed.gif)