ImageMagick 示例 --
傅里叶乘/除法
DIY FFT 数学入门
下面是一些使用两种不同风格的快速傅里叶变换图像进行乘法和除法的技术的示例。基本上有两种方法可以进行数学运算。使用 FX 数学,以及使用合成数学……- FX 数学
- 使用 FX,DIY 运算符 直接应用公式。但由于它是被解释执行的,因此非常慢。但是,所有公式都包含在一个表达式中,避免了需要中间图像。对于 IM 的非 HDRI 版本,这将减少量子舍入效应。
- 合成数学
- 这利用图像合成来执行数学运算,这比“FX 数学”快得多。但是您一次只能执行一个数学运算,这意味着每次运算后都必须将图像保存到另一个内存中的图像中。对于非 HDRI 版本,这将在运算之间产生额外的“舍入效应”。
![]() ![]() |
将中间 HDRI 图像保存到磁盘文件时,您需要使用极少数的浮点图像文件格式之一。这些格式包括 NetPBM PFM 文件格式、TIFF 或 MIFF 文件格式,并使用特殊设置“-define quantum:format=floating-point ”。
|
这是我们将要使用的卷积核图像……
-roll -64-64
”。内核图像还需要除以其平均值,以保持其被 FFT 乘或除的图像的强度。这是 FFT 乘法和除法的一个主要复杂因素。由于非 HDRI 图像无法以这种方式归一化,因此通常在应用 FFT 转换后以及乘法之前进行。对于 IM 的 HDRI 版本,您可以在任何时间进行此操作。
FFT 乘法 (
)
幅度/相位图像的 FFT 乘法,使用 IM Q16
R = A ⊗ B ( FFT Multiply ) Rm = Am × Bm Rp = mod( Ap + Bp +0.5, 1.0) mean = the DC value (center pixel) of the magnitude image使用 FX 数学,
(注意值 v.p{64x64} 是 DC,或卷积核的平均值)
# non-HDRI magick convolve_kernel.png -roll -64-64 -fft \ \( cameraman_sm.png -fft \) \ \ \( -clone 0,2 -fx 'u*v / p{64,64} ' \) \ \( -clone 1,3 -fx 'mod(u + v + 0.5, 1.0)' \) \ \ -delete 0-3 -ift cameraman_convolve_1.png |
![[IM Output]](../../img_photos/cameraman_sm.png)

![[IM Output]](convolve_kernel.png)

![[IM Output]](cameraman_convolve_1.png)
# non-HDRI magick convolve_kernel.png -roll -64-64 -fft \ \( -clone 0 -crop 1x1+64+64 +repage -scale 128x128 \ -clone 0 -compose divide -composite \) -swap 0 +delete \ \( cameraman_sm.png -fft \) \ \ \( -clone 0,2 -compose multiply -composite \) \ \( -clone 1,3 -compose add -background gray50 -flatten \) \ -delete 0-3 -ift cameraman_convolve_2.png |
![[IM Output]](../../img_photos/cameraman_sm.png)

![[IM Output]](convolve_kernel.png)

![[IM Output]](cameraman_convolve_2.png)
用原始图像的平均值除
# non-HDRI magick convolve_kernel.png \( -clone 0 -roll -64-64 -fft \) \ \( -clone 0 -scale 1x1 -scale 128x128 \ -clone 1 -compose divide -composite \) \ -delete 0,1 +swap \ \( cameraman_sm.png -fft \) \ \ \( -clone 0,2 -compose multiply -composite \) \ \( -clone 1,3 -compose add -background gray50 -flatten \) \ -delete 0-3 -ift cameraman_convolve_2b.png |
![[IM Output]](../../img_photos/cameraman_sm.png)

![[IM Output]](convolve_kernel.png)

![[IM Output]](cameraman_convolve_2b.png)
请注意,DC 值除以 DC 值 ==> 1.0由于 DC 值是幅度谱中最大的值,为什么不直接归一化!例如:
-auto-level
”这只能对幅度图像进行,并且不适用于实部/虚部对,因为它们必须以相同的量进行拉伸。
# non-HDRI magick convolve_kernel.png -roll -64-64 -fft \ \( -clone 0 -auto-level \) -swap 0 +delete \ \( cameraman_sm.png -fft \) \ \ \( -clone 0,2 -compose multiply -composite \) \ \( -clone 1,3 -compose add -background gray50 -flatten \) \ \ -delete 0-3 -ift cameraman_convolve_2c.png |
![[IM Output]](../../img_photos/cameraman_sm.png)

