uho*_*hoh 4 python python-imaging-library python-3.x
使用 PIL 读取图像后,我通常使用 scipy.ndimage 执行高斯滤波器,如下所示
import PIL
from scipy import ndimage
PIL_image = PIL.Image.open(filename)
data = PIL_image.getdata()
array = np.array(list(data)).reshape(data.size[::-1]+(-1,))
img = array.astype(float)
fimg = ndimage.gaussian_filter(img, sigma=sigma, mode='mirror', order=0)
Run Code Online (Sandbox Code Playgroud)
PIL 中有如下高斯模糊函数(来自这个答案),但我不知道它究竟是如何工作的,也不知道它使用的是什么内核:
from PIL import ImageFilter
fimgPIL = PIL_image.filter(ImageFilter.GaussianBlur(radius=r)
Run Code Online (Sandbox Code Playgroud)
关于的问题PIL.ImageFilter.GaussianBlur:
对Gaussian Blur - 标准偏差、半径和内核大小的回答的评论如下,但我还没有找到 PIL 的信息。
OpenCV使用内核半径,
(sigma * 3)而scipy.ndimage.gaussian_filter使用内核半径 int(4 * sigma + 0.5)
从源代码来看,它看起来像PIL.ImageFilter.GaussianBlur使用PIL.ImageFilter.BoxBlur. 但我无法弄清楚半径和西格玛是如何相关的。
我写了一个脚本来检查之间的差异scipy.ndimage.gaussian_filter和PIL.ImageFilter.GaussianBlur。
import numpy as np
from scipy import misc
from scipy.ndimage import gaussian_filter
import PIL
from PIL import ImageFilter
import matplotlib.pyplot as plt
# Load test color image
img = misc.face()
# Scipy gaussian filter
sigma = 5
img_scipy = gaussian_filter(img, sigma=(sigma,sigma,0), mode='nearest')
# PIL gaussian filter
radius = 5
PIL_image = PIL.Image.fromarray(img)
img_PIL = PIL_image.filter(ImageFilter.GaussianBlur(radius=radius))
data = img_PIL.getdata()
img_PIL = np.array(data).reshape(data.size[::-1]+(-1,))
img_PIL = img_PIL.astype(np.uint8)
# Image difference
img_diff = np.abs(np.float_(img_scipy) - np.float_(img_PIL))
img_diff = np.uint8(img_diff)
# Stats
mean_diff = np.mean(img_diff)
median_diff = np.median(img_diff)
max_diff = np.max(img_diff)
# Plot results
plt.subplot(221)
plt.imshow(img_scipy)
plt.title('SciPy (sigma = {})'.format(sigma))
plt.axis('off')
plt.subplot(222)
plt.imshow(img_PIL)
plt.title('PIL (radius = {})'.format(radius))
plt.axis('off')
plt.subplot(223)
plt.imshow(img_diff)
plt.title('Image difference \n (Mean = {:.2f}, Median = {:.2f}, Max = {:.2f})'
.format(mean_diff, median_diff, max_diff))
plt.colorbar()
plt.axis('off')
# Plot histogram
d = img_diff.flatten()
bins = list(range(int(max_diff)))
plt.subplot(224)
plt.title('Histogram of Image difference')
h = plt.hist(d, bins=bins)
for i in range(len(h[0])):
plt.text(h[1][i], h[0][i], str(int(h[0][i])))
Run Code Online (Sandbox Code Playgroud)
的输出scipy.ndimage.gaussian_filter和PIL.ImageFilter.GaussianBlur非常相似,不同的是可以忽略不计。超过 95% 的差异值 <= 2。
PIL 版本:7.2.0,SciPy 版本:1.5.0
| 归档时间: |
|
| 查看次数: |
1287 次 |
| 最近记录: |