ImageMagick 範例 --
畫布創建
索引
ImageMagick 使用畫布作為繪圖的起始圖像、疊加具有透明區域的圖像的背景,甚至僅作為一般圖像處理的一部分。它們可以是純色、一系列顏色,甚至是較小圖像的平鋪。在這裡,我們僅介紹可用於生成各種畫布圖像的一些方法。
您甚至可以從現有圖像中抓取單個像素,並將其擴展到您想要的畫布大小。我們使用「
請注意使用「
這是 ImageMagick 5 版中推薦的方法。
上述所有「簡單」方法的主要缺點是,沒有一個方法可以簡單地將影像重置為當前的「
以上使用「
最後一種方法還有一個額外優點,就是可以讓您相對於原始影像大小稍微放大影像畫布。
以上所有方法不僅可以使用完全不透明的顏色進行填充,還可以 使用半透明顏色。但是,最好確保您的影像事先具有透明度通道。
另請注意,當將「
在以下範例中,我將從內建玫瑰圖像(如左所示)的各種像素中選擇顏色,作為我製作空白圖像的顏色。最明顯(但速度較慢)的方法是簡單地使用「
但是,這可以透過只選擇一次像素來加快速度。這可以使用 fx 公式作為 稀疏顏色 的參數來完成。它看起來可能不太簡單,但速度要快得多。
另一種更複雜的方法是裁剪出該像素並使用稍後在 使用記憶體中的圖像進行平鋪 中詳細描述的技術將其平鋪到整個圖像中。
-level" operator with the same argument for both 'black' and 'white' points will have the same effect.
-fx" operator provides a more obvious way of creating a black canvas by clearing all the pixels to zero. However you will also need to reset the alpha channel to make it fully opaque.
-evaluate" version of this should be faster, particularly on larger images.
-gamma" operator to make an image all black.
Alpha Operator
-level" operator with same argument for both 'black' and 'white' points will have the same effect.
-fx" operator.
-evaluate" version of this should be faster, particularly on larger images.
Alpha Operator
However as this is a very recent addition it is probably not widely available yet.
Clear' alpha composition operator, with any overlay image (a single pixel "
-fill" color setting. In this case make it fully-transparent.
-fx" operator.
-evaluate" version of this should be faster, particularly on larger images.
-threshold" but again limiting its effects to just the transparency channel.
Actually in this case we are mathematically dealing with a 'matte' channel, using threshold to set it to the maximum value, rather than zero as we did with the "-fx" operator. This is why a '
如前所述,並且值得重複的是,上述許多方法都依賴於已經具有 Alpha 色版的圖像。如果沒有,請使用「
![]() |
|
純色畫布
直接生成
生成特定顏色和大小的畫布非常簡單。您只需指定「-size
」(如果未指定大小,則默認為「1x1
」),然後使用「canvas:
」生成給定顏色的畫布。如果未指定顏色,則會生成「白色
」畫布。例如... 在這裡,我生成了一個「卡其色 」的畫布。
|
![]() |
更常見的是簡寫(和更傳統)格式的「xc: 」(意思是「X 常量圖像」)。這通常是我使用的格式。例如,這是一個使用 X 窗口顏色為「小麥色 」的圖像。
|
![]() |
使用一些花哨的 圖像讀取修飾符,我們可以將純色畫布圖像指定為單個參數。此技術意味著您可以將特定大小和顏色的「xc」畫布圖像指定為許多 ImageMagick 腳本的單個「輸入圖像」參數。
|
![]() |
如果您已經創建了一個畫布,但需要一個不同顏色的畫布,您可以使用「-opaque 」運算符替換該顏色。
|
![]() |
-scale
」來簡單快速地調整單個像素的大小。在這裡,我們從內建的「rose: 」圖像中抓取玫瑰色。
|
![]() |
創建相同大小的圖像
使用 ImageMagick 時,最基本的技巧之一是生成與某些現有圖像大小相同的畫布。這可以通過將現有圖像轉換為所需的畫布來完成,但保留圖像的原始大小。通常,不僅需要保留圖像的大小,還需要保留所有圖像的元數據。這包括標籤、註釋、顏色配置文件、時間延遲,以及保存的壓縮和深度等內容。如果您想將此類信息標註到新清空的畫布上,或者您打算將原始圖像覆蓋到新畫布上,並且需要保留這些信息,則此元數據可能非常重要。當然,IM 提供了許多方法來做到這一點,通常作為使用各種圖像操作的副作用。只有一小部分方法在將圖像清除為純色方面非常明顯。左邊是一張測試圖像... 不用擔心我是如何生成這個圖像的,這對練習來說並不重要。我設計它包含一系列顏色、透明度和其他特徵,特別是為了讓 IM 在使用時得到良好的鍛鍊。*如果您真的對用於生成此圖像的命令感興趣,可以查看我用來創建它的特殊腳本「generate_test」。* |
![]() |
疊加特定顏色
從 IM v6.4.2-1 開始,您可以使用帶有單一顏色且沒有逗號的「+level-colors 」來設置所有顏色。
|
![]() |
-alpha
」運算符在添加顏色之前(或之後)將透明度設置為有用的值。或者,您可以使用「-channel All
」來確保透明度通道也由顏色重置操作設置。另一個較舊的技術是使用「-colorize
」來覆蓋填充顏色,但使用完全不透明的值。但是,在 IM v6.7.9 之前,它不會更改原始圖像的 Alpha 通道,因此最好先使用「-alpha Off
」禁用 Alpha 通道,或者使用「-alpha Opaque
」使其不透明,即使沒有它也能得到相同的結果。
|
![]() |
從 IM v6.4.3-0 開始,您可以使用「-sparse-color 」運算符將某些點設置為所需的顏色,並使用它提供的任何著色方法將其擴展以覆蓋整個圖像(請參閱下面的稀疏顏色點)。
|
![]() |
一個更通用的方法是使用「-draw 」直接將當前影像中的所有顏色重置為當前的「-fill 」顏色。
|
![]() |
上述所有「簡單」方法的主要缺點是,沒有一個方法可以簡單地將影像重置為當前的「
-background
」顏色。接下來的方法利用Alpha 合成來強制各種運算子用所需的顏色替換影像。這些多影像技術適用於使用「-compose
」的運算子。例如,您可以使用「-flatten 」(請參閱平面化到背景範例),它使用「-background 」顏色建立畫布。
|
![]() |
Dst
」合成方法僅讀取背景畫布,而忽略原始影像的像素顏色。如果您只想抓取原始影像的後設資料(例如註釋或標籤資料),但要用特定顏色和大小的畫布影像替換影像本身,則「-extent 」運算子(請參閱範圍,直接調整影像大小)可能是最佳解決方案。同樣地,使用Dst 」合成方法來忽略原始影像像素資料,以便僅使用「-background 」顏色。
|
![]() |
或者,您可以使用「-border 」(請參閱新增邊框),使用「-bordercolor 」作為顏色來源。
|
![]() |
![]() ![]() |
在 6.1.4 版之前的 IM 版本中,「-border 」方法產生的畫布將無法使用。在此之前,「-border 」運算子產生的背景不是單一的純色,而是由邊框顏色包圍的黑色畫布。不太實用。 |
「FX,DIY 運算子 」運算子提供了一種更靈活(但速度非常慢)的畫布產生方法。您還需要關閉輸入影像的透明度通道,因為預設情況下,「-fx 」不會觸碰透明度通道。
|
![]() |
「-fx 」運算子甚至可以讓您進行一些顏色數學運算。例如,70% 深的金色如何?
|
![]() |
例如,在這裡,我們建立了一個帶有半透明紅色的畫布。但是,當疊加在網頁的「藍色」背景上時,我們會得到一種偏紫紅的顏色。
|
![]() |
-fx
」運算子與透明度一起使用時,您需要設定「-channel
」來修改所有四個「RGBA
」顏色通道。使用選定顏色清空圖像
使用原始圖像中的顏色來製作空白圖像也是可行的,儘管可能有點棘手。當您想使用特定像素作為“背景顏色”時,這是一種很有用的技術。例如,像素 0,0 是一個常見的選擇。![[IM 輸出]](../images/rose.png)
FX、DIY 運算子
」來選擇要用於顏色空白化的像素。
|
![]() |
|
![]() |
|
![]() |
|
![]() |
其他畫布技術
Their lots of other ways of generating canvases of very specific colors, but they are rather obtuse. As such without some heavy commenting, it may not be obvious what you are actually doing when you look at your IM script months or years later. I don't recommend these techniques, but are useful to know if you are using older less flexible versions of IM.Black Canvas
-threshold", and then turn off the transparency channel.Traditionally you can create a black canvas by using " |
magick test.png -threshold 100% -alpha off black_threshold.png |
![[IM Output]](black_threshold.png)
Providing the " |
magick test.png -level 100%,100% -alpha off black_level.png |
![[IM Output]](black_level.png)
The " |
magick test.png -fx 0 -alpha off black_fx.png |
![[IM Output]](black_fx.png)
However the " |
magick test.png -evaluate set 0 -alpha off black_evaluate.png |
![[IM Output]](black_evaluate.png)
You can also mis-use the " |
magick test.png -gamma 0 -alpha off black_gamma.png |
![[IM Output]](black_gamma.png)
![[IM Output]](black_posterize.png)
A less obvious way is to 'posterize' the image with too few color levels, resulting in only one color being used, black.
|
You can ensure the image is fully transparent then 'extract ' the images mask, using the |
magick test.png -alpha transparent -alpha extract black_alpha.png |
![[IM Output]](black_alpha.png)
White Canvas
-threshold". The value however must be a negative number, just to be sure that all colors will be mapped to white, in all versions of IM.The traditional way is again using " |
magick test.png -threshold -1 -alpha off white_threshold.png |
![[IM Output]](white_threshold.png)
Providing the " |
magick test.png -level -1,-1 -alpha off white_level.png |
![[IM Output]](white_level.png)
You can of course set the pixel values directly using the " |
magick test.png -fx 1.0 -alpha off white_fx.png |
![[IM Output]](white_fx.png)
However the " |
magick test.png -evaluate set 100% -alpha off white_evaluate.png |
![[IM Output]](white_evaluate.png)
![[IM Output]](white_posterize.png)
Or negate some other black canvas generation method.
|
You can ensure the image is fully opaque (no transparency) then 'extract ' the images mask, using the |
magick test.png -alpha opaque -alpha extract white_alpha.png |
![[IM Output]](white_alpha.png)
Transparent Canvas
Probably the most important canvas you want to generate from an existing image is a transparent canvas. You can then draw and add things to this canvas, get it the way you want it, the overlay it onto the original image. -alphatransparent" operator (added IM v6.4.3-7).The fastest and easiest way is to just get IM to directly clear the image to transparency, using the " |
magick test.png -alpha transparent trans_alpha.png |
![[IM Output]](trans_alpha.png)
null:
" in this case) as it will be ignored. We can make a fully-transparent 'black' canvas using the ' |
magick test.png null: -alpha set -compose Clear -composite -compose Over \ trans_compose.png |
![[IM Output]](trans_compose.png)
Here we use the "-draw matte " operator to replace the matte (transparency) channel value with the transparency value of the current " |
magick test.png -alpha set -fill none -draw 'matte 0,0 reset' color_matte.png |
![[IM Output]](color_matte.png)
We can also do this more directly with the " |
magick test.png -alpha set -channel A -fx 0 +channel trans_fx.png |
![[IM Output]](trans_fx.png)
Naturally the " |
magick test.png -alpha set -channel A -evaluate set 0 +channel \ trans_evaluate.png |
![[IM Output]](trans_evaluate.png)
Another way to just make the image fully transparent is to use " |
magick test.png -channel A -threshold -1 +channel trans_threshold.png |
![[IM Output]](trans_threshold.png)
-1
' was used in the above, rather than something like 101%
'. In many of the above image results, the original RGB colors of the original image are still present, they have just been made transparent. For example, here we read in one of the above images and ask IM to turn off the matte/alpha channel in the image so as to make the colors visible again.
|
![]() |
-alpha 開啟
」添加一個,但在這種情況下,您也可以只使用「-alpha 透明」運算子。請參閱 控制圖像透明度 上的範例。 其他畫布著色
除了使用特定顏色之外,只有「-gamma」運算子才真正靈活到足以生成任何主要/次要顏色的畫布。您基本上使用 0
將通道歸零,並使用 -1
最大化通道值。
例如,我在這裡生成一個黃色的畫布...
magick test.png -gamma -1,-1,0 -alpha off yellow_gamma.png
從 IM v6.4.2 開始,您也可以使用「+level
」運算子為所有顏色通道設置特定的灰度級別。
magick test.png +level 40%,40% -alpha off grey_level.png
顏色的漸層
正如您在上面看到的那樣,您可以輕鬆創建純色畫布。但有時您想要更有趣的東西。
一個非常有用的圖像創建運算子是「gradient:
」。例如...
magick -size 100x100 gradient: gradient.jpg
如您所見,默認情況下,「gradient:
」將創建一個頂部為白色、底部為黑色的圖像,並且在圖像高度上具有平滑的灰色陰影。但它不一定是僅灰度漸層,您也可以透過指定一種或兩種顏色來生成不同顏色的漸層。
magick -size 100x100 gradient:blue gradient_range1.jpg
magick -size 100x100 gradient:yellow gradient_range2.jpg
magick -size 100x100 gradient:green-yellow gradient_range3.jpg
magick -size 100x100 gradient:red-blue gradient_range4.jpg
magick -size 100x100 gradient:tomato-steelblue gradient_range5.jpg
請注意,當給定單一顏色時,第二種顏色將是「白色
」或「黑色
」,以產生與給定顏色最大的色距為準。因此,「藍色
」會產生「藍白
」漸層,而「黃色
」會產生「黃黑
」漸層。「紅藍
」漸層在中間顯示出較暗的紫色帶。這種變暗是由於使用了較暗的非線性 sRGB 色彩空間,尤其是在使用強烈的原色時。有關更多詳細信息,請參閱 處理真實圖像。


「gradient:
」目前僅了解 sRGB 色彩空間 顏色表示。因此,您不能使用它在線性 LAB 色彩空間中使用「紅藍
」顏色生成更亮、更正確的「紫色」漸層。
這也意味著您不能使用 HSV 色彩空間生成多色「彩虹」漸層。
但是,您可以相對簡單地「偽造」此類漸層。請參閱下面的 其他色彩空間中的漸層。


漸層目前不能指定為其他角度或涉及兩種以上的顏色。但是,由於此功能是 SVG 漸層中不可或缺的一部分,因此這種情況可能會有所改變,並且漸層選項將得到重大改進。


從 IM v6.3.1 版本開始,用於生成漸層的演算法現在會產生水平均勻的顏色,以便將圖像中每一行的所有像素分配為相同的顏色。也就是說,每行一種顏色。
在此版本之前,「gradient:
」運算子的工作方式是忽略圖像的寬度,只是分配下一個顏色增量,從左上角到右下角逐行進行。
因此,漸層主要是垂直漸層,就像現在一樣,但不是完美的漸層。通常,這一事實只在特殊情況下才重要,例如測試圖像和在圖像映射中使用。
請注意,漸層的行為可能會受到這些定義的影響
gradient:angle=角度(以度為單位)
對於線性漸層,這指定了從 color1 到 color2 的漸層方向,相對於北方(向上)順時針為正方向。對於徑向漸層,這指定了漸層從其正常的 X-Y 方向開始的順時針正旋轉角度。Imagemagick 6.9.2-5 版本開始支援。
gradient:bounding-box=寬x高+X偏移+Y偏移
將漸層限制在比圖像尺寸更大或更小的區域。如果邊界框定義的區域小於圖像,則 color1 將作為背景顏色。Imagemagick 6.9.2-5 版本開始支援。
gradient:center=x,y
指定徑向漸層中心點的坐標。預設值是圖像的中心。Imagemagick 6.9.2-5 版本開始支援。
gradient:direction=值
指定線性漸層朝向頂部/底部/左側/右側或對角線方向的方向。選項為:NorthWest、North、Northeast、West、East、SouthWest、South、SouthEast。Imagemagick 6.9.2-5 版本開始支援。
gradient:extent=值
指定以圖像為中心的徑向漸層的形狀。選項為:Circle、Diagonal、Ellipse、Maximum、Minimum。Circle 和 Maximum 即使對於矩形圖像也會繪製圓形徑向漸層,其半徑等於圖像半寬和半高中的較大值。Circle 和 Maximum 選項都等效於預設的徑向漸層。Minimum 選項即使對於矩形圖像也會繪製圓形徑向漸層,其半徑等於圖像半寬和半高中的較小值。Diagonal 選項即使對於矩形圖像也會繪製圓形徑向漸層,其半徑等於圖像的半對角線。Ellipse 選項為矩形圖像繪製橢圓徑向漸層,其半徑等於圖像寬度和高度的一半。Imagemagick 6.9.2-5 版本開始支援。
gradient:radii=x,y
指定漸層的 x 和 y 半徑。如果 x 半徑和 y 半徑相等,則徑向漸層的形狀將為圓形。如果它們不同,則形狀將為橢圓形。預設值是圖像半寬和半高中的最大值。Imagemagick 6.9.2-5 版本開始支援。
gradient:vector=x1,y1,x2,y2
指定從向量 1 (x1,y1) 到向量 2 (x2,y2) 的線性漸層方向。顏色 1(fromColor)將位於向量位置 x1,y1 處,顏色 2(toColor)將位於向量位置 x2,y2 處。Imagemagick 6.9.2-5 版本開始支援。
徑向漸層
從 IM v6.4.4 版本開始,您也可以用類似的方式生成徑向漸層圖像。
magick -size 100x100 radial-gradient: rgradient.jpg
請注意,漸層以生成的圖像的中心為中心,其直徑設置為適合圖像的 X 或 Y 尺寸中較大的一個。因此,如果圖像的尺寸不是正方形,您將獲得一個“裁剪”的徑向漸層。
magick -size 100x60 radial-gradient: rgradient_clip.jpg
通過使一邊比另一邊大 1.42 倍(2 的平方根),然後裁剪它,您可以輕鬆地生成從中心到角落的方形徑向漸層。
magick -size 100x142 radial-gradient: \
-gravity center -crop 100x100+0+0 rgradient_crop.jpg
漸層本身的顏色遵循與更舊的線性「gradient:
」圖像生成器相同的約定。
magick -size 100x100 radial-gradient:blue rgradient_range1.jpg
magick -size 100x100 radial-gradient:yellow rgradient_range2.jpg
magick -size 100x100 radial-gradient:green-yellow rgradient_range3.jpg
magick -size 100x100 radial-gradient:red-blue rgradient_range4.jpg
magick -size 100x100 radial-gradient:tomato-steelblue rgradient_range5.jpg
具有透明度的漸層
從 IM v6.2.9-8 開始,「gradient:
」(以及後來的「radial-gradient:
」)圖像創建運算符可以理解透明和半透明顏色的使用。
magick -size 100x100 gradient:none-firebrick gradient_transparent.png