![[IM Output]](convolve_kernel.png)

![[IM Output]](cameraman_convolve_2c.png)
实部/虚部图像的 FFT 乘法,使用 IM HDRI
R = A ⊗ B ( FFT Multiply ) Rr = Ar×Br - Ai×Bi Ri = Ar×Bi + Ai×Br mean = the DC value (center pixel) of the real image使用 FX……
涉及 5 幅图像,第 5 幅图像为缩放的平均值 - FX 进行除法
|
![[IM Output]](../../img_photos/cameraman_sm.png)

![[IM Output]](convolve_kernel.png)

![[IM Output]](cameraman_convolve_3.png)
使用 DC 值作为平均值(没有第 5 幅图像)
|
![[IM Output]](../../img_photos/cameraman_sm.png)

![[IM Output]](convolve_kernel.png)

![[IM Output]](cameraman_convolve_3b.png)
使用缩放图像的平均值!
|
![[IM Output]](../../img_photos/cameraman_sm.png)

![[IM Output]](convolve_kernel.png)

![[IM Output]](cameraman_convolve_4.png)
来自图像缩放的平均值
|
![[IM Output]](../../img_photos/cameraman_sm.png)

![[IM Output]](convolve_kernel.png)

![[IM Output]](cameraman_convolve_4b.png)
使用 DC 值作为平均值……
|
![[IM Output]](../../img_photos/cameraman_sm.png)

![[IM Output]](convolve_kernel.png)

![[IM Output]](cameraman_convolve_4c.png)
在 FFT 乘法之后应用 DC 值平均值……
|
![[IM Output]](../../img_photos/cameraman_sm.png)

![[IM Output]](convolve_kernel.png)

![[IM Output]](cameraman_convolve_4d.png)
FFT 除法 (
)
这里我们使用除法来去除或反卷积(为了便于理解)添加到上述图像中的模糊。它基本上完全相同,只是“归一化”的卷积核从主图像中除去了。每个示例都使用使用与上述相同技术生成的图像。
幅度/相位的 FFT 除法,使用 IM Q16
R = B ø A ( FFT Divide ) Rm = Bm / Am Rp = mod( -Ap + Bp +1.5, 1.0) mean = the DC value (center pixel) of the magnitude image注意:将 QuantumScale 的最小值添加到分母以避免完全除以零。这稍后也用于去除图像中的噪声。使用 FX 数学……
|
![[IM Output]](cameraman_convolve_1.png)

![[IM Output]](convolve_kernel.png)

![[IM Output]](cameraman_deconvolve_1.png)
|
![]() |
|
![[IM Output]](cameraman_convolve_2.png)

![[IM Output]](convolve_kernel.png)

![[IM Output]](cameraman_deconvolve_2.png)
|
![]() |
实部/虚部的 FFT 除法,使用 IM 的 HDRI 版本
R = B ø A ( FFT Divide ) Denom = Ar×Ar + Ai×Ai + noise Rr = ( Ar×Br + Ai×Bi ) / Denom Ri = ( Ar×Bi - Ai×Br ) / Denom mean = the DC value (center pixel) of the real image使用 FX……
|
![[IM Output]](cameraman_convolve_3.png)

![[IM Output]](convolve_kernel.png)

![[IM Output]](cameraman_deconvolve_3.png)
|
![]() |
|
![[IM Output]](cameraman_convolve_3.png)

![[IM Output]](convolve_kernel.png)

![[IM Output]](cameraman_deconvolve_3b.png)
|
![]() |
|
![[IM Output]](cameraman_convolve_4.png)

![[IM Output]](convolve_kernel.png)

![[IM Output]](cameraman_deconvolve_4.png)
|
![]() |
|
![[IM Output]](cameraman_convolve_4.png)

![[IM Output]](convolve_kernel.png)

![[IM Output]](cameraman_deconvolve_4b.png)
|
![]() |
更新:上述中使用颜色“gray50”应更改为“gray(50%)”以生成更准确的 50% 灰色值。之前的“命名”颜色实际上只是一个 8 位颜色,因此不太准确。此外,在新的色彩空间处理中,gray50 位于 sRGB 色彩空间中,而 gray(50%) 位于线性色彩空间中,这应该用于上述计算。还需要检查这些示例在使用线性灰度色彩空间方面的使用情况。