如何对浮点 numpy 数组进行高斯滤波(模糊)
How to gauss-filter (blur) a floating point numpy array
我有一个 float64
类型的 numpy 数组 a
。我如何使用高斯滤波器模糊这些数据?
我试过了
from PIL import Image, ImageFilter
image = Image.fromarray(a)
filtered = image.filter(ImageFilter.GaussianBlur(radius=7))
,但这会产生 ValueError: 'image has wrong mode'
。 (它有模式 F
。)
我可以通过将 a
乘以某个常数,然后四舍五入为整数来创建合适模式的图像。那应该可以,但我想有一个更直接的方法。
(我正在使用 Pillow 2.7.0。)
如果你有一个二维的numpy数组a
,你可以直接在上面使用高斯滤波器而不用先用Pillow把它转换成图像。 scipy 有一个函数 gaussian_filter
做同样的事情。
from scipy.ndimage.filters import gaussian_filter
blurred = gaussian_filter(a, sigma=7)
这是我只使用 numpy 的方法。
它是用一个简单的 3x3 内核准备的,稍作改动就可以使其适用于自定义大小的内核。
def blur(a):
kernel = np.array([[1.0,2.0,1.0], [2.0,4.0,2.0], [1.0,2.0,1.0]])
kernel = kernel / np.sum(kernel)
arraylist = []
for y in range(3):
temparray = np.copy(a)
temparray = np.roll(temparray, y - 1, axis=0)
for x in range(3):
temparray_X = np.copy(temparray)
temparray_X = np.roll(temparray_X, x - 1, axis=1)*kernel[y,x]
arraylist.append(temparray_X)
arraylist = np.array(arraylist)
arraylist_sum = np.sum(arraylist, axis=0)
return arraylist_sum
使用卷积的纯 numpy 解决方案和高斯滤波器的可分离性分为两个单独的滤波器步骤(这使得它相对较快):
kernel = np.array([1.0,2.0,1.0]) # Here you would insert your actual kernel of any size
a = np.apply_along_axis(lambda x: np.convolve(x, kernel, mode='same'), 0, a)
a= np.apply_along_axis(lambda x: np.convolve(x, kernel, mode='same'), 1, a)
我对如何用 open-cv (cv2)
做到这一点的看法
我使用的内核大小为 (3, 3)
请务必根据您的需要进行调整。
有关配置可能性的更多详细信息和 openCV 的更多解决方案,请参见 here。
import cv2 # pip install opencv-python
image = cv2.GaussianBlur(image, (3, 3), cv2.BORDER_DEFAULT)
我有一个 float64
类型的 numpy 数组 a
。我如何使用高斯滤波器模糊这些数据?
我试过了
from PIL import Image, ImageFilter
image = Image.fromarray(a)
filtered = image.filter(ImageFilter.GaussianBlur(radius=7))
,但这会产生 ValueError: 'image has wrong mode'
。 (它有模式 F
。)
我可以通过将 a
乘以某个常数,然后四舍五入为整数来创建合适模式的图像。那应该可以,但我想有一个更直接的方法。
(我正在使用 Pillow 2.7.0。)
如果你有一个二维的numpy数组a
,你可以直接在上面使用高斯滤波器而不用先用Pillow把它转换成图像。 scipy 有一个函数 gaussian_filter
做同样的事情。
from scipy.ndimage.filters import gaussian_filter
blurred = gaussian_filter(a, sigma=7)
这是我只使用 numpy 的方法。 它是用一个简单的 3x3 内核准备的,稍作改动就可以使其适用于自定义大小的内核。
def blur(a):
kernel = np.array([[1.0,2.0,1.0], [2.0,4.0,2.0], [1.0,2.0,1.0]])
kernel = kernel / np.sum(kernel)
arraylist = []
for y in range(3):
temparray = np.copy(a)
temparray = np.roll(temparray, y - 1, axis=0)
for x in range(3):
temparray_X = np.copy(temparray)
temparray_X = np.roll(temparray_X, x - 1, axis=1)*kernel[y,x]
arraylist.append(temparray_X)
arraylist = np.array(arraylist)
arraylist_sum = np.sum(arraylist, axis=0)
return arraylist_sum
使用卷积的纯 numpy 解决方案和高斯滤波器的可分离性分为两个单独的滤波器步骤(这使得它相对较快):
kernel = np.array([1.0,2.0,1.0]) # Here you would insert your actual kernel of any size
a = np.apply_along_axis(lambda x: np.convolve(x, kernel, mode='same'), 0, a)
a= np.apply_along_axis(lambda x: np.convolve(x, kernel, mode='same'), 1, a)
我对如何用 open-cv (cv2)
做到这一点的看法我使用的内核大小为 (3, 3)
请务必根据您的需要进行调整。
有关配置可能性的更多详细信息和 openCV 的更多解决方案,请参见 here。
import cv2 # pip install opencv-python
image = cv2.GaussianBlur(image, (3, 3), cv2.BORDER_DEFAULT)