ImageMagick 範例 --
數位照片處理

索引
ImageMagick 範例前言和索引
數位相機元資料,EXIF 配置檔
數位照片方向
色彩增強
照片轉換秘笈
ImageMagick 的主要用途之一是處理和修改使用新型現代數位相機拍攝的照片。這些相機通常會拍攝相當大、高解析度的照片,並在其中包含有關時間、比例、變焦、相機、方向等的元資料。甚至還有計劃將相機連結到行動電話,以便它可以根據您拍攝照片時的位置以及照片中可能有哪些人(從前面的行動電話)來猜測。在這裡,我們將探討處理數位照片的基礎知識,甚至將其轉換為其他用途,例如藝術渲染。特別感謝數位相機使用者 Walter Dnes 在增強數位照片方面提供的幫助。

數位相機元資料,EXIF 配置檔

當數位相機拍攝照片時,它還會在 JPEG 儲存檔案中包含許多額外資訊。此元資料稱為 EXIF 配置檔,專為攝影實驗室和沖印而提供。ImageMagick 的「magick identify」命令搭配「-verbose」設定將會顯示此 Exif 資訊。以下是我在中國南方昆明動物園拍攝的一座寶塔的照片的 EXIF 資料。

  magick identify -format "%[EXIF:*]" pagoda_sm.jpg |\
      sed 's/\(.\{46\}\).*/\1/' | column -c 110
[IM Text]
EXIF 資料或任何識別輸出都應該以不區分大小寫的方式處理。例如,許多舊版的 IM 會輸出「EXIF:」(大寫)而不是「exif:」(小寫)。
以下是一個類似的範例,但使用「萬用字元」(類似 shell)表達式將輸出限制為與時間相關的 EXIF 欄位...

  magick identify -format "%[exif:*time*]" pagoda_sm.jpg
[IM Text]
EXIF 配置檔中有很多關於這張照片的資訊。例如
  • 我的相機是 Panasonic(「Make」),型號為 DMC-LZ1(「Model」)
  • 相機已旋轉(「Orientation」)。但我一定是在沒有調整 EXIF 資料的情況下校正了旋轉。相機也稍微向上傾斜,但該資訊未被記錄。
  • 37mm」的「FocalLength」顯示我沒有使用相機的「光學變焦」功能。我的相機可以進行高達 6 倍的光學變焦,以獲得「366/10」或「222mm」的「FocalLength」。
  • 而「DigitalZoomRatio」顯示我也沒有進行數位變焦。
  • 相機還使用了 1/8 秒的快速「ExposureTime」,以及 3mm 的光圈「MaxApertureValue」,或「FNumber」為「5.6」以及「ISOSpeedRating」為「64」。
  • 未使用閃光燈(「LightSource」)。
  • 原始影像的大小為 1728 x 2304 像素('ExifImageLength' 和 'ExifImageWidth')。雖然實際影像(如果您想查看的話)較小,所以我一定是裁剪和/或調整了它的大小。
  • 而且可能最重要的是,根據 'DateTime' 字串,它是在 2005 年 7 月 9 日下午 2:05 左右拍攝的。這假設我的相機時間設定正確(我的確設定正確)。
  • 更現代的相機甚至可能有 GPS 位置,並且可能還有拍攝方向的指南針方向!
還包括但上面沒有列出的是相機在其自身顯示幕上使用的小「縮圖」預覽影像。還有一些功能可以標記您要「沖印」或由相片印表機列印的照片,並調整其他列印參數。然而,大多數人很少使用這些功能。這些設定中的許多設定對使用者來說可能非常有用,但對人們最有用的一般是照片的日期和時間。當然,這假設在拍攝照片之前,相機上的日期和時間設定正確。此外,許多人對影像的方向感興趣,以便在顯示時可以正確旋轉,這就是我們接下來要看到的內容。所有這些數據,尤其是預覽影像,可能會佔用影像中相當多的空間。而且,我可能並不希望全世界都知道我在 2005 年 7 月去過中國昆明。因此,您可能希望在將 EXIF 數據發佈到網網際網路上之前將其從影像中刪除。此外,數位相機的影像尺寸通常非常大(並且越來越大),允許您以照片品質等級列印,但對於網際網路的使用來說太大了,尤其是對於縮圖而言。因此,除非您希望使用者能夠實際列印照片品質的影像,否則我不會直接發佈原始影像。例如,上面的影像已經為 IM 範例的使用進行了裁剪和調整大小,但我特意保留了 EXIF 數據以供範例使用。通常我會刪除這些資訊。