在 ImageMagick 6.5.4-7 之前,涉及完全透明的漸變(例如最後一個範例)通常會產生黑色光暈。
發生的情況是,生成的漸變是從給定顏色到特殊顏色「none
」或透明黑色的漸變。結果,顏色會在變成完全透明之前變成半透明的黑色。
解決此問題的方法是生成透明度漸變,然後使用所需顏色對其進行著色。
magick -size 100x100 gradient:none-black \
-fill firebrick -colorize 100% gradient_trans_colorize.png
透過直方圖調整的漸變
您可以透過對線性漸變應用某種形式的直方圖調整來創建非線性漸變。例如,您可以使用S 形對比度函數來創建更自然的漸變。
magick -size 100x100 gradient: -sigmoidal-contrast 6,50% \
gradient_sigmoidal.jpg
這種漸變特別適用於生成重疊照片,因為它消除了重疊區域開始處的急劇漸變變化。評估/函數漸變
您還可以可以使用評估運算符和相關的函數運算符來修改簡單的線性漸變。
magick -size 100x100 gradient: -evaluate cos 0.5 -negate \
gradient_cosine.jpg
或者更進一步,在線性漸變的中心創建一個平滑的拋物線峰值。
magick -size 100x100 gradient: -function Polynomial -4,4,0 \
gradient_peak.jpg
或者帶狀或波紋圖案...
magick -size 100x100 gradient: -function sinusoid 4,-90 \
gradient_bands.jpg
這兩個密切相關的運算符都允許您基於正弦曲線、多項式、對數和冪數學函數來修改圖像和漸變。有關更多範例,請參見評估數學函數和函數、多參數評估。扭曲漸層
旋轉漸變
雖然稀疏顏色方法「重心
」(見下文)提供了一種在任何角度生成漸變的便捷方法,但如果您的 IM 版本早於 6.4.3-0,則您可能需要使用其他方法來生成對角線或旋轉漸變。例如,透過增加漸變圖像的大小(乘以 2 的平方根或 1.42),然後將其旋轉 45 度,並將圖像裁剪為最終大小,您可以創建對角線漸變。
magick -size 142x142 gradient: -rotate -45 \
-gravity center -crop 100x100+0+0 +repage \
gradient_diagonal.jpg
從 IM v6.3.5 開始,您可以使用SRT 失真以更快、更簡單的方式生成旋轉漸變。例如,以下是在 100x100 像素圖像中旋轉 60 度的 100 像素漸變。
magick -size 100x100 gradient: -distort SRT 60 gradient_srt.jpg
這使用預設的虛擬像素、邊緣設置來確保整個圖像都被請求的漸變覆蓋。您還可以可以使用專家扭曲視口設置將漸變映射到更大的圖像上,例如用於重疊照片。扭曲漸變
但是您可以使用相同的失真方法來執行比簡單旋轉更多的事情。
漸變也可以扭曲...
magick -size 100x100 gradient: -swirl 180 gradient_swirl.jpg
您可以將漸變重新映射為梯形。
magick -size 100x100 gradient: -rotate -90 \
-distort Perspective '0,0 40,0 99,0 59,0 0,99 -10,99 99,99 109,99' \
gradient_trapezoid.jpg
或者使用常規失真運算符將漸變包裹成弧形和圓形...
magick -size 100x100 gradient: -distort Arc '180 0 50 0' \
gradient_arc.jpg
magick -size 100x100 gradient: -distort Arc '360 0 50 0' \
gradient_circle.jpg
雖然新的「radial-gradient:
」可能是生成這些漸變的更簡單方法。一個非常有用但難以生成的漸變是極角漸變。這種漸變的確切形式取決於漸變是否應以偶數大小的圖像或奇數大小的圖像為中心。例如,可以使用圓弧失真生成像素尺寸為偶數的圖像,在本例中為 76 個像素。
magick -size 1x1000 gradient: -rotate 90 \
-distort Arc '360 -90 50 0' +repage \
-gravity center -crop 76x76+0+0 +repage gradient_angle_even.png
上面程式碼中的「-90
」設定了「不連續點」的角度,即「零」和「最大值」環繞到相同值的點。值「50
」應設為最終裁剪後影像大小的一半以上。請注意,我如何使用更長的漸層來產生較小的影像。這提高了結果的整體正確性,尤其是在影像變大時。與之密切相關的極座標扭曲也可以產生這樣的漸層,但由於它可以控制扭曲「中心」的確切位置,因此您可以確保它正確地生成奇數像素大小的極座標漸層影像。在這種情況下,75 像素的影像(半徑 =「36.5
」)
magick -size 1x1000 gradient: -rotate 90 \
+distort Polar '36.5,0,.5,.5' +repage \
-transverse gradient_angle_odd.png
最後兩張影像可能看起來非常相似,除了它們的大小之外,但它們對最中心像素的處理略有不同。如果您仔細觀察,您會發現最後一個範例有一個完美的灰色中心像素,而前一個範例沒有一個中心像素,而是有四個。影像的最終大小由值「36.5
」決定,它是所需「75
」像素的一半。「.5
」偏移量是正確處理極座標中心的關鍵。請注意,預設情況下,扭曲會將不連續點放置在影像的頂部,因此橫向扭曲會校正不連續點的角度和位置,以匹配弧形扭曲產生的結果。以下是一個略有不同的變體,它生成一個角度漸層,但帶有一個透明的圓形遮罩。
magick -size 50x1000 gradient: -rotate 90 -alpha set \
-virtual-pixel Transparent +distort Polar 49 +repage \
-transverse gradient_angle_masked.png
值「49
」是半徑減 1,因為預設情況下,扭曲會在生成的影像周圍添加 1 個像素的反鋸齒緩衝區。因此,最終影像為 100x100 像素。
圓形和漸層可以扭曲以產生一些有趣的非線性漸層。例如,使用波浪扭曲將其弧形化可以生成大致呈三角形的漸層。
magick -size 100x100 radial-gradient: \
-background black -wave -28x200 -crop 100x100+0+0 +repage \
gradient_triangle.jpg
或者是由沿著圓形頂部邊緣的極座標扭曲生成的非常奇怪的鳥狀形狀。
magick -size 100x100 radial-gradient: \
+distort Polar '49' +repage \
gradient_bird.jpg
通過合成實現漸層
您也可以使用各種合成方法組合漸層來修改它們。例如,您可以使用模加合成方法來生成百葉窗類型的漸層。
magick -size 100x100 gradient: \( +clone +clone \) \
-background gray50 -compose ModulusAdd -flatten \
gradient_venetian.jpg
甚至可以對角地做到這一點。
magick -size 100x100 gradient: \( gradient: -rotate -90 \) \
\( -clone 0--1 -clone 0--1 \) \
-background gray50 -compose ModulusAdd -flatten \
gradient_vent_diag.jpg
或者,通過使用通道複製或數學混合合成方法混合兩種純色漸層,您可以生成彩色二維色圖漸層。
magick -size 100x100 gradient:yellow-blue \
\( gradient:black-lime -rotate -90 \) \
-compose CopyGreen -composite gradient_colormap.jpg
其他色彩空間中的漸層
雖然「gradient:
」生成器目前無法直接在其他一些色彩空間中生成漸層(僅建立非線性 sRGB 漸層影像),但您可以將漸層轉移到不同的色彩空間以生成有趣的效果。例如...
magick -size 30x600 xc:red -colorspace HSB \
gradient: -compose CopyRed -composite \
-colorspace RGB -rotate 90 gradient_rainbow.jpg
這首先將高度飽和的顏色(「紅色
」)轉換為 HSL 色彩空間,可以使用任何飽和的顏色。這會正確地將影像的飽和度和亮度通道設置為適當的值。之後,會生成一個漸層並將其複製到此 HSL 色彩空間影像的「色相」(相當於「紅色」)通道中。當我們將 HSL 影像變回 RGB 時,我們就得到了一個充滿飽和顏色的完整彩虹漸層。另一種方法是為其中一種色彩空間生成具有適當值的漸層,然後更改影像的色彩空間(使用「-set
」)。這會在不更改我們在影像中建立的顏色值的情況下更改色彩空間。現在,當我們變回 RGB 時,我們會得到相同的彩虹值。
magick -size 30x600 gradient:'#FFF-#0FF' -rotate 90 \
-set colorspace HSB -colorspace RGB \
gradient_rainbow_2.jpg
結果實際上與前一種方法完全相同,只是更直接一些,因為我們為所需的色彩空間生成正確的值,然後設置這些值所屬的色彩空間。 在這裡,我們採用蒙版角度漸變(見上文)並將其重新映射到 HSB 色彩空間中,以生成圓形色調的顏色。 紅色(色調 = 0)向右旋轉,到達傳統放置的位置(極坐標角度 0)。
magick -size 100x300 gradient:'#FFF-#0FF' -rotate 90 \
-alpha set -virtual-pixel Transparent +distort Polar 49 +repage \
-rotate 90 -set colorspace HSB -colorspace RGB \
gradient_hue_polar.png
與上述類似的示例是色輪,它是通過組合通道圖像與色調和亮度漸變生成的。 調整大小的漸變
Glenn Randers-Pehrson 提出的一個技巧是創建一個非常小的圖像,只有兩個像素寬,然後使用「-resize
」將其擴展到所需的圖像大小。 調整大小運算符會嘗試平滑放大的圖像,使其在更大的比例下看起來更好。 我們使用這種平滑來生成非線性漸變。
例如,在這裡,我們使用“可移植位圖”(或 PBM 格式)圖像生成小圖像,並將其輸入 IM 進行放大。
echo "P1 1 2 0 1 " | \
magick - -resize 100x100\! gradient_resize.jpg


某些 shell(如“csh”及其變體)無法很好地處理上述調整大小幾何設置中的“!
”字符,即使在引號中也是如此。 因此,可能需要使用反斜杠“\
”字符。 請謹慎使用。
生成的漸變不是線性的,給定顏色的開始和結束都很平滑,使得這些顏色比使用普通漸變獲得的顏色更加明顯。 漸變遵循的實際函數取決於(並且接近於)調整大小所使用的確切重新採樣濾鏡。
生成初始兩像素圖像的一種簡單方法實際上是使用漸變本身! 這使您可以直接指定顏色。 當然,除非您也旋轉結果,否則這將限制您只能使用垂直漸變。
magick -size 1x2 gradient:khaki-tomato \
-resize 100x100\! gradient_resize2.jpg
當然,使用這種技術,您不僅限於單一維度。 在這裡,我使用四像素的“可移植灰度圖”(或 PGM 圖像格式)來生成二維漸變。
echo "P2 2 2 2 2 1 1 0 " | \
magick - -resize 100x100\! gradient_resize3.jpg
如您所見,與上面的旋轉漸變相比,此對角線漸變不是非常線性。


網絡可移植位圖圖像格式對於從腳本生成圖像非常通用。 作為生成或操作圖像數據的一種方法,這種格式非常值得了解。
如果您仔細觀察,您還會發現漸變也從放大像素的中心開始,並且沒有從邊緣到邊緣覆蓋整個圖像。 如果我們使用三角形調整大小濾鏡,這一點會變得更加清晰。
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-filter triangle -resize 100x100\! gradient_resize4.jpg
調整大小運算符根據「重新採樣濾鏡
」設置平滑這些像素之間的顏色。 通過調整濾鏡,您可以使調整大小的漸變產生更邊緣到邊緣的效果。
magick -size 1x2 gradient: \
-filter Cubic -resize 100x100\! gradient_resize5.jpg
這是使用“調整大小”技術創建的粗略“彩虹漸變”。
magick xc:black xc:red xc:yellow xc:green1 xc:cyan xc:blue xc:black \
+append -filter Cubic -resize 600x30\! gradient_rs_rainbow.jpg
使用這種方法,您可以對漸變生成使用任何顏色組合和順序。 這使得它非常適合生成顏色查找表。 插值查找漸層
有關「-interpolate
」設置的更多信息,請參閱插值設置。 生成漸變的另一種方法是使用特殊的插值設置。 此設置用於確定當像素查找不是整數時返回的像素顏色,因此不與特定像素完全匹配。 然後,插值根據查找點周圍的像素確定顏色。 例如,“雙線性
”的默認設置將線性確定落在兩個像素之間的查找的顏色。
magick -size 600x30 xc: \( +size xc:gold xc:firebrick +append \) \
-fx 'v.p{i/(w-1),0}' gradient_interpolated.jpg
在這裡,查找 X 位置「i/(w-1)
」在第二個兩像素圖像上從「0.0
」到「1.0
」。浮點數會產生完美的線性漸層,就像「gradient:
」一樣。以上實際上幾乎等同於(請參閱完美漸層瞭解差異)使用Clut 重新著色圖像」通過對兩種顏色圖像進行插值查找來重新著色漸層圖像。
magick -size 30x600 gradient: -rotate 90 \
\( +size xc:gold xc:firebrick +append \) -clut \
gradient_clut_recolored.jpg
使用這種方法還可以生成多色漸層。
magick -size 30x600 gradient: -rotate 90 -interpolate Bicubic \
\( +size xc:black xc:tomato xc:wheat +append \) -clut \
gradient_clut.jpg
但是,限制是顏色只能以相等的間距定義。您不能簡單地移動中間顏色的位置,除非通過粗略地將輸入漸層修改為某種非線性形式,以便移動該中心。對於三種以上顏色的情況,情況會變得更糟。以上也是使用雙色調為灰度圖像著色的好技術,保證可以精確定義中間色調顏色(與使用色調運算符不同)。
插值查找漸層也可以擴展到二維,並像純一維漸層一樣輕鬆地生成方形線性漸層(雙線性插值)。
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-size 100x100 xc: +swap -fx 'v.p{i/(w-1),j/(h-1)}' \
gradient_bilinear.jpg
以下是相同的示例,但使用Catrom 插值,並使用變形運算符而不是非常慢的 FX 運算符生成。
magick \( xc:red xc:blue +append \) \
\( xc:yellow xc:cyan +append \) -append \
-filter point -interpolate catrom \
-define distort:viewport=100x100 \
-distort Affine '.5,.5 .5,.5 1.5,1.5 99.5,99.5' \
gradient_catrom.jpg
理解以上內容的關鍵是我們正在根據像素中心放大小圖像。有關詳細信息,請參閱圖像坐標與像素坐標。請注意,大多數插值方法都具有等效的插值調整大小濾鏡。但是,使用視口和像素坐標可以消除先前調整大小漸層中顯示的邊緣效應,這些效應是由於非常小的圖像的極端放大造成的。
但是,網格插值設置不能作為調整大小濾鏡使用。它是一種特殊的二維插值,它將像素內區域劃分為兩個平坦的線性三角形,沿著連接角點的對角線鉸接,顏色差異最小。因此,通過使兩種顏色相同,並使用「-interpolate mesh
」,您可以生成非常不同的二維漸層。
magick \( xc:red xc:gold +append \) \
\( xc:gold xc:green +append \) -append \
-filter point -interpolate mesh \
-define distort:viewport=100x100 \
-distort Affine '.5,.5 .5,.5 1.5,1.5 99.5,99.5' \
gradient_mesh.jpg
由於兩個對角線相對的黃色角點顏色相同,因此使用黃色對角線將它們連接起來。其他顏色線性映射到這些三角形。如果兩種對角線顏色不同,您可能會得到不同的對角線劃分。滾動您自己的漸層
FX DIY 運算符允許您根據當前像素位置定義自己的漸層或其他圖像生成。由於此運算符需要圖像才能工作,因此您可以生成漸層或其他圖像以匹配該圖像。也就是說,您不必知道圖像的大小即可為其生成漸層!例如,您可以輕鬆地生成線性漸層,其大小適合您可能正在處理的圖像。
magick rose: -channel G -fx 'i/w' -separate gradient_fx_linear.gif


