我有一個模式PIL.Image物件(黑白位圖),我想確定影像中的每個像素是否在任何白色像素的像素內(歐幾里德距離 -可能約為 100 左右)。input'1'nn
動機是:input代表其他兩個影像之間不同的每個像素,我想圍繞所有這些差異創建一個高光區域,以清楚地顯示差異發生的位置。
到目前為止,我還沒有找到一個快速的演算法——下面的代碼有效,但是卷積非常慢,因為kernel引數大于卷積顯然可以有效地處理:
from scipy import ndimage
import numpy as np
from PIL import Image
n = 100
y, x = np.ogrid[:2*n, :2*n]
kernel = (x-n)**2 (y-n)**2 <= n**2
img = Image.open('input.png')
result = ndimage.convolve(np.array(img), kernel) != 0
Image.fromarray(result).save('result.png')
示例輸入input.png:
所需的輸出result.png(這里還有一些不受歡迎的偽影,我假設它們來自上溢/下溢):
即使有這些小影像,計算也需要 30 秒左右。有人可以推薦一個更好的程式來計算這個嗎?謝謝。
uj5u.com熱心網友回復:
ndimage.convolve使用非常低效的演算法來執行卷積,當然運行在O(n m kn km)影像(n,m)的(kn, km)形狀和內核的形狀中。您可以使用 FFT在時間上更有效地執行此O(n m log(n m))操作。希望 scipy 提供這樣的功能。這是一個使用示例:
import scipy.signal
import numpy as np
from PIL import Image
n = 100
y, x = np.ogrid[:2*n, :2*n]
kernel = (x-n)**2 (y-n)**2 <= n**2
img = Image.open('input.png')
result = scipy.signal.fftconvolve(img, kernel, mode='same') >= 1.0
Image.fromarray(result).save('result.png')
這在我的機器上快了 500 倍以上,這也修復了人工制品。結果如下:
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/462339.html