數位照片方向

有人告訴我,Photoshop 會根據 EXIF 的 'Orientation' 設定自動旋轉數位影像,IM 也會在讀取影像後包含「-auto-orient」運算子來做到這一點。但是,這一點很重要
JPEG 格式是有損的
這意味著,每次解碼和儲存 JPEG 檔案格式時,都會稍微降低影像品質。作為一個通用的影像處理器,IM 總是會完全解碼和重新編碼格式,因此當它重新儲存影像時,總是會降低 JPEG 影像的品質。有關 JPEG 格式性質的更多資訊,請參閱JPEG 影像檔案格式。重點是,只有在您還執行其他影像修改操作時,才使用 IM 來校正數位照片方向(使用「-auto-orient」),例如縮圖建立影像註釋浮水印,甚至曝光調整。IM 可以使用影像屬性轉義從照片中提取當前的方向(作為一個數字)...

  magick identify -format '%[exif:orientation]' pagoda_sm.jpg
[IM Text]
IM 提供了一個特殊的「-orient」運算子(使用「-list orientation」來查看可能的值)。

  magick pagoda_sm.jpg -orient bottom-right \
                 -format '%[exif:orientation]'   info:
[IM Text]
這些中繼資料設定方法可以調整已修改照片的方向,尤其是旋轉過的照片。請注意,方向正確的照片其方向值應為「Top-Left」或 1。當然,如果您打算在之後的影像處理中使用「-auto-orient」,則不應移除 EXIF 中繼資料(使用「-strip」或「-thumbnail」)。請在移除影像中繼資料之前使用它。如果您想在不降低或修改影像品質的情況下修正照片方向,建議您使用 JHead 程式。例如,以下範例示範如何修正照片方向,並刪除目錄中所有數位照片的內建預覽縮圖。

  jhead -autorot  *.jpg
JPEG 無損旋轉僅適用於大小可被 8 或 16 整除的影像。大多數(但並非所有)數位相機照片都符合此條件。如果您嘗試對大小為奇數的影像執行此操作,則右側或底部區塊(包含部分大小)將無法在最終影像中正確定位,因為這些區塊只能存在於右側或底部邊緣。

如需相關範例,請參閱此 特定討論
JHead 程式還可讓您調整照片日期(如果您的相機時間設定錯誤,或者您前往了不同的時區)、提取/移除/替換預覽縮圖、設定影像的註釋欄位、移除 Photoshop 設定檔,以及執行基本影像裁剪(例如移除照片中出現的陌生人 ;-))等等,且不會降低 JPEG 影像資料的品質。我推薦使用此程式或其他類似程式(請參閱其他 JPEG 處理程式)來修正這些資訊。只要確保它實際上沒有對 JPEG 影像資料進行解碼/重新編碼即可。關於方向的最後一點說明。如果您將相機指向幾乎垂直向上或向下,則 EXIF 方向設定可能無法正確解析。傾斜拍攝也是如此。方向設定(和相機)無法感應這些情況。對於此類照片,您唯一的選擇是使用低階無損「jpegtrans」或 IM「-rotate」自行旋轉,然後重設 EXIF 方向設定(使用 JHead 或 IM「-orient」運算子),或直接移除 EXIF 設定檔。
Other IM Lossy Modifications...
  If you are also resizing or otherwise modifying the image, such as reducing
  its quality and size for use on the web, then data loss is already a fact.
  As such during those operations IM can do similar things, allowing you to do
  all the required operations in a single 'load-save' cycle.

  Rotate ALL images to landscape   -rotate 90\<
                       portrait    -rotate -90\>


色彩增強

在繼續之前,建議您先參閱色彩修改,以瞭解將會使用的一般色彩修改技術簡介。對高對比線條藝術和圖形進行正規化(使用「-normalize」)可能會產生不錯的效果。但正規化的照片看起來可能不真實,而且如前所述,列印效果也可能不佳。「-contrast-stretch」運算子可以限制正規化的「邊界」,而「-levels」和/或「-sigmoidal-contrast」運算子可以進行「更平滑」的調整(如需這些運算子功能的更詳細說明,請參閱直方圖調整)。以上輸入內容由 IM 郵件清單中的「Tong」提供。