生成灰度漸層時,您可以使 -fx 運算符的速度提高 3 倍,只需要求它僅生成一個顏色通道,例如上述示例中的「G
」或綠色通道。然後可以分離此通道以形成所需的灰度圖像。這可以表示速度的大幅提升,尤其是在使用非常複雜的「-fx
」公式時。
您甚至可以生成一些漂亮的非線性漸層。
magick rose: -channel G -fx '(i/w)^4' -separate gradient_fx_x4.gif
magick rose: -channel G -fx 'cos(pi*(i/w-.5))' \
-separate gradient_fx_cos.gif
二維圓形線性徑向漸層(圓錐)怎麼樣?
magick -size 100x100 xc: -channel G \
-fx 'rr=hypot(i/w-.5, j/h-.5); 1-rr*1.42' \
-separate gradient_fx_radial.gif


IM v6.3.6 版本中新增了「-fx
」函數「rr=hypot(xx,yy)
」,用於加速處理常用的表達式「rr=sqrt(xx*xx+yy*yy)
」。這也表示我們在建立徑向漸層時,不再需要進行額外的賦值操作,例如「xx=i/w-.5
」。
上述範例中的數值「1.42
」(或 sqrt(2)
)控制著漸層相對於影像尺寸的整體大小。透過這種方式,漸層的半徑(黑色距離中心的距離)即為到角落的對角線距離。
您甚至可以從表達式中移除「sqrt()
」(內建於「hypot()
」函數中),以建立更有趣的球形漸層,這在處理3D 明暗效果時非常有用。
magick -size 100x100 xc: -channel G \
-fx 'xx=i/w-.5; yy=j/h-.5; rr=xx*xx+yy*yy; 1-rr*4' \
-separate gradient_fx_spherical.gif
請注意我是如何使用一些賦值表達式來簡化影像中心距離的計算,然後將其轉換為漸層的。此功能已於 IM v6.3.0 版本中新增。
透過使用高次冪函數,您可以讓照片在矩形邊緣周圍產生淡出效果。調整冪值「4
」可以控制淡出的程度。
magick -size 100x100 xc: -channel G \
-fx '(1-(2*i/w-1)^4)*(1-(2*j/h-1)^4)' \
-separate gradient_fx_quad2.gif
以下是一個使用直接數學方法產生的角度漸層。
magick -size 100x100 xc: -channel G \
-fx '.5 - atan2(j-h/2,w/2-i)/pi/2' \
-separate gradient_fx_angular.gif
請注意,「atan2(y,x)
」函數會傳回以弧度表示的 -PI 到 +PI 之間的角度(請參閱其說明頁面),因此需要對其輸出進行縮放和平移,才能正確地符合 0.0 到 1.0 的色彩範圍。這就是為什麼上述範例看起來比實際上複雜得多的原因。最後一個範例可以透過扭曲漸層更快地產生。 更複雜的 DIY 漸層
題外話:本節是在新增稀疏色彩點之前建立的,並且對其建立產生了直接影響。 當然,FX 函數可以產生色彩漸層。例如,以下是一個基於距離比例的漸層,使用了極其複雜的 FX 表達式。
magick -size 100x100 xc: +size xc:red xc:yellow -colorspace RGB \
-fx 'ar=hypot( i/w-.8, j/h-.3 )*4;
br=hypot( i/w-.3, j/h-.7 )*4;
u[1]*br/(ar+br) + u[2]*ar/(ar+br)' \
-colorspace RGB gradient_dist_ratio.gif


影像處理是在線性色彩空間 (RGB) 中進行的,以避免在混合這些強烈的原色時出現「sRGB 變暗」的情況。如需更多詳細資訊,請參閱處理真實影像。
當從兩個點變為三個點時,每個「控制點」提供的色彩比例會變得更加複雜,並且會使用一種稱為反距離加權 (IDW) 插值法的技術。您可以在維基百科,IDW中找到更多關於此方法的數學細節。以下是一個包含三個點的反距離加權範例。
magick -size 100x100 xc: +size xc:red xc:yellow xc:lime -colorspace RGB \
-fx 'ar=1/max(1, hypot(i-50,j-10) );
br=1/max(1, hypot(i-10,j-70) );
cr=1/max(1, hypot(i-90,j-90) );
( u[1]*ar + u[2]*br + u[3]*cr )/( ar+br+cr )' \
-colorspace sRGB gradient_inverse.gif
在這裡,我使用了反平方距離,這是 IDW 插值法中更常用的方法。這也被稱為 Shepard 插值法。
magick -size 100x100 xc: +size xc:red xc:yellow xc:lime -colorspace RGB \
-fx 'ar=1/max(1, (i-50)*(i-50)+(j-10)*(j-10) );
br=1/max(1, (i-10)*(i-10)+(j-70)*(j-70) );
cr=1/max(1, (i-90)*(i-90)+(j-90)*(j-90) );
( u[1]*ar + u[2]*br + u[3]*cr )/( ar+br+cr )' \
-colorspace sRGB gradient_shepards.gif
請注意,上述範例中並未使用「hypot()
」函數,因為不需要產生距離的平方根。上述範例現在已使用稀疏色彩方法「反向
」和「Shepard
」來實作。因此,現在可以使用以下更簡單的方式來完成上述操作...
magick -size 100x100 xc: -colorspace RGB \
-sparse-color Inverse '50,10 red 10,70 yellow 90,90 lime' \
-colorspace sRGB gradient_inverse_alt.gif
magick -size 100x100 xc: -colorspace RGB \
-sparse-color Shepards '50,10 red 10,70 yellow 90,90 lime' \
-colorspace sRGB gradient_shepards_alt.gif
使用「反距離」或「Shepard 方法」(反平方距離)的問題在於,所有「控制點」都會對整個影像產生全局影響。因此,您會在點與點之間,尤其是在距離所有控制點很遠的地方,得到一種底層的「平均色彩」。反過來,這會產生色彩的「斑點」,而不是平滑的色彩漸層。 DIY 漸層和色調
-- (色調很難處理)
旁白:這是一種嘗試產生有趣彩虹效果的失敗嘗試。雖然失敗了,但我從中學到了很多,並在此呈現給大家。 以上方法效果很好,但我想嘗試做得更好。我想也許我可以在點之間生成明亮的彩虹顏色漸變,而不是生成融合成平均顏色的斑點。因此,為了生成色相漸變,我嘗試在 HSB 色彩空間中進行反距離加權插值,儘管我將黃色切換為藍色,使顏色在色相環上更加均勻分佈,並希望提供另一種生成色輪的方式(請參閱上面的其他色彩空間中的漸變)。
magick -size 100x100 xc: +size xc:red xc:blue xc:lime -colorspace HSB \
-fx 'ar=1/max(1, (i-50)*(i-50)+(j-10)*(j-10) );
br=1/max(1, (i-10)*(i-10)+(j-70)*(j-70) );
cr=1/max(1, (i-90)*(i-90)+(j-90)*(j-90) );
( u[1]*ar + u[2]*br + u[3]*cr )/( ar+br+cr )' \
-colorspace sRGB gradient_shepards_HSB.gif
如您所見,所有顏色都很好且明亮,因為我們只生成色相漸變。然而,它看起來也很奇怪,這是由“色相”顏色通道的“循環”性質造成的。結果,藍色和紅色之間的區域通過綠色色相繞了遠路,而不是通過紫色色相的較短“模數”路徑。經過大量研究,我終於發現了如何使用循環平均值來正確計算距離的加權平均值來完成上述操作所需的模數數學。這涉及將作為極角的色相轉換為 X 和 Y 直角坐標。這使您可以執行線性數學,從而讓我們適當地對值進行線性加權。然後將結果轉換回角色相。
magick -size 100x100 xc: +size xc:red xc:blue xc:lime \
-colorspace HSB -channel R \
-fx 'aa=u[1]*2*pi; ba=u[2]*2*pi; ca=u[3]*2*pi;
ar=1/max(1, hypot(i-50,j-10) );
br=1/max(1, hypot(i-10,j-70) );
cr=1/max(1, hypot(i-90,j-90) );
nr=ar+br+cr;
mod(atan2( ( sin(aa)*ar + sin(ba)*br + sin(ca)*cr )/nr,
( cos(aa)*ar + cos(ba)*br + cos(ca)*cr )/nr
)/(2*pi)+1, 1)' \
-separate -background white -combine +channel \
-set colorspace HSB -colorspace sRGB gradient_circular_mean_hue.gif
注意:以上僅對色相通道執行操作。對於真實圖像,我們仍然需要像往常一樣對飽和度和亮度通道進行操作。如您所見,我們現在在紅色和藍色之間獲得了正確的漸變,儘管當應用於具有較大角間隔的原色時,該方法往往會在中間產生非常突然的漸變變化。也就是說,雖然結果是正確的,但對於色相效應的巨大變化,角色相變化不是線性的。它適用於平均大量接近的色相,但不適用於這些間隔較大的原色。我什至嘗試使用更強的“反向加權”,而不是更常用的“反平方”或“Shepard”方法(見上文),雖然它有所改進,但由於非線性效應,色相變化仍然在中心壓縮。由於輸入顏色是恆定的,因此將它們預先轉換為色相-x 和色相-y 坐標,在這些通道上進行 Shepard 加權,然後再轉換回來,實際上會使過程更快。也就是說,將顏色從 HSB 色彩空間轉換為 Hx、Hy、S、B 色彩空間,以應用該技術。如果這樣做,則點之間的中心點甚至漸變將變為白色(HSB 色彩空間的中心點)。如果在 HSL 色彩空間中執行此操作,則該區域將變為中等灰色。
這種從極坐標色相到 X-Y 坐標的轉換在某些方面類似於在非極坐標 RGB 空間中進行計算,這顯示出相同的朝向灰色效應的陰影(參見前面的示例)。因此,如果通過使用循環平均值,我們實際上只是將 HSB 色彩空間轉換為高度失真的變體 RGB,那麼為什麼不直接在線性 RGB 色彩空間中完成任務,並使顏色飽和,以生成色相呢!
magick -size 100x100 xc: -colorspace RGB \
-sparse-color Inverse '50,10 red 10,70 blue 90,90 lime' \
-colorspace sRGB gradient_inverse_RGB.png
magick gradient_inverse_RGB.png -colorspace HSB \
-channel GB -evaluate set 100% +channel \
-colorspace sRGB gradient_inverse_RGB_Hue.gif


影像處理是在線性色彩空間 (RGB) 中進行的,以避免在混合這些強烈的原色時出現「sRGB 變暗」的情況。如需更多詳細資訊,請參閱處理真實影像。
如您所見,我們得到了與之前幾乎完全相同的結果,但移除了所有復雜的“模數數學”。然而,我仍然無法在顏色的起點之間獲得更線性的色調分佈。這一切的寓意是,處理色調很困難,不僅僅是由於“紅色不連續性”,還因為當顏色間隔很寬時會出現非線性效應。最後的結果和我直接在線性 RGB 空間中完成任務並使顏色飽和相同。從本質上講,雖然 HSB 和 HSL 色彩空間很有趣,但它們並不是線性、真實或實用的色彩空間。這可能也是很少有操作直接使用色調的原因。 產生完美的漸層(數學上)
產生完美的數學漸層,例如用於 傅立葉變換(循環的)、圖像映射,甚至 漸層數學;需要與我們目前看到的漸層不同的特殊漸層。
這是什麼意思?這是一個小的 1x5 像素“gradient:
”圖像,我已經對其進行了 縮放,以便您可以看到單個像素的顏色。
magick -size 1x5 gradient: -scale 2000% gradient.png
此圖像創建了一個漸層,從最頂行的精確“白色”到最底行的精確“黑色”。它是一個“理想化”的漸層,通常正是用戶想要的,因為它實際上包含了用戶指定的實際顏色。然而,雖然這是用戶所期望的,但它在數學上並不是正確的漸層。正如在 圖像坐標與像素坐標 中所討論的,像素實際上有一個區域,因此圖像頂部的白色像素代表該像素的中心,而黑色代表最底部像素的中心。也就是說,不是圖像的邊緣,而是距離邊緣 1/2 像素。在數學上,圖像從邊緣開始。因此,要產生完美的數學漸層,您需要在像素坐標中指定圖像邊緣的顏色位置。因此,在圖像坐標中,位置偏移了 1/2 個像素,並且圖像大小正好是圖像中的像素數(距離),而不是比圖像大小小 1 個像素的位置。產生數學上完美的漸層的一種方法是使用 重心稀疏顏色(下一節將詳細介紹)來產生完美的邊緣到邊緣漸層...
magick -size 1x5 xc: \
-sparse-color Barycentric '0,-0.5 white 0,%[fx:h-.5] black' \
-scale 2000% gradient_math.png
請注意,使用的坐標從 -0.5
到圖像高度減去 0.5
,即圖像實際邊緣的像素坐標。如果您仔細觀察結果,您會發現最頂部和最底部的像素顏色不是白色或黑色。像素是漸層在像素中心的顏色。由於此漸層在數學上是正確的,因此在特殊“平鋪”或“循環”情況下使用時,此漸層將“正確”平鋪。先前的漸層圖像將無法“正確”平鋪。您會得到一個純白色像素,緊挨著純黑色像素,從而產生一個像素的間隙或數學循環中的“分離”,在這種情況下,純白色和純黑色通常被視為等效值。更簡單的方法是生成一個“gradient:
”圖像,該圖像長一個像素,並從任一端(根據當前的“-gravity
”設置)切掉一個像素。
例如,這裡切掉了最上面的白色像素,因為在最終結果中,黑色像素(或零值)通常更可取。
magick -size 1x6 gradient: -chop 0x1 -scale 2000% gradient_chopped.png
產生的漸層圖像可以根據需要旋轉,以便生成後續圖像處理所需的圖像。 然而,雖然這個漸層會正確地「循環」,但顏色的實際位置並不完全正確。 但在很多情況下,這已經足夠好了。 如果您需要「完美的漸層」,我建議您使用稀疏顏色漸層。 總之...仔細考慮您希望漸層呈現的效果,可以讓最終結果的準確性產生很大的差異。 但如果這沒有關係,那就不用擔心,使用手邊任務最簡單的方法即可。
稀疏顏色點
IM v6.4.3-0 中添加了「-sparse-color
」運算子,它會取得一張圖像,並在給定的每個浮點數「x,y
」坐標處設置給定的顏色。 也就是說,採用以下形式...
-sparse-color {method} 'x,y color x,y color x,y color ...'
其餘像素(根據「-channel
」設置限制)將根據它們與這些孤立顏色點的關係進行映射,以便使這些點之間的顏色平滑過渡。 方法定義了這種關係。 當然,有很多方法可以定義中間顏色應該是什麼,而您選擇哪種方法實際上取決於您想要達到的效果。 它實際上也可以被歸類為一種完全自由形式的二維插值(參見插值,維基百科)。 圖像放大或調整大小實際上是這方面的一個特殊子集,但它需要從一個完整的固定像素網格開始放大。 不幸的是,專門設計用於處理像素網格的調整大小濾鏡或插值方法很少可以直接轉換為一組自由形式的稀疏分離的顏色點。 也就是說,涉及不完整網格的調整大小是行不通的。 這也與「地理信息系統 (GIS)」方法有關,該方法使用稀疏分離的高度點(很少在嚴格的網格中)來測量景觀,其餘景觀則由這些孤立的點確定。 在類似的情況下,氣象學通常具有孤立的氣壓和溫度點,然後需要對其進行插值。 通常在插值之後,會進一步處理地圖以生成「等值線」,顯示具有相同值(高度、壓力、溫度)的點,從而生成幾乎每個人都熟悉的各種天氣圖。 在這種情況下,您可以將生成的圖像視為輸入數據的簡單灰度「高度圖」,或者甚至可以將三個變量同時視為單獨的圖像「通道」。 重心(三角形漸層)
「Barycentric
」方法會將三個且僅三個點映射到線性顏色三角形中。 這個三角形之外的顏色保持不變。 我在輸入點上標記了一個小圓圈,這樣您看到的顏色都是由稀疏顏色運算子生成的插值。
magick -size 100x100 xc: -colorspace RGB \
-sparse-color Barycentric '30,10 red 10,80 blue 90,90 lime' \
-colorspace sRGB -fill white -stroke black \
-draw 'circle 30,10 30,12 circle 10,80 10,82 circle 90,90 90,92' \
sparse_barycentric.png


