Câu hỏi hay! tcaswell đăng ở đây là một gợi ý tuyệt vời, nhưng bạn sẽ không học nhiều theo cách này bởi vì scipy đang làm tất cả công việc cho bạn! Vì câu hỏi của bạn nói rằng bạn muốn thử và viết hàm, tôi sẽ cho bạn thấy một cách thô lỗ và cơ bản hơn để làm tất cả bằng tay với hy vọng rằng bạn sẽ hiểu rõ hơn về toán học sau convolution, v.v. có thể cải thiện nó bằng những ý tưởng và nỗ lực của riêng bạn!
Lưu ý: Bạn sẽ nhận được kết quả khác nhau với các hình dạng/kích thước khác nhau của hạt nhân, Gaussian là cách thông thường nhưng bạn có thể thử một số khác cho vui (cosin, tam giác, v.v.). Tôi vừa tạo ra cái này ngay tại chỗ, tôi nghĩ đó là một loại hình kim tự tháp.
import scipy.signal
import numpy as np
import matplotlib.pyplot as plt
im = plt.imread('example.jpg')
im /= 255. # normalise to 0-1, it's easier to work in float space
# make some kind of kernel, there are many ways to do this...
t = 1 - np.abs(np.linspace(-1, 1, 21))
kernel = t.reshape(21, 1) * t.reshape(1, 21)
kernel /= kernel.sum() # kernel should sum to 1! :)
# convolve 2d the kernel with each channel
r = scipy.signal.convolve2d(im[:,:,0], kernel, mode='same')
g = scipy.signal.convolve2d(im[:,:,1], kernel, mode='same')
b = scipy.signal.convolve2d(im[:,:,2], kernel, mode='same')
# stack the channels back into a 8-bit colour depth image and plot it
im_out = np.dstack([r, g, b])
im_out = (im_out * 255).astype(np.uint8)
plt.subplot(2,1,1)
plt.imshow(im)
plt.subplot(2,1,2)
plt.imshow(im_out)
plt.show()
Bạn có lẽ sẽ cần một dây leo 2d, ví dụ 'scipy.signal.convolve2d' – wim