增亮曝光不足的照片由 Walter Dnes 貢獻

有時,沒有足夠的可用光線來進行適當的曝光。在其他時候,您可能必須使用比最佳值更短的曝光時間,以消除運動模糊。曝光不足的數位照片可以使用「-sigmoidal-contrast」運算子和「0%」的門檻值,在不使亮部過曝的情況下,優先增亮較暗的區域。如需更多詳細資訊,請參閱S 形非線性對比。以下是一個輕微曝光不足的範例,這是在日落後的一場免費音樂會上拍攝的。這張照片有很多明亮的區域,這些區域很清晰,但也有一些我希望使其更清晰可見的黑暗區域。

  magick night_club_orig.jpg  -sigmoidal-contrast 4,0%  night_club_fixed.jpg
[IM Output] ==> [IM Output]
與往常一樣,您應該使用 TIFF 或 PNG 等無損格式進行中間處理。JPEG 格式僅用於減少網路發佈的磁碟空間和下載頻寬。

選擇圖片以查看範例實際使用的放大版本,而不是顯示的小縮圖。
這是一個嚴重曝光不足的範例,這是在晚上從我的陽台向南拍攝的多倫多市夜景。

  magick night_scape_orig.jpg -sigmoidal-contrast 10,0%  night_scape_fixed.jpg
[IM Output] ==> [IM Output]
主要參數控制增亮程度。需要的增亮程度越高,使用的值就越高。輸出圖片看起來的顆粒感就越強。這是由於較小的像素誤差也被放大了。S 形對比增亮往往會降低光譜紅色端的亮度。您最終可能不得不選擇一個產生最自然膚色的參數,而不是您真正想要的亮度級別。在嚴重曝光不足的情況下,您最終會在增亮後得到一張光彩奪目的顆粒狀黑白圖像。這是數位圖像增強的物理限制。如果沒有顏色數據,IM 不會為您生成顏色數據。在現實生活中,我陽台右側的磚塊是紅色的,下面的樹是綠色的。

像素合併——降低數位雜訊由 Walter Dnes 貢獻

許多專業攝影師對數位相機製造商「像素競賽」的副作用感到不滿。製造商透過縮小像素尺寸,在數位相機的感光元件中塞入更多的像素。在相同的 ISO 設定下,較小的像素會導致圖像雜訊更嚴重,這迫使人們使用較低的 ISO 設定。使用較低的 ISO 值來避免雜訊需要更長的曝光時間。反過來,這意味著大多數消費級數位相機在室內超過其內建閃光燈 10 英尺的範圍內,除了使用三腳架拍攝靜物照片外,幾乎毫無用處。許多數位相機用戶很樂意犧牲一些像素來換取在更高 ISO 設定下雜訊更少的圖片,但控制這些公司的行銷人員拒絕將此作為一種選擇。幸運的是,這種取捨可以在拍攝數位照片後進行。其技術術語是「像素合併」。簡化的理論是這樣的…
  • 取一個 n×n 的像素網格,並對其組成部分進行平均,以獲得一個「超級像素」。
  • 訊號與組合像素面積成正比,這意味著訊號量增加了 n^2 倍。
  • 雜訊是隨機的。這意味著它與組合像素面積的平方根成正比,即 n 倍。最終結果是 SNR(訊噪比)提高了 n 倍。如需更多詳細資訊,請參閱攝影詞彙表,像素合併
當一張 1600×1200 的數位照片合併為 800×600(即 2×2 網格)時,訊噪比會提高一倍。同樣,一張 2560×1920 的圖片以 3×3 的比例合併為 853×640 像素時,訊噪比會提高 3 倍。
為了利用像素合併,照片圖像的尺寸必須是最終所需尺寸的整數倍。
在 ImageMagick 中,特殊的「-filter」設定「box」會在您「-resize」(調整大小)影像時,將像素群組平均為單一像素(詳情請參閱重採樣濾鏡)。這表示若要執行「像素合併」,您只需要正確調整影像大小即可。
建構中
Walter Dnes 也提供了原始指令碼 binn 來執行計算、最小程度地裁剪影像並執行「像素合併」。像素合併範例 3像素合併範例 4

照片轉換秘訣

輕微旋轉校正-- 讓照片更水平