影像處理是在線性色彩空間 (RGB) 中進行的,以避免在混合這些強烈的原色時出現「sRGB 變暗」的情況。如需更多詳細資訊,請參閱處理真實影像。
如果給定四個或更多點,將對給定的所有點執行「最佳擬合」,因此實際點可能無法獲得為這些點指定的確切顏色。 但是請注意,漸層不會僅僅「停止」,而是會在這些點之外繼續變化。 傳統上,重心漸層將被限制在用於生成它的點的包圍三角形內。 例如..
magick -size 100x100 xc: -colorspace RGB \
-sparse-color Barycentric '30,10 red 10,80 blue 90,90 lime' \
-colorspace sRGB -fill white -stroke black \
\( -size 100x100 xc:black -draw 'polygon 30,10 10,80 90,90' \) \
-alpha off -compose CopyOpacity -composite \
-draw 'circle 30,10 30,12 circle 10,80 10,82 circle 90,90 90,92' \
sparse_bary_triangle.png
這是 Fred Weinhaus 所製作的更快版本,它會在 Alpha Channel 中創建三角形遮罩,預設情況下,稀疏顏色運算器 不會更新該遮罩(由於預設通道設定)。然而,所有顏色(包括完全透明的像素)仍然會被填入顏色,只是套用了 Alpha 遮罩。
magick -size 100x100 xc:none -draw "polygon 30,10 10,80 90,90" \
-colorspace RGB \
-sparse-color Barycentric '30,10 red 10,80 blue 90,90 lime' \
-colorspace sRGB sparse_bary_triangle_2.png


由於繪製方式會在形狀周圍繪製一條額外的線條,因此上面使用的三角形遮罩大了 1/2 像素。詳情請參閱繪製填充邊界。在產生三角形漸變網格時,這可能會產生問題。
「barycentric
」方法實際上是將線性仿射方程式分別映射到三個顏色通道。因此,如果我將上述三點範例的每個顏色通道分開,則每個顏色通道中會得到三個簡單的線性漸變。僅僅是因為使用了原色,上述漸變才全部映射到三角形邊緣之一的平行線上。也就是說,通常情況並非如此。但是您始終會在影像的每個單獨通道中獲得簡單的線性漸變,以及 3D 色彩空間中的平面。 重心和雙色漸層
三角形重心漸變的這種平行效應實際上非常有用。如果將兩個點設定為相同的顏色,則這兩個點將定義它們與另一個彩色點之間漸變的「角度」。例如,通過將兩個點設為「紅色
」,將使漸變與兩個「紅色
」點平行...
magick -size 100x100 xc: -colorspace RGB \
-sparse-color Barycentric '30,10 red 10,80 red 90,90 lime' \
-colorspace sRGB -fill white -stroke black \
-draw 'circle 30,10 30,12 circle 10,80 10,82 circle 90,90 90,92' \
sparse_bary_gradient.png
以下是相同的示例,但其中一個角度控制點已移動,以顯示它如何設定漸變角度。
magick -size 100x100 xc: -colorspace RGB \
-sparse-color Barycentric '50,70 red 10,80 red 90,90 lime' \
-colorspace sRGB -fill white -stroke black \
-draw 'circle 50,70 50,72 circle 10,80 10,82 circle 90,90 90,92' \
sparse_bary_gradient_2.png
對角線漸層
這提供了一種僅使用兩種顏色即可產生任何線性對角線漸變的簡單方法。例如,這是一種為任何大小的輸入影像創建從一個角落到另一個角落的對角線漸變的絕佳方法。
magick -size 600x60 xc: -colorspace RGB \
-sparse-color barycentric '0,0 skyblue -%w,%h skyblue %w,%h black' \
-colorspace sRGB diagonal_gradient.jpg
並與其他兩個角落對齊...
magick -size 600x60 xc: -colorspace RGB \
-sparse-color barycentric '0,%h black -%w,0 black %w,0 skyblue' \
-colorspace sRGB diagonal_gradient_2.jpg
即使是像上面這樣較長的影像,「對角線漸變」也能產生自然的漸變效果。研究三種顏色點的位置,尤其是定義兩個角落之間漸變角度的兩個相同顏色點。請注意,在這兩種情況下,其中一個點甚至不在影像本身內!另請注意使用百分比跳脫字元,以使位置自動調整為正在繪製漸變的影像大小。 兩點漸變
如果僅給定兩個顏色點,IM 將為您產生第三個點,以便角度在兩個原始點之間垂直。結果是一個簡單的線性漸變,您可以對其進行大量控制。
magick -size 100x100 xc: -colorspace RGB \
-sparse-color Barycentric '30,10 red 90,90 lime' \
-colorspace sRGB -fill white -stroke black \
-draw 'circle 30,10 30,12 circle 90,90 90,92' \
sparse_bary_two_point.png
但是,當應用於非常「寬」或「高」的影像(高縱橫比)的角落時,兩點漸變的效果並不好。基本上,漸變不是對角線對齊的,這與上面的三點漸變不同。它是傾斜的,只是傾斜的角度不足以使其「有趣」。
magick -size 600x60 xc: -colorspace RGB \
-sparse-color barycentric '0,0 skyblue %w,%h black' \
-colorspace sRGB sparse_bary_two_point_wide.jpg
雙線性(4 點漸變)
此方法將一個方程式擬合到 4 個點,遍及所有三個顏色通道,以在點之間以及點之外產生均勻的顏色漸變。
magick -size 100x100 xc: -colorspace RGB \
-sparse-color Bilinear '30,10 red 10,80 blue 70,60 lime 80,20 yellow' \
-colorspace sRGB -fill white -stroke black \
-draw 'circle 30,10 30,12 circle 10,80 10,82' \
-draw 'circle 70,60 70,62 circle 80,20 80,22' \
sparse_bilinear.png
您可以通過採用上圖並分離出各個顏色通道漸變來查看此「4 點擬合」。請注意方程式如何產生曲線(實際上是二次曲線)。但是,如果 4 個點形成平行線,則生成的漸變將變為線性。實際上,當 4 個點對齊到正交(矩形)網格時,此方法等效於雙線性插值方法(請參閱下面的插值查找漸變)。如果給定的點少於 4 個,則上述函數將被替換為 3 點「重心
」方法(見上文)。如果給定的點超過四個,它將對所有點進行最佳擬合,因此實際上可能與指定點的給定顏色不匹配。不建議這樣做。 Voronoi(最接近的顏色)
「Voronoi
」方法僅將每個像素映射到您提供的最接近的顏色點。這基本上將圖像劃分為圍繞每個點的一組多邊形「單元格」。例如..
magick -size 100x100 xc: -colorspace RGB \
-sparse-color Voronoi '30,10 red 10,80 blue 70,60 lime 80,20 yellow' \
-colorspace sRGB -fill white -stroke black \
-draw 'circle 30,10 30,12 circle 10,80 10,82' \
-draw 'circle 70,60 70,62 circle 80,20 80,22' \
sparse_voronoi.gif
如您所見,沒有嘗試對每個點周圍的彩色「單元格」進行消除鋸齒處理。每個單元格的邊緣實際上正好落在每個點最近鄰居之間的中間。例如,這可以用於生成以各種方式切割圖像的遮罩。只需將一個點指定為白色,將所有其他點指定為黑色,即可從圖像中提取單個「單元格」。如果您想平滑(消除鋸齒)結果,您可以使用某種形式的超級採樣來平滑圖像。例如,生成一個大小為 4 倍的圖像,然後「-scale
」將其縮放回所需的大小。
magick -size 400x400 xc: -colorspace RGB \
-sparse-color Voronoi '120,40 red 40,320 blue 270,240 lime 320,80 yellow'
\
-scale 25% -colorspace sRGB -fill white -stroke black \
-draw 'circle 30,10 30,12 circle 10,80 10,82' \
-draw 'circle 70,60 70,62 circle 80,20 80,22' \
sparse_voronoi_ssampled.png


所有圖像處理均在線性色彩空間 (RGB) 中執行,以避免在混合此類強原色時出現「sRGB 變暗」現象。有關更多詳細信息,請參閱處理真實圖像。
更簡單的方法(雖然不是很好)是稍微模糊圖像...
magick -size 100x100 xc: -colorspace RGB \
-sparse-color Voronoi '30,10 red 10,80 blue 70,60 lime 80,20 yellow' \
-blur 1x0.7 -colorspace sRGB -fill white -stroke black \
-draw 'circle 30,10 30,12 circle 10,80 10,82' \
-draw 'circle 70,60 70,62 circle 80,20 80,22' \
sparse_voronoi_smoothed.png
通過大量模糊生成的圖像,您可以在生成的「單元格」之間設置一些非線性漸變。
magick -size 100x100 xc: -colorspace RGB \
-sparse-color Voronoi '30,10 red 10,80 blue 70,60 lime 80,20 yellow' \
-blur 0x15 -colorspace sRGB -fill white -stroke black \
-draw 'circle 30,10 30,12 circle 10,80 10,82' \
-draw 'circle 70,60 70,62 circle 80,20 80,22' \
sparse_voronoi_blur.png
「-blur
」越大,各個「單元格」之間的漸變越大。但是請注意,如果它靠近邊緣(和另一個點)並且顏色不同,這可能無法保留小的彩色單元格,或確保原始點保持給定的顏色。通過使用由 Fred Weinhaus 開發的特殊「線性模糊」技術,您可以在單元格之間產生固定寬度的線性漸變。
magick -size 100x100 xc: -colorspace RGB \
-sparse-color Voronoi '30,10 red 10,80 blue 70,60 lime 80,20 yellow' \
-blur 10x65535 -colorspace sRGB -fill white -stroke black \
-draw 'circle 30,10 30,12 circle 10,80 10,82' \
-draw 'circle 70,60 70,62 circle 80,20 80,22' \
sparse_voronoi_gradient.png
未模糊的輸出也可以傳遞給各種邊緣檢測技術以生成各種有界邊緣。您可以通過柵格到矢量轉換器重新映射圖像以生成矢量線。但是我發現默認的「autotrace
」設置可能需要使用「-corner-threshold 120
」進行調整,以便更好地檢測角落。 Shepards(色斑)
「Shepards
」方法使用到每個給定點的距離的平方反比來確定畫布上每個點的顏色。有關如何執行數學運算的示例,請參見上面的更複雜的 DIY 漸變。這有點像在每個點都有顏色的聚光燈,這些聚光燈相互影響,因為光線向外擴散到無窮遠處所有給定顏色的均勻平均值。
magick -size 100x100 xc: -colorspace RGB \
-sparse-color Shepards '30,10 red 10,80 blue 70,60 lime 80,20 yellow'
\
-colorspace sRGB -fill white -stroke black \
-draw 'circle 30,10 30,12 circle 10,80 10,82' \
-draw 'circle 70,60 70,62 circle 80,20 80,22' \
sparse_shepards.png


影像處理是在線性色彩空間 (RGB) 中進行的,以避免在混合這些強烈的原色時出現「sRGB 變暗」的情況。如需更多詳細資訊,請參閱處理真實影像。
通過用相似的顏色包圍特定區域,您可以生成該特定顏色的高原,儘管邊緣點之間的邊界可能會「洩漏」,並且「高原」的中心可能會下沉形成淺碗(取決於距離其他顏色點的距離)。此方法也可用於生成位移場,例如Shepards 圖像扭曲中使用的位移場。在這種情況下,映射的是 X 和 Y 位移向量,而不是顏色 R、G、B 值。 反向(顏色的銳點)
「Inverse
」方法實際上與「Shepards
」方法相同,只是它使用給定點的更直接的反向距離加權。有關如何執行數學運算的示例,請參閱上面的更複雜的 DIY 漸變。這是 ImageMagick 6.6.9-7 版中新增的功能。例如...
magick -size 100x100 xc: -colorspace RGB \
-sparse-color Inverse '30,10 red 10,80 blue 70,60 lime 80,20 yellow' \
-colorspace sRGB -fill white -stroke black \
-draw 'circle 30,10 30,12 circle 10,80 10,82' \
-draw 'circle 70,60 70,62 circle 80,20 80,22' \
sparse_inverse.png
如您所見,它會產生顏色的銳點,並迅速融入背景的「平均顏色」。與產生圓形斑點的Shepards 方法相比,顏色點周圍具有「扁平」的顏色。然而,在生成所有控制點形成一條線的線性漸變時,它的效果更好。也就是說,用於沿著圖像中的特定線生成一維漸變。但是還有一點需要注意。這些顏色點下降到接近「平均」水平的速度由它們的距離控制。將兩個點光源放置在一起,它們會快速下降,它們之間的距離越遠,單個顏色的影響越大。
magick -size 100x100 xc: -colorspace RGB \
-sparse-color Inverse '45,45 red 55,55 lime' \
-colorspace sRGB -fill white -stroke black \
-draw 'circle 45,45 45,47 circle 55,55 55,57' \
sparse_inverse_near.png
magick -size 100x100 xc: -colorspace RGB \
-sparse-color Inverse '30,30 red 70,70 lime' \
-colorspace sRGB -fill white -stroke black \
-draw 'circle 30,30 30,32 circle 70,70 70,72' \
sparse_inverse_far.png
此外,如果您將特定點(完全重疊或彼此靠近)「加倍」為相同或相似的顏色,則該顏色點的強度將加倍。
magick -size 100x100 xc: -colorspace RGB \
-sparse-color Inverse '30,30 red 75,65 lime 65,75 lime' \
-colorspace sRGB -fill white -stroke black \
-draw 'circle 30,30 30,32 circle 75,65 75,67 circle 65,75 65,77 '
\
sparse_inverse_stronger.png
這些效果也適用於「Shepards
」方法!Shepards 功率因數
Shepards 和 Inverse 稀疏顏色方法實際上是相同的,但應用於反向距離權重的「功率級別」不同。(分別為 2.0 和 1.0)。從 IM v6.8.0-10 開始,您可以使用操作定義「shepards:power
」來設置此功率級別,該級別將由「Shepards
」方法使用。例如
magick -size 100x100 xc: -colorspace RGB -define shepards:power=0.5 \
-sparse-color Shepards '30,10 red 10,80 blue 70,60 lime 80,20 yellow'
\
-colorspace sRGB -fill white -stroke black \
-draw 'circle 30,10 30,12 circle 10,80 10,82' \
-draw 'circle 70,60 70,62 circle 80,20 80,22' \
sparse_shepards_pow0.5.png
magick -size 100x100 xc: -colorspace RGB -define shepards:power=1 \
-sparse-color Shepards '30,10 red 10,80 blue 70,60 lime 80,20 yellow'
\
-colorspace sRGB -fill white -stroke black \
-draw 'circle 30,10 30,12 circle 10,80 10,82' \
-draw 'circle 70,60 70,62 circle 80,20 80,22' \
sparse_shepards_pow1.png
magick -size 100x100 xc: -colorspace RGB -define shepards:power=2 \
-sparse-color Shepards '30,10 red 10,80 blue 70,60 lime 80,20 yellow'
\
-colorspace sRGB -fill white -stroke black \
-draw 'circle 30,10 30,12 circle 10,80 10,82' \
-draw 'circle 70,60 70,62 circle 80,20 80,22' \
sparse_shepards_pow2.png
magick -size 100x100 xc: -colorspace RGB -define shepards:power=3 \
-sparse-color Shepards '30,10 red 10,80 blue 70,60 lime 80,20 yellow'
\
-colorspace sRGB -fill white -stroke black \
-draw 'circle 30,10 30,12 circle 10,80 10,82' \
-draw 'circle 70,60 70,62 circle 80,20 80,22' \
sparse_shepards_pow3.png
magick -size 100x100 xc: -colorspace RGB -define shepards:power=8 \
-sparse-color Shepards '30,10 red 10,80 blue 70,60 lime 80,20 yellow'
\
-colorspace sRGB -fill white -stroke black \
-draw 'circle 30,10 30,12 circle 10,80 10,82' \
-draw 'circle 70,60 70,62 circle 80,20 80,22' \
sparse_shepards_pow8.png
![[IM Output]](sparse_shepards_pow0.5.png)
功率 0.5
![[IM Output]](sparse_shepards_pow1.png)
功率 1.0
(反向)
![[IM Output]](sparse_shepards_pow2.png)
功率 2.0
(牧羊人)
![[IM Output]](sparse_shepards_pow3.png)
功率 3.0
![[IM Output]](sparse_shepards_pow8.png)
功率 8.0
如您所見,「顏色點」從非常銳利的點擴展到圓形點,再到較大的顏色區域。在非常高的功率級別,它最終會重現與Voronoi 稀疏顏色方法相同的模式。此-define 不僅影響Shepards 稀疏顏色,還會對基於稀疏顏色方法生成的計算位移圖的Shepards 失真方法產生類似影響。但是,它不會影響Inverse 稀疏顏色方法,後者始終使用 1.0 的功率級別。稀疏顏色方法概述
為了進行比較,以下是各種 4 點「-sparse-color
」圖像的重複。
![[IM Output]](sparse_voronoi.gif)
Voronoi
![[IM Output]](sparse_voronoi_blur.png)
Voronoi(模糊)
![[IM Output]](sparse_shepards.png)
Shepards
![[IM Output]](sparse_inverse.png)
反向
![[IM Output]](sparse_bilinear.png)
雙線性
以下是各種 3 點方法的摘要。
![[IM Output]](sparse_voronoi_3pt.gif)
Voronoi
![[IM Output]](sparse_voronoi_blur_3pt.png)
Voronoi(模糊)
![[IM Output]](sparse_shepards_3pt.png)
Shepards
![[IM Output]](sparse_inverse_3pt.png)
反向
![[IM Output]](sparse_barycentric.png)
重心
目前,只有「Voronoi
」、「Shepards
」和「Inverse
」方法適用於四個以上的點。*計劃提供更多「-sparse-color
」方法。如果您有任何想法,請發送郵件給我。*通道和稀疏顏色
「-sparse-color
」運算符受「-channel
」設置的影響,這表示您可以使用該設置將其效果限制為單個通道,或將其擴展到透明度通道。您還可以通過僅對一個通道進行操作來使用「-channel
」設置來加快灰度圖像的處理速度,然後「-separate
」該通道(有關更多詳細信息,請參閱通道處理)。例如..
magick -size 100x100 xc: -channel G -sparse-color Shepards \
'30,10 gray70 10,80 black 70,60 white 80,20 gray(33.3333%)' \
-separate +channel -fill white -stroke black \
-draw 'circle 30,10 30,12 circle 10,80 10,82' \
-draw 'circle 70,60 70,62 circle 80,20 80,22' \
sparse_shepards_gray.gif
從 IM v6.6.8-5 版本開始,未修改的通道將會被保留,因此您可以使用 稀疏色彩 搭配 "-channel
" 設定,快速且輕鬆地為任何影像新增透明漸層。例如,以下範例將新增一個透明的 對角線漸層,並將其對齊,使 50% 的透明度沿著內建 "rose:
" 影像的對角線分佈。
magick rose: -alpha set -channel A \
-sparse-color Barycentric \
'0,0 opaque %w,-%h opaque %w,%h transparent' \
rose_alpha_gradient.png


