我试图使用枕头与一些测试数据,我正在生成的黑白,像素一个像素。我想使用这些数据来测试我的一个像素框模糊。我将灰度像素存储在3x3矩阵中,如下所示:
5 10 5
10 15 10
5 10 5在一个像素框模糊的情况下,我希望得到的结果如下:
10 9 10
9 8 9
10 9 10但是,在调用image.tobytes()之后,我的结果是一个包含9个新行(\n)的数组。有人能指指我做错了什么吗?
发布于 2021-05-18 11:34:08
我理解您的预期输出,但让我们先来看看现实:
import numpy as np
from PIL import Image, ImageFilter
array = np.array([[5, 10, 5], [10, 15, 10], [5, 10, 5]]).astype(np.uint8)
img = Image.fromarray(array).filter(ImageFilter.BoxBlur(1))
print(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'结果是一个包含所有9的数组--当将9转换为字节时,您将获得水平选项卡或\t的ASCII字符。老实说,我不明白,为什么您会得到\n或行提要,这将10转换成字节,这里!?
但是,为什么结果呢?从文件中(我强调):
通过将每个像素设置为方框中像素的平均值来模糊图像,在每个方向上扩展半径像素。
因此,您的矩阵实际上类似于计算九个(内部)像素的情况:
5 5 10 5 5
5 5 10 5 5
10 10 15 10 10
5 5 10 5 5
5 5 10 5 5对于9个内部像素中的每个像素,我们得到:
(4 * 5 + 4 * 10 + 15) / 9 = 75 / 9 = 8.333 看来,我们这里也有上限,而不是普通的四舍五入。
这可能是由于:
使用优化的实现,该实现相对于任意半径值的图像大小以线性时间运行。
所以,很可能是一些变化的魔法,而不是真正的分裂或类似的东西。
您还可以检查边框像素是否被复制,而不是镜像:
import numpy as np
from PIL import Image, ImageFilter
array = np.array([[5, 10, 5], [10, 15, 10], [5, 10, 5]]).astype(np.uint8)
img = Image.fromarray(array).filter(ImageFilter.BoxBlur(2))
print(np.array(img), '\n\n', img.tobytes())
# [[7 7 7]
# [7 7 7]
# [7 7 7]] 设置两个可能的7x7矩阵,如上面为5x5矩阵所做的,并对结果进行比较。
一句话:BoxBlur的工作方式与你所期望的不一样。而且,为什么得到\n,而不是\t,这仍然是令人困惑的。
----------------------------------------
System information
----------------------------------------
Platform: Windows-10-10.0.16299-SP0
Python: 3.9.1
PyCharm: 2021.1.1
NumPy: 1.20.2
Pillow: 8.2.0
----------------------------------------https://stackoverflow.com/questions/67561241
复制相似问题