典型情況。您拍攝了一張照片,但影像不水平,您想進行校正。[IM 輸出]例如,這是我在 2008 年使用手持相機在北京拍攝的一張照片,地點是紫禁城後面的景山公園的山丘上。不,它不是紫禁城本身,而是山丘另一側的一座寺廟。*點擊縮圖以查看更大的影像。*是的,影像很小,您應該將解決方案應用於原始影像而不是小型縮圖,但技術對於任何影像都是相同的。在這種情況下,影像需要旋轉 -1.8 度才能進行校正。
現在,如果您只是簡單地旋轉影像,您將會得到一張稍微大一點的影像,角落中包含彩色區域,使得校正看起來很明顯且很糟糕。

  magick beijing_tn.png -rotate -1.95  beijing_rotate.png
即使您要將影像裁剪回其原始大小,例如簡單影像旋轉中所示範的那樣,您仍然會在角落中看到一些彩色。
[IM Output]
最簡單的解決方案是現在裁剪該結果以移除這些邊框,但這樣您的影像就會變成一個相當奇怪的大小,這再次表明已經進行了一些操作。儘管執行該裁剪的公式並不簡單,但在失真旋轉方法中有示範。
更好的解決方案是不僅旋轉影像,而且稍微縮放它,以便產生與原始影像大小相同的旋轉影像。

  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]
影像看起來很乾淨,牆壁完全水平。角度計算使用影像中長直線兩端的像素位置,是相當簡單的三角學。但是,我發現通過反覆試驗以各種小角度旋轉影像,可以相對快速地找到一個好的旋轉角度。在觀察特定角度有多好時,請仔細觀察您使用的線條或邊緣上的像素。這張照片中牆壁的頂部。請記住,在影像旋轉中,向左或逆時針旋轉是負數(因為 Y 軸向下)。還要記住,如果可能的話,始終將操作應用於原始影像,避免使用中間影像(尤其是中間 JPEG 影像)。始終最好從原始來源開始應用任何照片修改,而不是任何已保存的中間副本。

傾斜移軸效果-- 讓風景看起來像人造模型

[IM 輸出]「移軸攝影」是一種讓影像頂部和底部模糊,同時保持影像中心清晰的技術。 它最初是在非常老式的風箱相機中完成的,在這些相機中,鏡頭會傾斜以使影像的頂部和底部失焦。 由於 ImageMagick v6.5.4-0 中添加了可變模糊映射,現在可以輕鬆做到這一點。 如果您為此添加非常高的對比度以增強陰影並使色彩飽和,則典型的結果是普通影像可以變得看起來很像人造的。 幾乎就像您正在拍攝一個小的、高度詳細且光線充足的模型。
我們需要做的第一件事是增強影像中的色彩以賦予其非常高的對比度,並且可能會稍微調亮它,使其看起來像是在強烈的攝影棚燈光下照亮的。

  magick beijing_md.jpg -sigmoidal-contrast 15x30% beijing_contrast.jpg
[IM Output]
請注意我是如何使用強大的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]
請注意,我使用原始影像本身和兩點重心稀疏著色在整個影像上生成線性漸變。 然後使用基本的多項式函數修改該線性漸變,使其成為中間為黑色的拋物線漸變。 現在只需根據模糊映射模糊影像即可產生「移軸」效果。 結果是原始影像看起來更像是比例模型,而不是真實事物的快速快照。

  magick beijing_contrast.jpg  beijing_blurmap.jpg \
          -compose Blur -set option:compose:args 10 -composite \
          beijing_model.jpg
[IM Output]
正如您在最終影像中看到的那樣,由於色彩濃郁,樹木和建築物看起來非常不自然,而近處和遠處的模糊使影像具有「小型」模型般的感觉。 儘管這一定是一個非常詳細的模型! 通過執行旋轉校正(見上文)作為移軸處理的一部分,結果可以得到進一步改進。 完美的相機方向只會增添人造的感覺。 當然,您可以將所有這些操作串在一起,一次性完成所有操作,並避免臨時文件或品質損失。

  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