顏色 'Opaque
' 只是 'Black
' 的另一個名稱。基本上,當您真正感興趣的只是指定完全不透明的顏色,而實際顏色本身並不重要時,就會使用它。顏色 'Transparent
' 也是如此。我也可以輕鬆地分別使用 'White
' 和 'None
'。


在 IM v6.6.8-5 版本之前,任何未被 "-channel
" 設定選取的通道都會被重置為零(黑色)值。這嚴重限制了它的實際用途。
稀疏色彩 也接受標準化的浮點數值,而不是顏色名稱。需要提供多少個值來替換顏色名稱,取決於當前的 "-channel
" 設定,以及該通道在正在處理的影像中是否為「活動」狀態。最簡單的方法是將處理限制在單一通道。另請注意,當使用原始數字而不是顏色名稱時,透明度值是「消光」值(0=不透明),而不是「alpha」值(1=不透明)(對於 IMv7)。因此,在上面的範例中,我本來可以使用數字而不是顏色名稱...
-channel A -sparse-color Bilinear '0,0 1.0 -%w,%h 1.0 %w,%h 0.0'
這在程式腳本和 API 中可能更容易處理,因為它們可能無法存取「顏色名稱」轉換器。 稀疏顏色作為填充運算符
建立 稀疏色彩運算子 的最初原因之一是讓您可以給予一個僅包含少量固定顏色點的影像,並從這些點「填入」其餘未定義的顏色。例如,以下範例繪製了少量的像素。特別關閉了 "+antialias
" 設定,因此沒有繪製半透明或混合顏色,因此影像僅包含指定的四種精確顏色,而沒有其他顏色。
magick -size 100x100 xc:none +antialias -fill none -strokewidth 0.5 \
-stroke Gold -draw "path 'M 20,70 A 1,1 0 0,1 80,50'" \
-stroke DodgerBlue -draw "line 30,10 50,80" \
-stroke Red -draw "circle 80,60 82,60" \
sparse_source.gif
現在,我們可以提取此影像中存在的少量非透明像素,然後使用多點稀疏色彩方法 'Shepards
' 填入所有其他顏色。
magick sparse_source.gif txt:- |\
sed '1d; / 0) /d; s/:.* /,/;' |\
magick sparse_source.gif -alpha off \
-sparse-color shepards '@-' sparse_fill.png
以上範例中的 "sed
" 命令會取得 列舉文字檔案格式,刪除第一個標題行和任何包含透明度的行,然後將其重新格式化為像素座標和顏色的清單。然後,使用特殊的 "@-
" 參數將該清單「管道」到 稀疏色彩運算子。是的,以上範例非常棘手,但確實有效。至少對於非常少量的點是如此。但是,提供的點越多,運算速度就越慢。這是因為 稀疏色彩 在其處理過程中是以「點」為導向,而不是以影像或 形態學 為導向。最終,我希望能夠提供一組以形態學為導向的「孔洞填充」方法,您只需按原樣提供上述影像,即可自動填入透明區域。這種點提取技術可以與 EdgeIn 形態學方法 結合使用,以提取物件或孔洞邊緣周圍的像素,以便您可以「填入」遺失的背景或孔洞(如 形態學和通道 中所示)。例如...
magick figure.gif -channel A -morphology EdgeIn Diamond
shape_edge_pixels.gif
magick shape_edge_pixels.gif txt:- |\
sed '1d; / 0) /d; s/:.* /,/;' | \
magick shape_edge_pixels.gif -alpha off \
-sparse-color shepards '@-' shape_edge_in_lights.png
magick shape_edge_in_lights.png figure.gif -composite shape_in_lights.png
請注意,產生的影像與輸入影像完全相同,但透明背景已替換為距離模糊的「邊緣顏色」。這就是影像邊緣變得模糊的原因。特別開發此影像的目的是嘗試產生更好的「邊緣羽化」技術。如需其他羽化技術,請參閱 模糊羽化 和 距離羽化。 稀疏顏色 Shepards,一種模糊替代方案
除了使用「-sparse-color
」之外,還有一種替代方法,是將像素圖像放在透明背景上,然後對其進行模糊處理。之後,透明度將被丟棄。這種方法的問題是原始顏色無法保留,而且您還需要確定要使用什麼「sigma」值。此外,它沒有考慮到每個顏色的「接近」程度,因此兩個相鄰的彩色像素(小於「sigma」值)會相互淹沒,並變得模糊在一起。
更好的方法是生成多層模糊圖像,這些圖像的「sigma」值逐漸減小,並且原始未模糊圖像位於頂部。
for sigma in 64 32 16 8 4 2 1 0; do
magick sparse_source.gif -depth 16 \
-channel RGBA -blur 0x$sigma miff:-
done |
magick - -background none -flatten -alpha off sparse_blur_layered.png
這種分層模糊技術等效於對同一圖像應用「Shepards
」方法的結果,雖然不太精確,但非常接近。但是,當涉及大量輸入像素時,它可能會快得多,因為它是面向圖像(形態學)的,而不是使用單個點進行計算。另一種分層模糊方法是使用調整大小來生成模糊圖像的「金字塔」。此技術在使用調整大小進行大模糊中有詳細說明。
magick sparse_source.gif \
\( +clone -resize 50% \) \
\( +clone -resize 50% \) \
\( +clone -resize 50% \) \
\( +clone -resize 50% \) \
\( +clone -resize 50% \) \
\( +clone -resize 50% \) \
\( +clone -resize 50% \) \
-layers RemoveDups -filter Gaussian -resize 100x100\! -reverse \
-background None -flatten -alpha off sparse_blur_pyramid.png
這對於非常大的圖像來說速度非常快,而不需要在每個模糊步驟中使用較大的「sigma」值(因此速度非常慢)。從本質上講,它使用的是一種更快的圖像調整大小技術來生成上一個示例中的模糊層。它不是那麼精確,但會生成對正確結果的良好近似。但是,它最適合於尺寸為平方且大小為 2 的冪的圖像,否則精度會降低。上述特殊運算符「-layers RemoveDups
」將刪除由多次「複製-調整大小」操作生成的任何額外的「單一平均像素」圖像。然後,使用高斯調整大小濾鏡(等效於模糊)將圖像調整回原始大小。然後反轉圖像順序,以便將原始圖像放在頂部,將更模糊的圖層放在下方,然後像以前一樣拼合在一起。它的優點是只需要讀取圖像一次,即可在單個命令中完成所有工作。即使對於大型圖像,它的工作速度也很快,尤其是在調整大小時,每一步都將圖像減半,因此避免了使用非常大的 sigma 進行緩慢模糊。這種方法的唯一缺點是,您需要大致了解圖像的原始大小才能恢復「模糊」圖像,並至少大致了解要生成多少個調整大小的副本(最大維度的 Log2 加 1)。但是,過度調整大小副本不會對性能造成太大影響,因為當輸入圖像已調整為最小 1 像素圖像時,調整大小只會變成「無操作」。然後,可以使用「-layers RemoveDups
」自動處理額外且無用的「調整大小的圖像層」。唯一真正的问题是,在处理大小不是 2 的幂的图像时,调整大小后的图像可能会“不同步”。这个问题的严重程度尚不清楚,但应该不会太严重,因为这些图像也是最模糊的。当然,它仍然存在“Shepards
”方法的“泄漏”问题,所以让我们更详细地研究这个问题。 Shepards 方法「洩漏」
“Shepards
”方法不理解“边界”,因此某些“颜色线”远端的颜色会泄漏或“滲透”到该线的另一侧。最终,在很远的距离上,您将获得所有像素的纯平均颜色。这并不总是一个理想的结果(尽管在某些情况下是可取的)。在此示例中,“红色
”曲线越接近“白色
”线,颜色就越容易“泄漏”到两条线的另一侧,从而产生粉红色。
magick -size 100x100 xc:none +antialias -fill none -strokewidth 0.5 \
-stroke Red -draw "path 'M 26,0 A 55,61 0 0,1 26,100'" \
-stroke White -draw "line 50,0 50,100" \
sparse_lines_near_source.gif
magick sparse_lines_near_source.gif txt:- |\
sed '1d; / 0) /d; s/:.* /,/;' |\
magick -size 100x100 xc: -sparse-color shepards '@-' \
sparse_lines_near.png
顏色洩漏是使用「Shepards 方法」進行「孔洞填充」的主要問題,尤其是在涉及多個孔洞時,因為與一個孔洞相關的顏色會洩漏並影響完全不同孔洞中的顏色,反之亦然。對邊界的理解構成了「Shepards 方法」與另一種稱為「*顏色擴散*」的顏色「孔洞填充」形式之間的差異。基本上,使用「*顏色擴散*」,顏色無法穿過其他已定義顏色的線條。這是通過將影響限制在「視線」中的顏色或洩漏到邊緣外部的顏色來實現的。這需要使用到最近顏色的距離來限制哪些顏色會影響像素。「*顏色擴散*」的一個主要用途在「擴散曲線」網站上有介紹。這不僅大量使用了顏色擴散,還包含有關快速生成擴散的技術資訊。我希望將來在 ImageMagick 中實現這一點。
電漿圖像
等離子漸層
雖然漸變提供了平滑的顏色範圍,但另一個圖像創建運算符「plasma:
」提供了一種不同類型的漸變。一種非常適合為您的圖像生成隨機顏色背景的漸變。首先,我應該指出「plasma:
」是一個隨機圖像。因此,它每次運行時都會產生不同的圖像。例如,在這裡我們生成三個獨立的「標準」電漿圖像,即使使用相同的命令生成它們,每個圖像也彼此不同。
magick -size 100x100 plasma: plasma1.jpg
magick -size 100x100 plasma: plasma2.jpg
magick -size 100x100 plasma: plasma3.jpg
您還可以發現,電漿圖像也是一種隨機顏色漸變,並且像「gradient:
」一樣,從頂部的白色開始到底部的黑色結束。沒有說明的是,您可以像上面線性漸變一樣指定電漿漸變的顏色。
magick -size 100x100 plasma:blue plasma_range1.jpg
magick -size 100x100 plasma:yellow plasma_range2.jpg
magick -size 100x100 plasma:green-yellow plasma_range3.jpg
magick -size 100x100 plasma:red-blue plasma_range4.jpg
magick -size 100x100 plasma:tomato-steelblue plasma_range5.jpg
您還可以發現,像「tomato
」和「steelblue
」這樣的中間色調往往比「red
」和「blue
」這樣的純色效果更好。通過在電漿中兩次使用相同的顏色,您可以生成主要為該顏色的背景,但會出現與原始顏色相近的隨機色塊。
magick -size 100x100 plasma:black-black plasma_black.jpg
magick -size 100x100 plasma:grey-grey plasma_grey.jpg
magick -size 100x100 plasma:white-white plasma_white.jpg
magick -size 100x100 plasma:yellow-yellow plasma_yellow.jpg
magick -size 100x100 plasma:tomato-tomato plasma_tomato.jpg
magick -size 100x100 plasma:steelblue-steelblue plasma_steelblue.jpg
同樣如您所見,與黑色、白色或黃色等極端顏色相比,中間色調將在生成的圖像中生成更多種類的顏色。上面「grey
」電漿特別好,呈現出彩虹色的「珍珠母」效果,基本上是因為灰色在「plasma:
」將生成的顏色方面具有完全的自由度。
標準化完美的 50% 灰色電漿將在包括白色和黑色的整個顏色範圍內產生特別均勻的多色電漿圖像。
magick -size 100x100 plasma:grey50-grey50 -auto-level plasma_grey_norm.jpg
或者,您可以擴展顏色的對比度以使它們更粗體,但不要過於極端。
magick -size 100x100 plasma:grey50-grey50 \
-sigmoidal-contrast 8x50% plasma_grey_contrast.jpg
將此圖像與下面的「分形電漿」圖像進行比較。分形等離子體
電漿生成器還具有一种特殊的「分形模式」,可以產生豐富多彩的效果。生成的顏色經過增強,以產生更誇張的顏色變化。
magick -size 100x100 plasma:fractal plasma_fractal1.jpg
magick -size 100x100 plasma:fractal plasma_fractal2.jpg
magick -size 100x100 plasma:fractal plasma_fractal3.jpg
實際上,這與我們已經看到的恆定顏色電漿圖像非常相似,實際上這些圖像的生成方式相同,但顏色變化更為明顯。
我經常發現電漿圖像有點「嘈雜」。因此,它們通常會從使用「-blur
」進行一些平滑處理中受益。
在這裡,我已經使用上述中間電漿圖像消除了噪音。
magick plasma_fractal2.jpg -blur 0x2 plasma_smooth.jpg
您可以使用「-paint
」創建隨機的色塊。
magick plasma_fractal2.jpg -blur 0x1 -paint 8 plasma_paint.jpg
或者可以使用「-emboss
」影像運算子,在使用「-blur
」去除低階雜訊後,使顏色更鮮明、更圓潤。
magick plasma_fractal2.jpg -blur 0x5 -emboss 2 plasma_emboss.jpg
通過先使用「-blur
」再使用「-sharpen
」,您可以產生比使用「-emboss
」更柔和的色彩圖案。
magick plasma_fractal2.jpg -blur 0x5 -sharpen 0x15 plasma_sharp.jpg
我實際上發現生成一個旋轉的電漿漸層作為背景圖案特別好。
magick -size 160x140 plasma:fractal \
-blur 0x2 -swirl 180 -shave 20x20 plasma_swirl.jpg
灰階電漿
現在,即使在純黑色的純色上,電漿產生器也會產生顏色。 然而,生成純灰階電漿通常很有用。 有兩種簡單的方法可以做到這一點。
最簡單的方法是將電漿影像轉換為灰階。
magick -size 100x100 plasma:fractal -blur 0x2 \
-colorspace Gray plasma_greyscale.jpg
另一種方法是將其中一個顏色通道複製到另外兩個通道上,以獲得更強的單層效果。
magick -size 100x100 plasma:fractal -blur 0x2 \
-channel G -separate plasma_grey_copy.jpg
最後一種技術是在電漿上使用「-shade
」。
magick -size 100x100 plasma:fractal -blur 0x5 \
-shade 120x45 -auto-level plasma_grey_shade.jpg
您可能認為會得到很多光影效果,但原始電漿是如此隨機,以至於「-shade
」似乎只會產生更「斑駁的電漿」效果。您可以使用恆定顏色電漿方法創建灰階電漿,而不是使用具有高度誇張顏色變化的分形電漿。 作為副作用,此方法還允許您控制生成的灰階電漿影像的整體亮度。
magick -size 100x100 plasma:black-black \
-blur 0x2 -colorspace Gray plasma_grey0.jpg
magick -size 100x100 plasma:grey25-grey25 \
-blur 0x2 -colorspace Gray plasma_grey1.jpg
magick -size 100x100 plasma:grey50-grey50 \
-blur 0x2 -colorspace Gray plasma_grey2.jpg
magick -size 100x100 plasma:grey75-grey75 \
-blur 0x2 -colorspace Gray plasma_grey3.jpg
magick -size 100x100 plasma:white-white \
-blur 0x2 -colorspace Gray plasma_grey4.jpg
如果這還不夠大膽,請使用通道複製方法對電漿影像進行灰階處理。
magick -size 100x100 plasma:black-black \
-blur 0x2 -channel G -separate plasma_grey5.jpg
magick -size 100x100 plasma:grey25-grey25 \
-blur 0x2 -channel G -separate plasma_grey6.jpg
magick -size 100x100 plasma:grey50-grey50 \
-blur 0x2 -channel G -separate plasma_grey7.jpg
magick -size 100x100 plasma:grey75-grey75 \
-blur 0x2 -channel G -separate plasma_grey8.jpg
magick -size 100x100 plasma:white-white \
-blur 0x2 -channel G -separate plasma_grey9.jpg
這些灰階電漿影像對於進一步處理非常有用,允許您生成其他影像效果。 例如,請查看背景影像頁面,其中有大量使用電漿分形產生許多有趣效果的示例。 設定電漿影像的種子或重複電漿影像
請記住,「plasma:
」可以產生接近純黑色或純白色的區域,或任何其他顏色(儘管不太可能是純色)。 雖然不太可能獲得單一顏色的影像,但這也是一種可能的結果。 因此,當您獲得良好的結果時,您可能希望保存它以供以後重複使用。 正因為如此,使用電漿影像的腳本可能會包含生成和重複使用此類隨機影像的選項。 也就是說,您可能希望將電漿影像生成與使用該影像的其他部分分開,以便重複使用。
然而,一種更簡單的技術是「設定種子」或初始化 IM 亂數產生器,以便「plasma:
」生成相同的「隨機」影像。 這樣,您可以調整腳本或程式以反覆產生良好或有趣的顏色或效果。
magick -size 100x100 -seed 4321 plasma: plasma_seeded.jpg
上面的影像永遠不會改變,所以除非我改變「-seed
」編號,否則我的右下角總是會有一個「紅色」區域。 有趣的是,對不同的初始化顏色漸層使用相同的種子可以產生一組影像,這些影像雖然是隨機的,但在其內部模式上是相似的。
magick -size 100x100 -seed 4321 plasma:grey-grey plasma_rnd1.jpg
magick -size 100x100 -seed 4321 plasma:white-blue plasma_rnd2.jpg
magick -size 100x100 -seed 4321 plasma:green-yellow plasma_rnd3.jpg
magick -size 100x100 -seed 4321 plasma:red-blue plasma_rnd4.jpg
magick -size 100x100 -seed 4321 plasma:tomato-steelblue plasma_rnd5.jpg
如您所見,以上所有影像都呈現相同的色彩模式,儘管底層色彩基底可能會突顯或遮蔽共用模式的某些部分。最後要提醒您的是,其他 IM 運算子也可以使用亂數產生器,例如「-fx
」的「rand()
」函式、「-virtual-pixel
」的「random
」設定、「-random-threshold
」抖動運算子和「-noise
」運算子。因此,最好在您使用亂數產生器之前立即設定種子。從 IM v6.3.4-3 開始,您也可以使用「+seed
」重新隨機產生器。因此,將此設定放在「seeded plasma」之後,將確保任何後續運算子都能在需要時正確產生隨機結果。預設情況下,種子在 IM 啟動時會隨機產生,因此您通常不需要使用「+seed
」自行隨機產生種子,即可獲得隨機結果。使用等離子體的問題
使用「plasma:
」影像時,您應該避免產生高縱橫比的影像。這會扭曲正常的電漿色彩效果,將色彩拉成針狀條紋。這個問題沒有簡單的解決方案,因此除非這是您想要的結果,否則建議您小心謹慎。電漿影像中還有一個從左上到右下的明顯對角線扭曲,這是不應該存在的。也就是說,演算法中存在某種「空間偏差」缺陷。例如,正如 Thomas Maus <thomas.maus_AT_alumni.uni-karlsruhe.de> 所指出的,如果您鏡像並附加相同的電漿影像,您將始終在產生的影像中看到一個明顯的「V」字形...這不應該發生。但問題似乎太深入了,如果不從根本上完全重寫整個電漿產生器函式,就無法解決。
隨機影像
原始隨機雜訊
從 IM v6.3.5 開始,您可以使用雜訊產生器「+noise
」方法「Random
」,從現有影像產生純隨機影像。
magick -size 100x100 xc: +noise Random random.png
如果您的 IM 版本較舊,您仍然可以使用較慢的DIY FX 運算子「-fx
」產生純隨機雜訊影像。
magick -size 100x100 xc: -fx 'rand()' random_fx.png
或者,為了提高速度,您可以使用「-spread
」運算子隨機化漸層(分別針對三個色彩通道),或者使用其他影像。
magick -size 100x100 gradient: -separate \
-virtual-pixel tile -spread 200 -combine random_spread.png
結果可能看起來非常隨機,但它會產生更受控的色彩範圍(或只是色彩值)。隨機斑點(像素灰塵)
產生分散的隨機像素影像也很有用。. 請記住,隨機影像的三個色彩通道中的每一個都可以被視為單獨的隨機灰階影像,並且這些通道可以透過各種方式合併在一起。
例如,您可以透過先臨界值化色彩通道(「G
」或綠色通道),然後將其分離為灰階影像,來產生隨機點的遮罩。
magick random.png -channel G -threshold 5% -separate \
+channel -negate random_mask.png
由於每種顏色都是線性隨機值,因此上述使用的臨界值百分比直接定義了所選像素的密度。您可以更進一步,使用一個色彩通道(「G
」或綠色通道)從另一個色彩通道(「R
」或紅色通道)中選擇隨機值,方法是使用各種影像合成方法。
magick random.png -channel G -threshold 5% -negate \
-channel RG -separate +channel \
-compose Multiply -composite random_black.png
magick random.png -channel G -threshold 5% \
-channel RG -separate +channel \
-compose Screen -composite random_white.png
magick random.png -channel G -threshold 5% -negate \
-channel RG -separate +channel \
-compose CopyOpacity -composite random_trans.png
這些類型的圖像可以直接用於生成閃光動畫。但是進一步處理,特別是在黑色背景版本上,您可以根據灰度強度放大點,或從這些點生成條紋或星光。有關示例,請參見星光生成器。與種子等離子圖像類似,您也可以使用「-seed
」設置預先初始化隨機數生成器。這允許您為特定機器重複生成相同的隨機圖像,就像等離子圖像一樣。 模糊隨機圖像(隨機斑點)
雖然您可以直接使用隨機圖像來創建斑點效果,但純粹的隨機圖像通常不是很有用。但是通過模糊純粹的隨機圖像,您將引入一些「鄰域」順序,以便附近的像素變得相關。例如,在這裡,我只模糊一個隨機圖像,導致隨機值產生更大的「斑點」或雜色。
magick random.png -virtual-pixel tile -blur 0x1 -auto-level random_1.png
magick random.png -virtual-pixel tile -blur 0x3 -auto-level random_3.png
magick random.png -virtual-pixel tile -blur 0x5 -auto-level random_5.png
magick random.png -virtual-pixel tile -blur 0x10 -auto-level
random_10.png
magick random.png -virtual-pixel tile -blur 0x20 -auto-level
random_20.png
但是請注意,如果沒有虛擬像素設置,「-blur
」運算符將具有強烈的邊緣效應,最好避免這種情況。作為獎勵,通過將「-virtual-pixel
」設置更改為「tile
」,隨機圖像將保持可平鋪性,顏色跨圖像邊界環繞。這種平鋪能力是目前隨機等離子圖像無法實現的,並且是純粹隨機圖像從一開始就如此隨機的固有結果。 模糊隨機色調
我發現模糊隨機噪聲圖像的一種特別令人愉悅的轉換是將值映射到 HSB 顏色色調。
magick random_10.png -set colorspace HSB \
-channel GB -evaluate set 100% +channel \
-colorspace RGB random_hues_cyan.png
上述問題是模糊往往會產生紅黃色(低值)和紅洋紅色(高值)的斑點,以及它們之間的綠色、青色和藍色帶。這僅僅是色調值模糊和均衡方式的結果。解決此問題的理想方法是一種模數模糊,它將考慮色調值的循環性質。但是,此類運算符當前不可用,而且可能永遠不會可用。
我知道的最佳解決方案是簡單地將圖像中的所有三個隨機通道相加(使用模數加合成),以便擴展值的範圍。這也會產生使模糊斑點變小的副作用,但至少您現在可以獲得更動態範圍的彩虹色。 *誰有更好的主意?*
magick random_10.png -separate -background white \
-compose ModulusAdd -flatten -channel R -combine +channel \
-set colorspace HSB -colorspace RGB random_hues.png
有關處理隨機圖像的更多方法,請參見上面的等離子圖像,以及生成背景。 模糊隨機灰度正如您從上面看到的,您會得到一個具有各種原色斑點的圖像。這是因為每個通道都被完全獨立地處理為灰度圖像。讓我們提取上述每個圖像的一個通道,以便您可以看到模糊圖像的結構...
magick random.png -channel G -separate random_0_gray.png
magick random_1.png -channel G -separate random_1_gray.png
magick random_3.png -channel G -separate random_3_gray.png
magick random_5.png -channel G -separate random_5_gray.png
magick random_10.png -channel G -separate random_10_gray.png
magick random_20.png -channel G -separate random_20_gray.png
您應該注意到的第一件事是圖像通常(但不總是)包含大致相等數量的黑色和白色區域。如果我們在 50% 處對隨機圖像進行閾值處理,您就可以看到這一點
magick random_0_gray.png -threshold 50% random_0_thres.png
magick random_1_gray.png -threshold 50% random_1_thres.png
magick random_3_gray.png -threshold 50% random_3_thres.png
magick random_5_gray.png -threshold 50% random_5_thres.png
magick random_10_gray.png -threshold 50% random_10_thres.png
magick random_20_gray.png -threshold 50% random_20_thres.png
如您所見,您會得到大約 50% 的白色和 50% 的黑色區域,由一條曲線分隔。這條線的曲線也會根據用於模糊純隨機影像的「sigma」值而變化。從單個像素生成黑白「雪花」,直到您獲得非常均勻(儘管仍然是隨機的)的黑白區域分隔。有關使用隨機影像的更多示例,請參閱背景影像或要查看如何生成隨機畫布,請參閱純色隨機點。隨機粒度(混沌中的秩序)
現在請記住,所有模糊的隨機影像都是從同一個初始隨機影像生成的,因此它們都是相關的。但是每個新生成的隨機影像都將具有完全不同的模式,儘管這些模式在結構上看起來或多或少相似。
但首先讓我們舉一個從頭開始生成「模糊隨機影像」的完整示例...
magick -size 100x100 xc: -channel G +noise Random \
-virtual-pixel Tile -blur 0x5 -auto-level \
-separate +channel random_5_gray.png
大量使用「-channel
」設定來將操作限制在影像的「綠色」通道非常重要,因為它可以將影像的整體生成速度提高 3 倍。通道分離將確保我們獲得純灰階結果。如果您願意,您可以省略兩個「-channel
」設定,這將導致生成 3 個完全獨立且不同的「模糊隨機影像」。該影像具有一些重要特徵,如果我們將影像分成三組相等的顏色(使用一種稱為色調分離的技術),我們可以更清楚地看到這些特徵,您可以看到在每個黑白區域內,您會得到更多的圓形斑點或「顆粒」。
舉個例子...
magick random_5_gray.png -ordered-dither threshold,3 random_5_blobs.png
首先,我要指出我們如何在影像中獲得大致相等數量的亮區和暗區,但這些區域通過在亮區和暗區之間形成的漸變的灰色「中間」顏色相互連接。現在,單個斑點或「顆粒」在影像的不同區域有所不同,但它們的平均直徑大約是初始隨機影像模糊值的三到四倍。此模糊值稱為影像的「粒度」,是一個非常重要的值,因為它基本上代表隨機影像產生的圓形結構的平均大小。有時它被稱為影像的「曲率」。值越大,影像中的這些曲線就越大、越慢。這是描述模糊隨機影像的最重要因素,所以讓我們把它說清楚...
隨機影像的「粒度」(或模糊因子)
決定了內部圓形結構的大小
當然,「模糊因子」或「粒度」越小,曲線就越小或越緊,直到您達到「0
」的值,此時,影像中的所有聚集或「斑點」都消失了,您至少會看到純粹的隨機「雜訊」、「雪花」或「像素灰塵」類型的效果。
旁白:實際上,實際「顆粒」的大小可能會因用於生成它們的閾值因子而異。該因子實際上描述的是黑白區域中心之間的平均距離。值越大,距離越大,並且為了適應距離的增加,斑點必須越大且分佈越廣。當我們開始查看下面的隨機漣漪時,這一點會變得更加明顯。
您也可以嘗試使用 50% 的曝光過度操作和一些額外的色階調整來從影像中提取分離良好的黑白顆粒。
例如,以下是一個完整範例,其粒度為「8
」,色塊閾值為「25%
」,會從影像的黑色和白色部分產生白點。
magick -size 100x100 xc: -channel G +noise random \
-virtual-pixel tile -blur 0x8 -auto-level \
-solarize 50% -separate +channel \
-threshold 25% -negate random_granules.png
請注意,隨著數值的增加,產生模糊隨機影像所需的時間也會變得更長。此外,當數值達到最小影像維度大小的一半左右時,效果就會停止增長,因為隨機影像會變成單個白色和黑色斑點。建議不要使用太大的數值。
最後,左側顯示的是一個巡邏循環動畫,它是透過改變單一隨機影像的「粒度」(隨機模糊)而產生的。動畫是使用 Shell 腳本「animate_granularity
」產生的,您可以下載、研究和試玩。請注意,由於使用相同的隨機影像作為來源,「顆粒」或斑點並不會真正移動,而只是隨著粒度的增加而聚集成較大的「顆粒」,或逐漸消失。另請注意,雖然我減少了動畫中的顏色數量,但完整隨機影像的結構實際上是兩組白色和黑色顆粒之間的平滑漸層。這種漸層使影像在其他技術中也很有用。隨機流(動畫循環)
現在,正如您在上面所見,「顆粒」或斑點實際上並沒有移動太多。但對於動畫效果,您需要一個隨時間平滑移動的圖案。此外,您也不希望該圖案只是簡單地來回移動。最後,您不希望該移動圖案在動畫循環時突然跳動或抖動。因此,我們需要某種方法來產生一個平滑重複的隨機圖案。這是一個很高的要求。此外,由於您需要它平滑,因此您需要從同一個隨機影像產生所有圖案。以下是一個允許您產生此類隨機圖案的想法。我們不將每個隨機像素值視為隨機強度,而是將其視為定義該像素何時處於最大或最小強度的「時間」值。也就是說,我們將該值轉換為「波」上的位置。因此,每個像素都代表正弦曲線的某個「相位」。這聽起來很複雜,但實際上並非如此。我們只是使用隨機影像作為正弦函數的來源影像。現在,對於時間序列中的每個影像,我們都設定該特定時間點的時間「相位」。
magick random.png -function Sinusoid 1,{time} \
... do granular blurring, and other processing ...
其中「{time}
」在整個動畫循環中從「0
」到「360
」。結果是,每個像素不再具有「靜態」隨機值,而是具有一個在一段時間內在黑色和白色之間循環的值。每個像素都將遵循相同的循環,但由於每個像素都具有完全不同的「相位」,因此將獨立於所有其他像素進行循環。也就是說,影像仍然是隨機的,但會隨著提供的「時間」值平滑地變化。對於具有科學頭腦的人來說,這有點像是在觀察亞原子層級存在的「量子漲落」,在這個層級上,空間遠非我們在正常尺度上看到的「靜態」狀態。因此得名「隨機流」。例如,讓我們產生一個包含 12 個影像的時間序列…
for i in `seq 0 30 359`; do
magick random.png -channel G -function Sinusoid 1,${i} \
-virtual-pixel tile -blur 0x8 -auto-level \
-separate flux_${i}.png
done


