Одним из вариантов может быть просто использовать ядро и свертку?
Например, если мы загружаем изображение в оттенках серого, например, так:
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
from scipy import ndimage
# load a hackinsh grayscale image
image = np.asarray(Image.open('cup.jpg')).mean(axis=2)
plt.imshow(image)
plt.title('Gray scale image')
plt.show()
Теперь можно использовать ядро и свертку. Например, чтобы создать фильтр, который фильтрует только одну строку и вычислить значение центрального пикселя как разность между пикселями справа и слева, можно сделать следующее:
# Create a kernel that takes the difference between neighbors horizontal pixes
k = np.array([[-1,0,1]])
plt.subplot(121)
plt.title('Kernel')
plt.imshow(k)
plt.subplot(122)
plt.title('Output')
plt.imshow(ndimage.convolve(image, k, mode='constant', cval=0.0))
plt.show()
Таким образом, можно размыть изображение, сопоставив каждый пиксель со средним из N пикселей справа от него, создав соответствующее ядро.
# Create a kernel that takes the average of N pixels to the right
n=10
k = np.zeros(n*2);k[n:]=1/n
k = k[np.newaxis,...]
plt.subplot(121)
plt.title('Kernel')
plt.imshow(k)
plt.subplot(122)
plt.title('Output')
plt.imshow(ndimage.convolve(image, k, mode='constant', cval=0.0))
plt.show()