在上面,我將「移軸」模糊映射中的拋物線漸變替換為更傳統的線性黑白灰漸變(具有相同的斜率)。使用曝光 & 色階技術使線性漸變在水平方向上從圖像底部約 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
[IM Output] ==> [IM Output] ==> [IM Output]
選擇結果圖像以查看更大的副本。
這使用了一般的 覆蓋合成,需要 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]
生成遮罩圖像的另一種方法是使用 Fred Weinhaus 的“plmlut”水平漸變生成器腳本。與我在上面生成的線性漸變相比,它對漸變的曲率有更精細的控制。現在所有的數學計算都完成了,剩下的就是使用我們剛剛生成的遮罩進行三幅圖像的遮罩合成。但是,我們還需要放大目標(左側)圖像,以便為重疊的右側圖像(任何顏色)提供足夠的空間,並使用適當的重力(右側或“East”)正確定位第二個圖像。

  magick holocaust_tn.gif -extent 200x90  spiral_stairs_tn.gif \
          overlap_mask.png  -gravity East -composite   overlap_photos.jpg
[IM Output] [IM Output]  + [IM Output] ==> [IM Output]
現在我們有兩個圖像,它們使用線性漸變重疊。當然,這兩個命令可以合併成一個命令,這樣您就不需要保存“遮罩”中間圖像。這留給讀者作為練習。一個小小的改進是在圖像之間使用更大的重疊區域上的更彎曲的漸變。這減少了最終圖像的重疊區域開始和結束處可見的急劇變化。特別是當圖像包含大面積顏色非常不同的區域時。例如,這使用了一些 扭曲漸變 技術,不僅生成更平滑的漸變曲線,而且旋轉該漸變以形成高度傾斜的重疊。

  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]
是的,以上內容相當複雜,但它顯示了可能的結果。如果您打算處理兩張以上的圖像,則更好的方法是使用遮罩直接設置第二張和後續圖像的透明度。然後可以使用 分層圖像範例 中介紹的技術將多個圖像疊加在一起。其中一些技術不需要您計算最終圖像大小,因為 IM 可以為您完成此操作。您只需要確保正確定位圖像即可。例如,我在這裡為第二張和第三張圖像添加了一個 30 像素的漸變,要求圖像彼此之間每隔 90 像素(寬度 120 減去 30 像素的重疊)放置。當所有圖像都被賦予適當的透明度和位置後,我們只需將圖層 拼接 在一起(所有偏移量均為正數),讓 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
[IM Output]
與其預先計算重疊遮罩影像的位置,您可以使用在附加重疊以及增量計算位置中找到的技術來處理較長的影像序列。最後的注意事項:像這樣重疊照片最適合整體顏色相當一致的影像。此外,您可能會注意到,對於序列兩端的影像,由於僅影像的一側有重疊,因此置中的主體看起來可能不會很置中。這個問題可以通過將這些影像的外緣淡化為透明,或者裁剪一些外緣以幫助重新置中這些影像的主體來改善。題外話:在不同的色彩空間中進行合成可能會更好。有人想嘗試並報告您的結果嗎?無論好壞。

雙重曝光-- 混合同一場景的多張照片

使用老式的底片相機時,有一種技術是在不「捲動」底片的情況下拍攝兩次或更多次照片。這讓您可以創建所謂的雙重曝光,將在稍微不同的時間拍攝的兩張影像合併在一起。結果通常是影像中移動或變化的部分出現重影或變暗。然而,通過仔細控制影像中的主體、光線效果,甚至是顯影過程,就有可能拍出一些非常怪異甚至「不可能」的照片。使用數位影像甚至更容易,因為您可以更好地控制影像。基本上... 眼見為憑,但相機會說謊! 例如,假設我想要一張我出現兩次的影像!這很容易做到。例如,這裡是我專門為這個例子拍攝的兩張快速照片的縮略圖,使用三腳架和定時器,我將直接使用它們。
[IM Output] [IM Output]
也許您可以提供一套更好、更有趣的圖片組?
我將直接將雙重曝光技術應用於這些縮略圖,儘管更典型的情況下,我會使用原始影像檔案作為輸入,以便獲得最高品質的結果。現在,如果我使用傳統的類似底片的「雙重曝光」和老式相機,結果將是這兩張影像的平均值,產生我自己的半透明「重影」。以下是此技術的數位模擬...

  magick anthony_1.jpg anthony_2.jpg -evaluate-sequence mean  anthony_ghosts.jpg