現在,您的一張隨機圖像可以生成一整個循環的圖像序列。請注意,「時間」提取必須在任何其他處理(例如模糊化)之前進行,這可能是整個生成過程中速度最慢的部分。另一個需要注意的是,在「180
」相位(右下角),您實際上會得到第一張圖像(左上角)的確切負片。也就是「白色」顆粒變成了「黑色」顆粒,反之亦然。事實上,動畫的整個後半部分實際上是前半部分的負片。這可以用來縮短簡單「隨機流」動畫的生成時間。因為圖像在 180 度相位時是負片,所以您會發現每個「白色」顆粒都會緩慢移動,以便與相鄰的「黑色」顆粒交換位置。但由於整個後半部分是前半部分的負片,所以它不能只是簡單地來回移動,而是必須繼續向前移動以返回原始圖像,或者在循環中循環,或者只是適當地淡入和淡出。換句話說,白色和黑色顆粒的移動週期要複雜得多。
右側是上述幀的動畫... 波動圖案完全隨機,但從一幀到下一幀平滑地變化,並且當動畫循環時。您無法看到結果的開始或結束。有時您會看到旋轉的運動,有時看起來所有「氣體」狀的團塊都被吸入一個黑暗區域,或者只是出現然後再次消失。您還會看到運動非常快的時期,以及運動非常慢的時期。它是完全隨機的。總之:模糊隨機圖像 中存在的相同屬性也存在於此動畫中。圖像仍然是大致相等的白色和黑色部分,並且它形成的團塊大小約為圖像模糊或粒度 的 三倍。但在這之上,您可以保證圖像的所有部分都會在較亮和較暗的顏色之間形成某種循環,因為循環的一半是另一半的負片。您可能沒有注意到的一件事是,由於將隨機線性值轉換為正弦波形,因此您將獲得更清晰的白色和黑色顏色分離(對比度)。因此,您可能會想使用 S 形對比度 運算符的去對比度方面來使生成的圖像不那麼像「團塊」,並增強顆粒之間的漸變,而不是顆粒本身。現在,這只是循環隨機動畫可以做的事情的起點。隨機圖像 可以做的任何事情,例如 生成背景 中所述,也可以應用於「隨機流動畫」
例如,讓我們只顯示「白色」顆粒的運動...
magick flux_anim.gif -threshold 70% flux_thres_anim.gif
或生成隨圖像緩慢流動的變化電絲。
magick flux_anim.gif \
-sigmoidal-contrast 30x50% -solarize 50% -auto-level \
-set delay 20 filaments_anim.gif
請注意,由於循環的一半是前半部分的否定,並且我們使用 曝光 將白色和黑色折疊成兩半,因此循環實際上是在一個動畫循環中重複兩次。它真的需要更多幀來消除正在發生的一些非常快速的變化。
為了使運動在較長的循環序列中不太可預測,您還可以 使用一些 漸變數學 來組合來自多個隨機圖像的多個正弦曲線循環,甚至僅使用相同隨機圖像的其他顏色通道。FUTURE: Create even less predictable, long time 'harmonic' cycles.
隨機漣漪
通過為模糊的隨機圖像添加另一個變化,我們可以添加另一層複雜性,使這些圖像更加有用,並在粒度之外提供了另一個控制變量。但首先您需要記住,隨機圖像不僅僅由明亮和黑暗區域組成,還包含這些區域之間的斜率。使用該斜率作為正弦函數的輸入,您可以在圖像中的斑點之間產生波紋。請注意,這種正弦函數的使用與之前的隨機通量示例的主要區別在於,這次是在使用模糊平滑圖像之後應用該函數,而不是之前。同樣在這種情況下,更重要的是“頻率”值,而不是第二個“相位”值。例如...
magick random_10_gray.png -function Sinusoid 1,90 ripples_1.png
magick random_10_gray.png -function Sinusoid 2,90 ripples_2.png
magick random_10_gray.png -function Sinusoid 3,90 ripples_3.png
magick random_10_gray.png -function Sinusoid 4,90 ripples_4.png
如您所見,正弦函數的“頻率”越大,“顆粒”之間的漸變中添加的波紋就越多。“頻率”為“1
”基本上會將源圖像中的亮“斑點”和暗“斑點”都變成白色,並在它們之間留下一條暗縫。“頻率”為“2
”會在該暗縫中擠壓一個額外的“脊”或“波紋”。隨著頻率的增加,原始圖像中最亮和最暗區域之間會出現越來越多的“波紋”,使其越來越複雜。隨著脊數量的增加,您可能會看不清圖像中原始的“斑點”或“顆粒”。您可以通過在添加波紋之前修改漸變來解決此問題,方法是使用色階調整“剪切”漸變,或使用S 形對比度壓縮中間色調。這將賦予“顆粒”一定的質量或面積,在波紋之間提供“平靜”的區域。
magick random_10_gray.png -level 25% random_enhanced.png
magick random_enhanced.png -function Sinusoid 4,90 ripples_4e.png
magick random_10_gray.png -sigmoidal-contrast 10,50% random_sigmoidal.png
magick random_sigmoidal.png -function Sinusoid 4,90 ripples_4s.png
這兩種方法各有優缺點,但本質上它們都會擴大顆粒,但不會擴大白色和黑色顆粒組之間的距離。這樣做的副作用當然是壓縮了兩組顆粒之間的波紋。
上面示例中使用的第二個值“90
”是正弦函數的“相位”。它將決定源圖像中的“黑色”顆粒在“波紋”圖像中將變成的顏色。
magick random_enhanced.png -function Sinusoid 3,0 ripples_3e000.png
magick random_enhanced.png -function Sinusoid 3,90 ripples_3e090.png
magick random_enhanced.png -function Sinusoid 3,180 ripples_3e180.png
magick random_enhanced.png -function Sinusoid 3,270 ripples_3e270.png
“白色”顆粒的顏色將取決於“相位”和您應用的“頻率”的分數。整數“頻率”值將導致白色和黑色顆粒的顏色一起變化(根據“相位”)。因此,當相位為“90
”時,兩者都將是白色的。
但是,如果您應用“0.5
”的分數“頻率”值,則“白色源”顆粒將是“黑色源”顆粒的反色(由“相位”決定)。
magick random_enhanced.png -function Sinusoid 3.5,90 ripples_3.5e.png
請注意“灰色”“相位”角度,其中一個顆粒周圍環繞著一個白環,而另一個顆粒周圍環繞著一個黑環。如果使用帶有“0.5
”分數的“頻率”值,則每個點周圍的第一個波紋將全部為白色或全部為黑色,具體取決於使用的“相位”。


