用户登录
用户注册

分享至

PIL库使用实例:图片像素风处理

  • 作者: 晟钧32539545
  • 来源: 51数据库
  • 2021-11-22

图片像素风处理

待处理的图片如下

1.中心算法
将一个像素框中心位置的像素颜色复制给该块中其他每个像素

from PIL import Image

# 打开一个jpg图像文件
im = Image.open('test.jpg')
# 图片裁剪(left, upper, right, lower)
# im = im.crop((0, 1, 1080, 1081))
# 获得图像尺寸:
w, h = im.size
print("图片尺寸为%sx%s"%(w,h))
i = 2
print("推荐可用像素块大小有:")
while i < 20:  # 像素块大小上限20
    if w % i == 0 and h % i == 0:
        print(i,end=" ")
    i += 1
print()
# 像素框大小
box = int(input("输入像素框大小:"))
# a横坐标 b纵坐标
print("等待像素化处理 Loading...")
b = 0
while b < h:
    a = 0
    while a < w:
        # 获取某个像素位置的值
        rgb = im.getpixel((a+int(box/2),b+int(box/2)))
        # rgb = im.getpixel((a,b))  # 左上角算法
        # x横像素框 y纵像素框
        y = 0
        while y < box:
            x = 0
            while x < box:
                im.putpixel((a+x,b+y),rgb)
                x += 1
            y += 1
        a += box
    b += box
# 把缩放后的图像用jpeg格式保存:
print("处理完成,输出out中心.jpg")
im.save('out中心.jpg', 'jpeg')

中心位置像素比左上角的像素更具有代表性
处理结果(像素块大小为10)

2.平均算法
分别计算像素块平均RGB值并赋值给每个像素

from PIL import Image

# 打开一个jpg图像文件,注意路径要改成你自己的:
im = Image.open('test.jpg')
# 图片裁剪(left, upper, right, lower)
# im = im.crop((0, 1, 1080, 1081))
# 获得图像尺寸:
w, h = im.size
print("图片尺寸为%sx%s"%(w,h))
i = 2
print("推荐可用像素块大小有:")
while i < 20:  # 像素块大小上限20
    if w % i == 0 and h % i == 0:
        print(i,end=" ")
    i += 1
print()
# 像素框大小
box = int(input("输入像素框大小:"))
# a横坐标 b纵坐标
print("等待像素化处理 Loading...")
b = 0
while b < h:
    a = 0
    while a < w:   
        # x横像素框 y纵像素框
        # 计算像素框平均像素
        y = 0
        box_r = 0
        box_g = 0
        box_b = 0
        while y < box:
            x = 0
            while x < box:
                # 获取某个像素位置的值
                rgb = im.getpixel((a+x,b+y)) 
                box_r += rgb[0]
                box_g += rgb[1]
                box_b += rgb[2]
                x += 1
            y += 1
        # 写某个像素位置的值
        box_r = int(box_r/box/box)
        box_g = int(box_g/box/box)
        box_b = int(box_b/box/box)
        y = 0
        while y < box:
            x = 0
            while x < box:
                im.putpixel((a+x,b+y),(box_r,box_g,box_b))
                x += 1
            y += 1
        a += box
    b += box
# 把缩放后的图像用jpeg格式保存:
print("处理完成,输出out平均.jpg")
im.save('out平均.jpg', 'jpeg')

处理结果(像素块大小为10)

该方法显示的结果没有中心算法更加明显
可以理解为一种压缩算法(让画面变糊)
算法内容过于简略,仅供学习和娱乐

软件
前端设计
程序设计
Java相关