[IM Output]
但是,如果我不想要重影,而是想要我自己的完整影像呢?那麼您需要使用遮罩來選擇要從哪個影像中提取哪些部分。這個遮罩可以通過兩種方式生成。您可以通過沿著靜態或不變的部分分割影像來手動創建遮罩。在這種特殊情況下,這是一個相當簡單的問題...

  magick -size 100x90 xc: -draw 'rectangle 0,0 50,89' \
          -blur 0x3  anthony_mask.jpg
[IM Output]
請注意,我模糊了遮罩,以便「羽化」兩張影像之間的過渡。在這裡,我使用遮罩合成來合併影像。

  magick anthony_1.jpg anthony_2.jpg anthony_mask.jpg \
          -composite  anthony_doubled.jpg
[IM Output]
如果您有兩張(或更多)全家福,其中有些人閉著眼睛、說話、做鬼臉或只是看向別處。您可以從不同的影像中挑選每個「頭部」並合併多張影像以形成蒙太奇,以便獲得一張所有人都看著鏡頭並且睜開眼睛的照片。通過交換輸入影像,或者僅僅反轉遮罩,您可以將我從影像中完全移除,從而獲得不受限制的靜態背景視圖。

  magick anthony_2.jpg anthony_1.jpg anthony_mask.jpg \
          -composite  anthony_removed.jpg
[IM Output]
當拍攝公共紀念碑等照片時,如果無法承擔控制人群的費用,這個方法會非常方便。只需使用三腳架拍攝大量照片,希望您可以將它們組合起來,將所有人從場景中移除!如果您有數百張圖像(影片)要產生背景圖像,另一種方法是建立所有圖像的平均值。這會將所有人或其他暫時性物件變成「幽靈」般的淡淡陰影。這本身可能是一種有趣的效果,但不一定總是我們想要的。平均圖像可能是一個有用的步驟,因為一旦擁有它,您就可以將其與每個單獨的圖像進行比較,以遮蔽每個畫面中的人物(暫時性物件),然後再次將背景組合在一起,以建立乾淨(無陰影)的背景圖像)。關於從影片圖像自動產生「乾淨背景」的主要討論可以在 IM 討論區的 建立參考圖像擷取變更事件 中找到。
使用乾淨的背景照片,我們可以設定差異圖像的閾值,以遮蔽圖像中發生變化的部分。您可能需要使用一些進一步的模糊處理和閾值設定,以適當地擴展遮罩,不僅涵蓋圖像中的物件,還涵蓋它可能投射在背景景色上的任何陰影或反射。可能還需要一些試誤才能做到正確。

  magick anthony_removed.jpg anthony_2.jpg \
          -compose difference -composite \
          -threshold 5% -blur 0x3 -threshold 20% -blur 0x3 \
          anthony_automask.jpg
[IM Output]
現在,讓我們使用此遮罩將我的「幽靈」圖像與原始圖像混合在一起,這樣看起來就像我的良心正在因為我製作了這種「不可能」的圖片而「困擾」著我。

  magick anthony_1.jpg anthony_ghosts.jpg anthony_mask.jpg \
          -composite  anthony_haunted.jpg
[IM Output]
最後,以上所有技術都假設照片是從固定在靜止三腳架上的相機拍攝的。如果情況並非如此,而只是從手持位置拍攝,我可以保證無論您多麼努力,圖像都不會正確匹配或「對齊」。在這種情況下,您可能需要對兩張圖像中的至少一張進行一些 仿射 甚至 透視 變形,才能使背景正確對齊。背景越複雜,所需的重新對齊就越精確。如果使用了閃光燈,或者當天是多雲且光線不穩定的情況,您可能還需要對照片進行一些亮度調整。原因是大多數相機會「自動調整」圖像的亮度,而閃光燈或光線變化會改變其對每張圖像的「自動色階」調整的處理方式。最後,以下是我從兩張不同的照片中建立的另一張圖像,照片中我的姪子正在攀岩牆前與自己擊劍。由於我手持相機並使用了閃光燈,因此我確實需要進行一些仿射變形調整以及輕微的亮度調整,才能獲得您所看到的無縫效果。
[IM Output]
Jacob 對決 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
[IM Output] ==> [IM Output] [IM Output] ==> [IM Output]
當然,您可以一次完成所有這些操作,甚至可以使像素化到正常之間的變化更加平滑。例如..

  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]
當然,除了將不雅的部分像素化之外,您也可以將該區域模糊處理。只需將兩個「-scale」運算子替換為單個「-blur」即可模糊細節。這種替換遮罩區域的技術也可以用於從影像中移除不需要的文字和標誌。有關詳細資訊,請參閱孔洞填充