不建議使用整數或“0.5
”以外的其他“頻率”,因為這兩組顆粒將無法以某種方式同步。
同樣,除非生成“波紋動畫”(見下文),否則不建議使用 90 度倍數以外的相位。
生成“色散圖”(見下文)時,建議使用“0
”的相位值,因為這會最大程度地減少增強“顆粒”區域內的失真。
與之前的隨機通量一樣,您可以隨時間修改“相位”,以生成波紋從一組顆粒移動到另一組顆粒的動畫。這在没有任何對比度增強的情況下效果特別好。
for i in `seq 0 30 359`; do
magick random_10_gray.png -function Sinusoid 3.5,${i} miff:-
done |
magick miff:- -set delay 15 -loop 0 ripples_anim.gif
旁白:以上使用的技術稱為「管線化 MIFF:」,並且由於 MIFF: 檔案格式可以簡單地「串聯」圖像以生成多圖像檔案,因此這是可行的。有一點是,動畫的變化速度似乎比我們上面建立的 流場動畫 慢得多。這是因為在一個動畫週期中,漣漪只會傳播很短的距離,而在「流場」動畫中,變化將在僅僅一半的週期內從大尺度的白色顆粒傳播到黑色顆粒,然後再返回。現在,您可以將上述漣漪動畫與來自相同隨機圖像源的底層「流場」動畫相結合,以生成更具動態和流動的形式,但要注意動畫速度差異。
例如,在這裡,我只是採用上面建立的前一個 流場動畫,並為其添加漣漪。在這種情況下,漣漪只會因為流場動畫中的漸變移動而移動。
magick flux_anim.gif -function Sinusoid 3.5,0 flux_rippled_anim.gif
您也可以為動畫中的漣漪製作動畫。儘管您可能需要對漣漪本身使用更大的「相位週期速率」(「j = 5 * i」表達式)。此外,當您在一個週期內生成一個週期時,您將需要生成一個更長的動畫,在這種情況下為 60 幀。然而,這也有助於減慢更大的「流場」運動。
for i in `seq 0 10 359`; do
j=`expr $i \* 5`
magick random.png -channel G \
-function Sinusoid 1,${i} \
-virtual-pixel tile -blur 0x8 -auto-level \
-function Sinusoid 2.5,${j} \
-separate +channel miff:-
done |
magick miff:- -set delay 15 -loop 0 ripples_flux_anim.gif
請注意,在第二張圖像中,漣漪似乎首先從一個點出來,然後又開始回到同一點,儘管它們從未簡單地反向運動。一個更好的多週期流場週期生成器應該通過消除底層流場動畫中的「負面」效應來消除這種輕微的怪異現象。
未來:使用波紋隨機圖像進行色散映射失真.
平鋪畫布
平鋪圖像可以非常大或非常小,設計用於水平和垂直拼接在一起,以覆蓋大面積區域。感謝全球資訊網,有大量的平鋪圖像可供使用(找到您想要的圖像是另一回事)。以下是一組平鋪圖像,我從 Anthony 的圖示庫 複製而來,用於這些範例頁面。
![[IM Output]](../images/bg.gif)
bg.gif
![[IM Output]](../images/tile_aqua.jpg)
tile_aqua.jpg
![[IM Output]](../images/tile_water.jpg)
tile_water.jpg
![[IM Output]](rings.jpg)
rings.jpg
![[IM Output]](../images/tile_disks.jpg)
tile_disks.jpg
![[IM Output]](../images/tile_weave.gif)
tile_weave.gif
目前,您可以通過多種方式在大面積區域上平鋪圖像。您可以「-tile
」任何圖像,以便完全替換原始背景圖像(使用「Copy
」合成運算符)。(如需更多詳細資訊,請參閱 平鋪合成)。
magick composite -tile tile_weave.gif -size 60x60 xc:none tile_copy.gif
另一種方法是使用「tile:
」編碼器讀取平鋪圖像,並將其平鋪到特定大小。
magick -size 60x60 tile:bg.gif tile_size.gif


請注意,「tile:
」編碼器會將圖像中的任何透明度替換為當前背景顏色。這是因為它在內部會生成一個所請求大小的畫布,並將平鋪圖像「覆蓋」到該畫布上。
如果您想保留透明度,請設置「-background none
」或「-compose SRC
」(有關詳細資訊,請參閱 Src 合成方法)。
您可以使用它來生成比您需要的更大的平鋪圖像,然後使用「-composite
」將其覆蓋在原始圖像上。如果平鋪圖像部分透明,則需要指定「Over
」 「-compose
」方法。這是一種非常慢的平鋪方法,尤其是對於大型圖像,並且您會遇到確定覆蓋圖像需要創建多大尺寸的問題。
magick test.png -size 200x200 tile:tile_disks.jpg \
-composite tile_over.gif
通過將圖磚指定為 “-draw
” 操作符的“圖磚填充圖案”,您可以將圖磚圖像繪製在另一個圖像之上,以創建您喜歡的任何形狀或圖案。這是因為“-tile
”設置將覆蓋繪圖使用的任何“-fill
”顏色設置。請參閱MVG繪圖設置。
magick -size 60x60 xc: -tile tile_aqua.jpg \
-draw "circle 30,30 2,30" tile_draw.gif
這僅適用於“-draw
”和像“-annotate
”這樣的操作符,這些操作符也使用“-draw
”來執行其功能。它不適用於直接使用“-fill
”顏色的圖像操作符,例如“標籤:
”、“標題:
”和“文字:
”。
但是,“-draw
”內置了一些特殊的顏色基元,例如將圖像中的所有像素完全重置為填充顏色或圖磚圖案(如果已設置)。
magick test.png -tile tile_water.jpg -draw "color 0,0 reset" \
tile_reset.gif
這實際上與某些純色畫布方法使用特定顏色的方法完全相同。只是這裡我們使用了“-tile
”而不是“-fill
”顏色。
更先進的方法是使用具有特殊變形視口設置的變形操作符,該設置設置為原始圖像的大小(使用已定義的全局工件和百分比轉義)。這基本上是將較小的圖磚虛擬像素(圍繞著小的圖磚圖像)映射到更大的圖磚畫布上。
magick rose: -set option:distort:viewport '%g' +delete \
tree.gif -virtual-pixel tile -filter point -distort SRT 0 \
tile_distort_sized.gif
請參閱通過變形進行平鋪(如下),我們將在其中查看相同的技術來平鋪已經在內存中的圖像。偏移平鋪畫布
有時,您需要更多地控制背景紋理的確切位置,以便將圖磚圖案與其他圖像對齊,或者避免與最終圖像的其他部分產生不良的關聯。對於許多標準的平鋪方法,可以使用“-tile-offset
”設置來實現。例如,在這裡,我滾動正在使用的圖磚圖像,以使用“tile:
”或“pattern:
”直接創建平鋪的畫布圖像。
magick -size 80x80 -tile-offset +30+30 tile:rose: offset_tile.gif
magick -size 80x80 -tile-offset +20+20 \
pattern:checkerboard offset_pattern.gif


在 IM 6.3.9-9 版本之前,“圖磚偏移
”設置已損壞,因為“X”偏移量同時用於“X”和“Y”偏移量值(給定的“Y”值被忽略)。這意味著,雖然上面的示例可以正常工作(X 和 Y 偏移量相同),但當兩個值不同時,您可能無法獲得預期的結果。
這也適用於“magick montage
”背景“-texture
”設置。
montage tree.gif -geometry +24+24 \
-tile-offset +30+30 -texture rose: offset_texture.gif
您也可以通過在“-tile
”或“-fill
”設置之前定義設置來使用該設置。例如...
magick -tile-offset +30+30 -tile rose: \
-size 80x80 xc: -draw 'color 30,20 reset' offset_tile_fill.gif
確保在定義“-tile
”圖像之前重置“-size
”設置,但在讀取任何其他圖像之後。
magick -size 80x80 xc: \
-tile-offset +20+20 +size -tile pattern:checkerboard \
-draw 'color 30,20 reset' offset_pattern_good.gif
在任何情況下,最好在第一次使用之前定義圖磚偏移量和圖磚圖像,這與上述解決方案具有相同的效果。使用已在內存中的圖像進行平鋪
平鋪內存中已有的圖像(已創建或修改)並非易事,並且只有少數幾種間接方法可用。
克隆並追加圖磚圖像
如果您不擔心拼貼影像的確切大小,您可以將影像多次附加在一起。例如,我們在此將影像以 3x3 陣列拼貼。
magick tree.gif \
\( +clone +clone \) +append \
\( +clone +clone \) -append \
tile_clone.gif
這種拼貼方法的優點是允許您翻轉拼貼(鏡像拼貼)影像。
magick tree.gif \
\( +clone -flop +clone \) +append \
\( +clone -flip +clone \) -append \
tile_clone_flip.gif
一般來說,這種方法只有在您對要拼貼的影像大小有所了解時才實用。此外,由於複製實際上非常快速和有效,因此這是一種相當簡單快速的拼貼方法,尤其是在您使用結果進一步拼貼更大的影像時。 使用 MPR 拼貼:(記憶體程式暫存器)
更好的方法是將影像儲存為特殊的「記憶體內」檔案格式「mpr:
」,或稱為「記憶體程式暫存器」。然後,您可以從這個暫存器使用「-tile
」設定,或使用特殊的「tile:
」影像檔案讀取器,這兩者都只能從「已儲存」的影像檔案格式設定。
例如,使用「tile:
」建立特定大小的拼貼影像…
magick tree.gif -write mpr:tile +delete \
-size 100x100 tile:mpr:tile tile_mpr.gif


請記住,「tile:
」編碼器會將影像中的任何透明度替換為目前的背景顏色。(見上文)
或者,透過設定「-tile
」或「-fill
」填充圖案,並使用「-draw
」進行顏色重置(請參閱顏色填充基元)來拼貼現有影像…
magick tree.gif -write mpr:tile +delete \
granite: -fill mpr:tile -draw 'color 0,0 reset' \
tile_mpr_reset.gif


