Python 为什么ImageFilter.BoxBlur会给出错误的结果?
我试着用枕头来做一些测试数据,这些数据是黑白的,逐像素生成的。我想用这些数据来测试我的电脑。我将灰度像素存储在按行3x3矩阵中,如下所示:Python 为什么ImageFilter.BoxBlur会给出错误的结果?,python,python-imaging-library,Python,Python Imaging Library,我试着用枕头来做一些测试数据,这些数据是黑白的,逐像素生成的。我想用这些数据来测试我的电脑。我将灰度像素存储在按行3x3矩阵中,如下所示: 5 10 5 10 15 10 5 10 5 使用单像素框模糊,我希望结果如下所示: 10 9 10 9 8 9 10 9 10 但是,调用image.tobytes()后的结果是一个包含九行新行的数组(\n)。有人能指出我做错了什么吗?我理解您的预期结果,但让我们先看看现实情况: 将numpy导入为np 从PI
5 10 5
10 15 10
5 10 5
使用单像素框模糊,我希望结果如下所示:
10 9 10
9 8 9
10 9 10
但是,调用
image.tobytes()
后的结果是一个包含九行新行的数组(\n
)。有人能指出我做错了什么吗?我理解您的预期结果,但让我们先看看现实情况:
将numpy导入为np
从PIL导入图像,图像过滤器
array=np.array([[5,10,5],[10,15,10],[5,10,5]]).astype(np.uint8)
img=Image.fromarray(数组).filter(ImageFilter.BoxBlur(1))
打印(np.array(img),'\n\n',img.tobytes())
# [[9 9 9]
# [9 9 9]
# [9 9 9]]
#
#b'\t\t\t\t\t\t\t\t\t\t'
结果是一个包含所有9
的数组–当将9
转换为字节时,您会得到水平选项卡或\t
的值。老实说,我不明白,为什么你会得到\n
或换行符,这将10
转换成字节,在这里
但是,为什么会有这样的结果呢?从文件中(我强调):
通过将每个像素设置为在每个方向上延伸半径像素的方形框中像素的平均值来模糊图像
因此,在计算九个(内部)像素时,您的矩阵实际上如下所示:
55105
5 5 10 5 5
10 10 15 10 10
5 5 10 5 5
5 5 10 5 5
对于九个内部像素中的每一个,我们得到:
(4*5+4*10+15)/9=75/9=8.333
看起来,我们这里也有上限,而不是普通的四舍五入
这可能是由于:
使用优化的实现,该实现相对于任何半径值的图像大小以线性时间运行
所以,可能是一些变位魔法,而不是实际的除法或类似的东西
您还可以检查边界像素是否被复制,而不是镜像:
将numpy导入为np
从PIL导入图像,图像过滤器
array=np.array([[5,10,5],[10,15,10],[5,10,5]]).astype(np.uint8)
img=Image.fromarray(数组).filter(ImageFilter.BoxBlur(2))
打印(np.array(img),'\n\n',img.tobytes())
# [[7 7 7]
# [7 7 7]
# [7 7 7]]
为5x5矩阵设置两个可能的7x7矩阵,如上所述,并比较结果
一句话:BoxBlur
没有按您预期的方式工作。而且,它仍然令人困惑,为什么您得到\n
,而不是\t
----------------------------------------
系统信息
----------------------------------------
平台:Windows-10-10.0.16299-SP0
Python:3.9.1
PyCharm:2021.1.1
NumPy:1.20.2
枕头:8.2.0
----------------------------------------
如果需要帮助,请出示您的代码。非常感谢。