為影像添加紋理

強光 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
[IM Output] ==> [IM Output] ==> [IM Output]
請注意,如果您想將紋理實際「平鋪」在影像上,則需要使用「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
[IM Output] ==> [IM Output]
現在想像一張女士穿著洋裝的圖片。您可以取得任何圖案,適當地上色,然後將其覆蓋在原始圖像上,以用完全不同的設計替換洋裝。當然,以上有很多變化可以實現最終結果,具體使用哪種技術取決於您,但基本思想是相同的。為圖像添加紋理,遮罩並覆蓋結果。順便一提,我還建議您看一下覆蓋 Alpha 合成方法,它與強光合成相同,只是交換了兩張圖像。還有很多其他的陰影合成方法可以用來以各種方式為圖像添加紋理。
[IM Output]

色度鍵遮罩-- 按特定顏色區域修改

左邊的照片是由一位用戶在IM 論壇討論中提供的。他想改變女孩襯衫的顏色,那是一種漂亮的「粉紅色」。問題是顏色不只是「粉紅色」,而是一系列不同的「粉紅色」色調。正如您在上面看到的,要對圖像進行更改,第一步通常是生成您感興趣區域的適當遮罩。在這裡,我將使用一種稱為色度鍵的技術來生成特定顏色的遮罩。此技術通常在圖像中尋找特定顏色以用作遮罩。它也是電視和電影中廣泛使用的「藍色」和「綠色」屏幕效果所使用的技術。
 
這基本上涉及通過分離通道圖像來提取「色相」,然後查找所需的「色相」。例如...

  magick shirt.jpg -colorspace HSL -channel Hue -separate shirt_hue.jpg
然而,這個色相圖像有幾個問題。
  • 首先,「粉紅色」非常接近「紅色」,而紅色是色相「翻轉」的分割點。為了確保這不是問題,我使用調整來調整色相,使其遠離色相中的「不連續性」。這對於提取「綠色」或「藍色」屏幕的「色度鍵」來說不是問題。
  • 這種「粉紅色」也不是一種高飽和度的顏色,而是具有非常低的飽和度值。這意味著它的「色相」不如應有的強。
  • 另一個問題是灰色背景!!!!! 灰色幾乎沒有色相,所以我需要從最終遮罩中刪除任何飽和度低或沒有飽和度的區域,否則我會改變背景中的東西。請注意,如果我將更改限制為色相滾動,則技術上不需要這樣做,因為這不會影響不飽和的顏色。
簡而言之,如果輸入圖像的顏色更亮、更鮮豔,並且與皮膚(或頭髮)顏色不太相似,則效果會更好。例如,一件鮮豔的藍色或綠色襯衫。但我會盡力處理我得到的東西。
[IM Output]
所以讓我們提取並組合兩個通道遮罩。請注意,在使用模組「滾動」圖像色相後,色相 = 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
[IM Output]
在這裡我清理了先前遮罩中的小瑕疵(可選),並對其進行反轉,以定義我要“寫入保護”的區域。 然後我設定這個遮罩,調整色調將“粉紅色”變成“淺藍色”,並儲存結果影像。

  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]
這個特定範例的真正問題是“關鍵顏色”太接近正常的膚色了,你真的只是在自找麻煩! 這就是為什麼使用這種技術的人會使用“綠色”和“藍色”螢幕,因為這些顏色與螢幕前人物的“膚色”盡可能不同。 請注意,最好不要使用 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 Output] ==> [IM Output]

兒童著色輪廓影像

在 IM 使用者論壇上關於生成著色頁的長期討論中,開發了以下食譜將簡單的照片變成孩子們可以著色的東西。 這是我們迄今為止獲得的最佳結果,應用於我拍攝的柏林大屠殺紀念館的照片。

  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 Output] ==> [IM Output]
