资讯专栏INFORMATION COLUMN

Python用61行代码实现图片像素化

Coly / 2686人阅读

摘要:实现思路把一张图片分成多个块,每个块的颜色都等于这个色块中颜色最多的颜色,如下图。这个图取的像素为块的大小,把快中颜色与每个颜色出现的数量存放到字典里,取最大的颜色,填充整个块。

起因

看到网上的像素图片,感觉蛮有趣的,就打算用python一些PIL类库写一个。

实现思路

把一张图片分成多个块,每个块的颜色都等于这个色块中颜色最多的颜色,如下图。

这个图取2×2的像素为块的大小,把快中颜色与每个颜色出现的数量存放到字典里,取最大的颜色,填充整个块。

具体实现
from PIL import Image

def init():
    # 设置每个像素区块的大小
    block_size = 75
    img = Image.open("a.jpg")
    # 获取图片的宽高
    width, height = img.size
    # 获取像素点对应RGB颜色值,可以改变img_array中的值来改变颜色值
    img_array = img.load()
    # 为了处理最后的区块,加了一次循环
    max_width = width + block_size
    max_height = height + block_size
    for x in range(block_size - 1, max_width, block_size):
        for y in range(block_size - 1, max_height, block_size):
            # 如果是最后一次循环,则x坐标等于width - 1
            if x == max_width - max_width % block_size - 1:
                x = width - 1
            # 如果是最后一次循环,则x坐标等于height - 1
            if y == max_height - max_height % block_size - 1:
                y = height - 1
            # 改变每个区块的颜色值
            change_block(x, y, block_size, img_array)
            y += block_size
        x += block_size
    img.save(r"D:pythonpixel_imageawesome_copy.png")
    img.show()

"""
:param x坐标 x: 
:param y坐标 y: 
:param 区块大小 black_size: 
:param 可操作图片数组 img_array: 
"""
def change_block(x, y, black_size, img_array):

    color_dist = {}
    block_pos_list = []
    for pos_x in range(-black_size + 1, 1):
        for pos_y in range(-black_size + 1, 1):
            # todo print(x + pos_x,y + pos_y)
            block_pos_list.append([x + pos_x, y + pos_y])
    for pixel in block_pos_list:
        if not str(img_array[pixel[0], pixel[1]]) in color_dist.keys():
            color_dist[str(img_array[pixel[0], pixel[1]])] = 1
        else:
            color_dist[str(img_array[pixel[0], pixel[1]])] += 1
    # key-->value => value-->key
    new_dict = {v: k for k, v in color_dist.items()}
    max_color = new_dict[max(color_dist.values())]
    # 将区块内所有的颜色值设置为颜色最多的颜色
    for a in block_pos_list:
        img_array[a[0], a[1]] = tuple(list(map(int, max_color[1:len(max_color) - 1].split(","))))


def get_key(dict, value):
    return [k for k, v in dict.items() if v == value]


if __name__ == "__main__":
    init()
效果对比


总结

开源地址https://github.com/MasakiOvO/...
还有很多改进的地方,比如取色值的算法上,应该有更好的解决方法,应该用多进程来实现,这样程序速度会快很多。OvO

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42766.html

相关文章

  • Python帮你上马,哪里无码打哪里

    摘要:不同尺寸的图像,要达到最佳的像素化的显示效果,所需要设置的单位像素块的大小也是不同的,实践出真知。我们需要图像的指定一个处理范围,并对该范围内的每一个坐标像素点进行像素化的处理。公众号专栏后台回复马赛克,获取本文所涉及的完整代码。 目录0 引言1 环境2 需求分析3 代码实现4 代码全景展示5 后记 0 引言 所谓的像素图,就是对图像做一个颗粒化的效果,使其产生一种妙不可言的朦胧感。费...

    waltr 评论0 收藏0
  • OpenCV进阶(9)基于OpenCV的图像着色

    摘要:让我们用表示这个重新缩放的灰度输入图像。我们的目标是为每个概率分布找到一对通道值。不幸的是这种分布不是高斯分布分布的均值仅对应于不自然的不饱和颜色。 有时技术会增...

    番茄西红柿 评论0 收藏2637
  • python:超简单的字符分割算法(车牌识别、仪表识别等)

    摘要:文章目录背景图像预处理确定字符区域分割单个字符完整源码结语背景在诸如车牌识别数字仪表识别等问题中最关键的就是将单个的字符分割开来再分别进行识别如下图。最近刚好用到就自己写了一个简单地算法进行字符分割来记录一下。 ...

    番茄西红柿 评论0 收藏2637
  • Programming Computer Vision with Python (学习笔记二)

    摘要:首先介绍跟图像处理显示有关两个库和,然后介绍增强图像对比度的实现原理。直方图均衡化就是为了达到这个目的,均衡化后的图像,像素落在每个灰度级上的个数是相等的。 首先介绍跟图像处理、显示有关两个库:NumPy和Matplotlib,然后介绍增强图像对比度的实现原理。 NumPy NumPy是Python用于科学计算的基础库,提供了一些很有用的概念,如:N维数组对象,可用于表示向量、矩阵、图...

    Berwin 评论0 收藏0
  • 五、自适应阈值与轮廓检测应实例——细胞计数统计

    摘要:在之前二值化处理代码基础上增加轮廓检测代码注意函数会原地修改输入的图像。我们主要用到第一个返回值该参数是一个中每个元素都是图像中的一个轮廓用中的表示。通过前面三图像的预处理二值化与自适应阈值的章节学习我们想到了采用自适应阈值来处理。 ...

    番茄西红柿 评论0 收藏2637

发表评论

0条评论

Coly

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<