如果使用包含透明度的影像進行拼貼,請使用「-alpha set
」確保目標影像也具有透明度。如果您不這樣做,產生的影像將會顯示拼貼「隱藏」的透明度顏色。
或者使用其他繪製基元(例如圓形)使用填充圖案進行繪製。
magick tree.gif -write mpr:tile +delete \
granite: -tile mpr:tile -draw 'circle 64,64 10,50' \
tile_mpr_fill.gif
「mpr:
」後面給出的名稱可以是您喜歡的任何名稱,它只是用於儲存影像(在記憶體中)的「mpr」暫存器名稱上的標籤。它甚至可以是標籤、數字、顏色,甚至是檔名。 透過扭曲使用虛擬像素進行拼貼
在這種方法中,我們使用虛擬像素設定來產生大型拼貼畫布。此設定定義了實際影像周圍區域(正常影像邊界之外)的外觀。提取虛擬像素的最簡單方法是將扭曲運算子與特殊的扭曲視口設定一起使用。
magick tree.gif -set option:distort:viewport 100x100+0+0 \
-virtual-pixel tile -filter point -distort SRT 0 \
tile_distort.gif
您還可以存取其他樣式的虛擬像素拼貼設定,例如「鏡像
」,甚至是「棋盤格拼貼
」,甚至可以使用視口設定進行良好的偏移拼貼控制。
magick tree.gif -set option:distort:viewport 100x100-10-10 \
-background firebrick -virtual-pixel CheckerTile \
-distort SRT 0 +repage tile_distort_checks.gif
透過以這種方式使用通用扭曲運算子,您還可以額外獲得以一些非常複雜的方式扭曲拼貼影像的優勢。您可以在扭曲仿射拼貼中看到這方面的範例。作為一個更複雜的範例,我在這裡使用弧形扭曲將樹木圍繞以視口為中心的原點進行拼貼。「45
」指定樹木寬度覆蓋的角度,而「50
」定義樹木拼貼頂部邊緣的半徑。其餘的都由此推斷。
magick tree.gif -set option:distort:viewport 100x100-50-50 \
-virtual-pixel tile -distort Arc '45 0 50' +repage \
tile_distort_polar.gif
修改內建的 IM 圖案/拼貼
請參閱ImageMagick 內建影像和圖案的完整清單。有很多這樣的圖案,但我只在這裡介紹一兩個。現在,內建圖案通常是非常非常小的影像,可以拼貼以覆蓋大面積。但是,它們本身看起來非常單調,而且相當無用。例如,這裡提供了一個更大、更有趣的圖案…
magick pattern:checkerboard pattern_default.gif
圖案影像通常會被平鋪到更大的區域,可以是建立畫布的一部分,透過設定「-size
」,或者作為填充區塊(請參閱上方平鋪畫布)。如果沒有設定尺寸,則會使用預設的區塊尺寸,在本例中為30x30
像素。現在您可能會注意到,IM 目前提供的所有圖案都是純黑白的,除了我在上一個範例中使用的「checkerboard
」圖案之外。
以下是我特別喜歡用作區塊圖案的一個圖案...
magick -size 60x60 pattern:hexagons pattern_hexagons.gif
如果您不喜歡這些顏色,可以使用「-opaque
」影像運算子替換它們。
magick -size 60x60 pattern:hexagons \
-fill blue -opaque black -fill skyblue -opaque white \
pattern_colored.gif
如果您想要為「checkerboard
」圖案上色,最好先使用「-auto-level
」將兩種灰色映射到黑色和白色,然後再替換這兩種顏色。這裡我沒有使用「-opaque
」來替換顏色,而是使用了「+level-colors
」運算子(IM v6.2.4-1 新增),它使用起來更簡單一些。
magick -size 60x60 pattern:checkerboard -auto-level \
+level-colors red,blue pattern_color_checks.gif
您也可以使用「-floodfill
」運算子為圖案上色。但是,要使其正常運作,您需要在平鋪修改後的圖案*之前*執行此操作。在這種情況下,我還需要將區塊擴展三倍,才能使用我想要的規則顏色圖案為其上色。
magick -size 30x54 pattern:hexagons \
-fill tomato -opaque white \
-fill dodgerblue -draw 'color 10,10 floodfill' \
-fill limegreen -draw 'color 10,25 floodfill' \
-roll +15+27 \
-fill dodgerblue -draw 'color 10,10 floodfill' \
-fill limegreen -draw 'color 10,25 floodfill' miff:- |\
magick -size 100x100 tile:- pattern_color_hexagons.gif
我在上面使用了兩個指令的管道,將彩色圖案的建立與其實際使用分開。如果您想使用單一指令執行此操作,請參閱上方在記憶體中平鋪影像。
您也可以扭曲和變形簡單的平鋪圖案,以產生有趣的變化。例如,在六邊形圖案上產生「皺紋」效果(技巧來自 字體影像產生器 的皺紋 IM 效果),我覺得這一點特別有趣。
magick -size 160x100 pattern:hexagons \
-wave 3x100 -background white -rotate 90 -wave 4x66 -rotate -87 \
-gravity center -crop 120x90+0+0 +repage pattern_distorted.gif
修改平鋪圖像
人們在修改區塊時面臨的最大問題是,無論是現有的區塊還是內建的圖案之一,許多影像操作都會破壞影像的「可平鋪性」。例如,這裡我使用了內建的「hexagon
」圖案,並嘗試修改它以產生寬六邊形線條的陰影灰階圖案。
magick pattern:hexagons -rotate 90 \
-blur 0x1 -edge 1 -negate -shade 120x45 \
miff:- |\
magick -size 100x100 tile:- tile_mod_failure.jpg
第一個指令產生「區塊影像」,而第二個指令實際上是平鋪影像,因此我們可以看到它們是如何組合在一起的。如您所見,產生的區塊影像*沒有*正確平鋪,在平鋪的影像中可以清楚地看到人為的邊緣失真。基本上,我們失去了原始區塊沿著影像邊緣的均勻性。一種解決方案是使用特殊的虛擬像素設定,當查詢超出實際影像範圍的顏色時,該設定用於使運算子認為影像是圍繞邊緣環繞的。
magick pattern:hexagons -rotate 90 -virtual-pixel tile \
-blur 0x1 -edge 1 -negate -shade 120x45 \
miff:- |\
magick -size 100x100 tile:- tile_mod_vpixels.jpg
以下是我將兩個相關的區塊圖案組合在一起,並使用各種效果建立不尋常的磚牆區塊的另一個範例。
magick pattern:leftshingle pattern:rightshingle +append \
-virtual-pixel tile -blur 0x0.75 -resize 150% -shade 100x45 \
-fill Peru -tint 100% miff:- |\
magick -size 100x100 tile:- tile_slanted_bricks.jpg
替代方案
除了依靠虛擬像素,還有另一種選擇。基本上,我們在處理影像之前,先自行提供「虛擬邊緣像素」,以避免任何可能出現的邊緣效應。做法是先將影像平鋪到一個稍微大一點的區域。修改影像後,我們可以重新擷取區塊,避免引入邊緣扭曲。根據執行的影像操作範圍,它不一定要大很多。我發現 15 到 40 個像素應該可以阻止最終結果中的所有邊緣效應。要重新擷取影像,我們可以「-shave
」掉額外的像素,或從處理過的影像中間「-crop
」出原始區塊大小。例如,這裡我使用內建的「hexagons
」模式建立了一個 3D「-shade
」效果。
magick -size 60x60 tile:pattern:hexagons -rotate 90 \
-blur 0x1 -edge 1 -negate -shade 120x45 \
-gravity center -crop 18x30+0+0 +repage miff:- |\
magick -size 100x100 tile:- tile_mod_success.jpg
請注意,擷取區塊的確切位置並不重要。只要遠離扭曲的邊緣,並使用與原始區塊相同的尺寸,就可以從平鋪影像的任何位置剪切可平鋪影像。這裡我們沒有將影像平鋪到更大的區域,而是使用「雙重複製」技術將區塊覆蓋的區域加倍。完成後,我們只需將影像的中心裁剪 50% 即可恢復我們修改過的區塊。這表示我們不需要知道您正在處理的區塊的確切大小。
magick pattern:circles \( +clone \) +append \( +clone \) -append \
-fill grey -opaque black -blur 0x0.5 -shade 120x45 \
-gravity center -crop 50% +repage miff:- |\
magick -size 100x100 tile:- tile_circles.jpg
產生區塊影像
產生可以拼接在一起的影像時,您面臨的最大問題是嘗試匹配影像的邊緣和角落,以便它們可以無縫地拼接在一起。如果沒有這樣做,那麼您得到的只是一組方形方塊,每個方塊都重複著影像的副本。這不是一件容易的事,而且可能會是一個非常令人沮喪和抓狂的經歷。出現在區塊一邊緣的物件必須重新出現在影像的另一邊,以便在影像平鋪時重新形成整體。雖然使用電腦生成的影像可以相當容易地做到這一點,但幾乎不可能產生具有真實世界照片的良好平鋪影像。另一個主要問題是盡量使區塊看起來不像在重複。唯一真正的解決方案是使您的區塊影像足夠大,以包含足夠相似但仍然不同的元素,從而難以看到重複的圖案。因此,產生看起來不重複的小區塊尤其困難。FUTURE: Ideas and suggestions for generating tile patterns? Anyone?
Or roll, add element, roll, add element, etc...
Any and all suggestions and examples accepted.
Suggestions for generating tile from real photos of repeating patterns,
such as water, fallen leaves, clouds, stucco, brickwork, etc...
Generating Escher-like tile patterns.
隨機雜訊區塊
因為原始隨機雜訊畫布一開始就沒有邊緣特徵(每個像素顏色都完全獨立於其任何相鄰像素),您可以平鋪它而不擔心邊緣扭曲。基本上,它在像素級別上是如此極其隨機,以至於沒有邊緣可以匹配,因此我們不會因為平鋪而丟失任何東西。不幸的是,很少有情況會在任何實際目的下按原樣使用原始的隨機雜訊影像。它實在是太隨機了,以至於毫無用處。但是,通過在保留其固有可平鋪性的同時修改影像,我們可以製作出我們想要的任何隨機區塊圖案。
例如,讓我們看一下原始區塊的基本「-blur
」,使用我們在上一個範例中使用的相同「修改區塊」技術。
magick -size 64x64 xc: +noise Random \
-virtual-pixel tile -blur 0x6 -auto-level tile_random.jpg
magick -size 128x128 tile:tile_random.jpg tiled_random.jpg
![[IM Output]](tile_random.jpg)
使用這種技術,您可以對原始隨機雜訊影像應用幾乎任何變換。舉例來說...
magick -size 64x64 xc: +noise Random \
-virtual-pixel tile -blur 0x6 -edge 1 -fx G \
-shade 280x45 -auto-level tile_random_pits.jpg
magick -size 128x128 tile:tile_random_pits.jpg tiled_random_pits.jpg
![[IM Output]](tile_random_pits.jpg)
如您所見,使用原始隨機雜訊影像建立隨機拼貼要簡單得多,而且結果中不會有任何邊緣失真。這種特殊的影像轉換列在背景影像頁面上,標題為「凹坑」。請參閱該頁面以獲取更多其他影像隨機影像轉換範例以及它們的外觀。六邊形平鋪
「隨機雜訊」影像允許我們產生一種與方形拼貼非常不同的拼貼方式。透過將影像尺寸加倍並將拼貼重新放置在額外的空間中(但偏移一半),我們可以產生基本的隨機雜訊六邊形拼貼圖案。
這與我們在拼貼 ImageMagick 的內建特殊「pattern:hexagons
」時獲得的拼貼效果相同。
magick pattern:hexagons tile_hexagons.gif
magick -size 64x64 pattern:hexagons tiled_hexagons.gif
![[IM Output]](tile_hexagons.gif)
但是請注意,要使此拼貼看起來像「六邊形」,拼貼不能是普通的正方形,甚至不能是雙倍的正方形。最終的拼貼尺寸必須是矩形。此矩形的確切比例實際上涉及無理數,這對於使用像素陣列的影像處理來說不是很好。但是,一個良好的工作比例是 4:3,這是大多數電腦和數位相機影像使用的比例。
在這裡,我們將相同的「隨機雜訊」影像(長寬比為 2:3 的矩形)額外覆蓋兩次,以產生基本的六邊形圖案(在 4:3 的矩形中)。然後使用背景影像頁面中的「paint_3s」轉換來轉換六邊形拼貼的隨機雜訊拼貼,以產生相當漂亮的六邊形拼貼圖案。
magick -size 48x64 xc: +noise Random -write mpr:rand \
-extent 96x64 -page +48-32 mpr:rand -page +48+32 mpr:rand \
-flatten tile_hex_random.jpg
magick tile_hex_random.jpg -virtual-pixel tile -blur 0x10 -paint 3 \
-shade 280x45 -auto-level tile_hex_layered.jpg
magick -size 160x160 tile:tile_hex_layered.jpg tiled_hex_layered.jpg
![[IM Output]](tile_hex_layered.jpg)
如果您查看拼貼產生的圖案,您會發現任何特定特徵在圓圈中都會有 6 個相同特徵的副本。這就是拼貼產生的「六邊形」圖案,即使它仍然以與所有其他拼貼影像相同的「方形」圖案拼貼。上述「六邊形」圖案的一種變體是垂直加倍拼貼影像,而不是像我們上面所做的那樣水平加倍。結果是六邊形圖案將旋轉九十度。然而,它仍然是相同類型的圖案。


從數學上講,上述操作並不是從現有拼貼生成新的壁紙群。原始的「非六邊形」影像和最終版本都屬於相同的「p1」拼貼群。
我們在上面實際上做的是將菱形「原形拼貼」拼貼圖案轉換為相同拼貼圖案的更大矩形正交對齊「基本域」。透過這種方式,您可以使用標準拼貼方法來拼貼影像。
未來:翻轉額外的影像以產生更大的拼貼圖案(pmg 拼貼群)。 未來:如何從影像中剪切(遮罩)六邊形,使其完美拼貼,沒有間隙或重疊。三重六邊形平鋪
就像我們在為「hexagons
」內建圖案著色時所做的那樣(請參閱上面的修改內建 IM 圖案/拼貼),您可以在重新映射它們以形成更大的拼貼之前,製作初始拼貼的三種不同變體(例如旋轉)。當然,就像我在為「hexagons
」圖案著色時所做的那樣,最終的拼貼影像需要放大三倍,以便生成重複的矩形拼貼圖案。生成的三个拼贴之间的差异不能太大,并且应该在任何后处理中都得以保留,否则您将无法获得该技术的优势。这意味着初始拼贴也必须相当大,以便保留存在的任何独特特征。例如,在这里我们采用一个非常简单的线条图,并对其进行旋转以生成 3 个相似的变体。然后将这些旋转后的影像拼贴到更大的畫布上七次(放大六倍),以生成三拼貼六邊形圖案。
magick -size 24x24 xc: -draw "rectangle 3,11 20,12" tile_line.gif
magick tile_line.gif -gravity center\
\( +clone -rotate 0 -crop 24x18+0+0 -write mpr:r1 +delete \) \
\( +clone -rotate 120 -crop 24x18+0+0 -write mpr:r2 +delete \) \
-rotate -120 -crop 24x18+0+0 -write mpr:r3 +repage \
-extent 72x36 -page +0+0 mpr:r3 \
-page +24+0 mpr:r1 -page +48+0 mpr:r2 \
-page -12+18 mpr:r1 -page +12+18 mpr:r2 \
-page +36+18 mpr:r3 -page +60+18 mpr:r1 \
-flatten tile_hex_lines.jpg
magick -size 120x120 tile:tile_hex_lines.jpg tiled_hex_lines.jpg
![[IM Output]](tile_line.gif)
![[IM Output]](tile_hex_lines.jpg)
但是,以上方法僅適用於在原始圖像中間平鋪一個小形狀,對於一般圖像的效果不佳。對於一般的圖像六邊形平鋪,我們還需要遮罩出等邊三角形。然後旋轉這些片段,使等邊三角形的邊緣鏡像對稱。這不是一件容易的事。對角鏡像平鋪
以下是一種將任何正方形圖像變換為圍繞中心點的 8 個鏡像圖像的方法。具體來說,我們正在生成一個複雜的「p4m」平鋪圖案。我首先生成一個隨機色調圖像,並使用源圖像的左下半部分,將其沿對角線、水平和垂直方向進行鏡像。
magick -size 50x50 xc: +noise Random -virtual-pixel Tile -blur 0x5 \
-auto-level -separate -background white \
-compose ModulusAdd -flatten -channel R -combine +channel \
-set colorspace HSB -colorspace RGB tile_diag_source.jpg
magick tile_diag_source.jpg \( +clone -transpose \) \
\( +clone -sparse-color voronoi '%w,0 white 0,%h black' \) \
-composite \
\( +clone -flop -chop 1x0 \) +append \
\( +clone -flip -chop 0x1 \) -append \
tile_diag_mirror.jpg
![[IM Output]](tile_diag_source.jpg)
對角線鏡像的生成方式是先進行轉置,然後使用通過Voronoi 稀疏顏色生成的遮罩。請注意,由於正方形的像素幾何形狀,此對角線鏡像會自動以相同的方式跨鏡像共享一行像素。在創建垂直和水平翻轉之前,我還會沿邊緣移除一組像素。我還建議在使用此圖像作為「平鋪」之前,沿頂部和左側邊緣移除另一行和一列像素。您不需要這樣做,但我認為這樣看起來更好。如果不移除一行和一列邊緣像素,則圖像連接處會出現難看的「接縫」,即像素加倍。另一種方法是先平鋪原始隨機圖像,然後進行背景圖案轉換,這樣沿鏡像線不太可能出現「裁剪」的外觀,而是更加平滑的過渡。
magick -size 51x51 xc: +noise Random \( +clone -transpose \) \
\( +clone -sparse-color voronoi '%w,0 white 0,%h black' \) \
-composite \
\( +clone -flop -chop 1x0 \) +append \
\( +clone -flip -chop 0x1 \) -append \
-chop 1x1 \
\
-virtual-pixel Tile -blur 0x5 -auto-level \
-separate -background white \
-compose ModulusAdd -flatten -channel R -combine +channel \
-set colorspace HSB -colorspace RGB tile_p4m.jpg
第一部分是生成「隨機數據的平鋪」,第二部分是將隨機數據變換為「色調」映射。我還在初始圖像中添加了一個額外的像素,稍後將根據需要裁剪該像素以生成平鋪圖像。
有關平鋪圖像及其背後數學原理的更完整介紹,請參閱維基百科:壁紙群。我們上面探討的只是您可以創建的眾多平鋪圖案中的一小部分。
「p4g」與上面的「p4m」平鋪幾乎完全相同,但它使用鏡像正方形的 180 度旋轉(而不是翻轉)來生成完整的平鋪圖像。但是,由於圖像不是通過鏡像連接的,因此您不能使用現有圖像作為平鋪源,因為邊緣會變得不相交和不連續。但是,您可以先平鋪原始隨機數據,然後處理生成的平鋪圖像,以產生平滑的結果。
magick -size 50x50 xc: +noise Random \( +clone -transpose \) \
\( +clone -sparse-color voronoi '%w,0 white 0,%h black' \) \
-composite \
\( +clone -rotate -90 \) +append \
\( +clone -rotate 180 \) -append \
\
-virtual-pixel Tile -blur 0x5 -auto-level \
-separate -background white \
-compose ModulusAdd -flatten -channel R -combine +channel \
-set colorspace HSB -colorspace RGB tile_p4g.jpg
請注意,由於平鋪的非鏡像特性,您在追加之前不需要從邊緣移除重複的行或列像素。但是,如果您想對這兩種情況都遵循相同的處理流程,那麼這樣做也無妨。