上述操作最後會嘗試使線條平滑並改善整體效果。 當然,上述技術僅適用於具有良好清晰顏色變化且最好比我上面使用的解析度更高的影像。 對於已經具有黑色輪廓和淺色背景的卡通影像,將邊緣檢測與上述方法一起使用將直接產生黑色輪廓的“孿生”效果。 你可以在左下角通往紀念館的小路上瓷磚的雙線中看到這種效果。 這是邊緣檢測工作方式的產物,你可以在 IM 範例的該部分中看到更多範例。 解決方案是在使用“-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
[IM Output] ==> [IM Output]
我也會使用「-threshold」,以便我可以移除「-edge」似乎喜歡產生的個別點。之後,我再次嘗試平滑影像中的鋸齒線。以上是在關於 GIMP 影印濾鏡 的討論中添加的,目的是利用 Compose Divide 方法來尋找輪廓。

  magick taj_mahal_sm.png -colorspace gray \
          \( +clone -blur 0x2 \) +swap -compose divide -composite \
          -linear-stretch 5%x0%   photocopy.png
[IM Output] ==> [IM Output]
上述的「-linear-stretch」運算調整影像暗區的黑色程度,而「-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]
現在,只需將這個「鉛筆」陰影影像與照片疊加並混合即可。鉛筆影像會被平鋪,使其畫布尺寸與我們正在處理的影像相同。然後,使用 平鋪畫布 中介紹的技術將其應用於影像。然後將其合併到原始影像的灰階副本中。

     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
[IM Output] ==> [IM Output]
請注意,由於「magick」命令無法使用「composite」命令的「-blend」運算子,因此我選擇使用 DIY「-fx」運算子來執行等效的操作。可能還有更好、更快但更複雜的方法來做到這一點。(歡迎提供建議)這不是最終版本,因為運算子遺漏了一些邊緣增強方面,這些方面是勾勒影像中一些較亮但顏色變化較大的區域所必需的。您可以改進上述內容嗎?上述演算法已作為藝術轉換「-sketch」內建於 IM 中,但沒有為產生的「鉛筆平鋪」進行「-resize」平滑處理...


magick pagoda_sm.jpg -colorspace gray -sketch 0x20+120 sketch_new.gif
[IM Output] ==> [IM Output]

暗角移除

在拍攝照片時(無論是數位照片還是其他照片),相機鏡頭通常會使影像的邊緣和角落變暗。這稱為「暗角」。事實上,這種鏡頭效果非常普遍,經常使用「-vignette」運算子刻意偽造。請參閱 暗角轉換。Martin Herrmann <Martin-Herrmann@gmx.de> 希望從照片中移除相機暗角。基本上,他在不使用閃光燈的情況下,在明亮的光线下拍攝了一張白紙的照片。然後,他希望將這張照片與他的實際照片結合起來,適當調亮影像的邊緣和角落。基本上,我們要做的是將原始照片除以明亮照射的白紙照片的灰階影像,然後根據「白紙」照片變暗的程度來調亮影像的各個部分。這基本上就是合成方法「Divide」,它將「來源」影像除以「背景」影像。例如,

  magick nikon18-70dx_18mm_f3.5.jpg  vegas_orig.jpg \
          -compose Divide -composite  vegas_fixed.jpg
[photo]  + [photo] ==> [photo]
(點擊查看大圖)
然而,由於「白紙」的照片可能不是真正的白色,您可能不希望通過這種「灰白色」來增亮圖像。要解決此問題,我们需要將除數圖像乘以其中心像素顏色。以下是提供給 Martin 的最終解決方案,它使用了非常慢的 FX DIY 運算符。這早於添加 除法合成方法,後者可以用於極大地加快此過程。白**色**照片也進行了灰度化處理,以消除任何顏色失真,請注意,我更改了順序,這也將保留原始圖像中的任何「元數據」(因為在這種情況下它是「目標」圖像)。

  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]
如果您仔細觀察放大的照片,尤其是左上角和右上角的「天空」角落,您可以看到晕影效果及其修正。這不是一個完美的解決方案,可以進行更多調整。例如,我們可以使用縮放像素以外的方法,預處理「白頁」圖像,並調整它以獲得更好的晕影去除效果。請注意,不建議對任何類型的攝影作品使用 JPEG,因為該格式可能會在結果中引入一些伪像和不一致。該格式僅適用於存儲和顯示最終結果。關於校正晕影的主要討論位於 IM 用戶論壇的討論 針孔相機的算法晕影校正?。可能影響晕影的因素包括...
  • 膠片與鏡頭的距離,距離越遠意味著光線散射越多。
  • 由於光線角度,「圓形」光圈(鏡頭或針孔)的面積。
  • 光圈周圍相機材料的排列。例如鏡頭座或針孔厚度。