图片像素化,算法不理解from PIL import Image # 导入图像处理库
# 打开头像图片文件
pic = Image.open("images\image1.jpg")
w_pic, h_pic = pic.size # 获得图像文件尺寸
px = pic.load() # 导入图片像素
num = 10 # 小方格的长宽
for i in range(w_pic):
for j in range(h_pic):
# 每个格子内取一个代表像素
I = i - (i%num)/2
J = j - (j%num)/2
# 格子内所有像素的颜色都设为代表像素的颜色
px[i, j] = px[I, J]
for i in range(w_pic):
for j in range(h_pic):
# 每个小格子间加一条白色线
if i % num == 0 or j % num == 0:
px[i, j] = 255, 255, 255
pic.save('images\\image1_像素化.jpg')
首先,这段代码的作用是模糊图片,实现方法是将(i,j)位置的像素,修改成(I,J)的像素值。那么先分析一下I,J的计算原理。I = i - (i%num)/2 后一项由于i%num 的取值可以是(0-9) 因此 后一项的取值范围是(0,4.5)。也就是说,I就是i减去一个0-4.5的数字。J同理。这里有一个代码bug,I,J用于索引,因此不可以是小数。建议对I,J进行floor操作向下取整,代码没报错的原因可能是内部做了这个事情,但是还是不要这样写。
接下来简单说一下我对为什么这个可以产生模糊效果的理解。所谓的模糊,在题主的算法里可以大致看出来,是用附近的像素来替换当前像素。我们平常用的高斯模糊也就是对邻域像素取平均值。这两者其实是想通的。高斯模糊是取平均,而你这个算法更直接一些,属于选取单个像素值。他等价于邻域内的像素值有比较极端的权重,被选取的权重为1,其他的为0。至于如何选取,我觉得这里可以近似看成是随机选取。因为不同i.j计算出来的偏移项不同((i%num)/2)。
如果你仔细思考一下,会发现i,j一直是做减法。因此他其实模糊后的图片有会图像上的偏移。整体偏移几个像素。做个实验,如果将num设的更大,模糊效果就会更强,并且偏移效果更明显。
|