matplotlib 如何用python把一个正方形的图像像素化到256个大像素?

9lowa7mx  于 2022-12-27  发布在  Python
关注(0)|答案(4)|浏览(154)

我需要找到一种方法,用python将一个正方形图像缩小到256个大像素,最好是用matplotlib和pillow库。
有什么主意吗?

llmtgqce

llmtgqce1#

九个月过去了,我现在可以拼凑一些Python了--按照你最初的要求,如何用Python和PIL/Pillow对图像进行像素化。

#!/usr/local/bin/python3
from PIL import Image

# Open image
img = Image.open("artistic-swirl.jpg")

# Resize smoothly down to 16x16 pixels
imgSmall = img.resize((16,16), resample=Image.Resampling.BILINEAR)

# Scale back up using NEAREST to original size
result = imgSmall.resize(img.size, Image.Resampling.NEAREST)

# Save
result.save('result.png')

原始图像

结果

如果您将其降低到32 x32像素(而不是16 x16),然后再重新调整大小,您将得到:

bxgwgixi

bxgwgixi2#

另一个选项是使用PyPXL
这个Python脚本使用实验室颜色空间中的K均值聚类对图像和视频进行像素化。视频像素化支持多处理以实现更好的性能。
使用帕丁顿图像作为源,您可以运行:

python pypxl_image.py -s 16 16 paddington.png paddington_pixelated.png

得到了这个结果

当然,如果你想让它有256 x 256像素,而不仅仅是256个大像素,你可以运行

python pypxl_image.py -s 256 256 paddington.png paddington_pixelated.png

得到了这个结果

与其他解决方案相比,这两个结果都有一个更复古的8位外观,这可能适合您的需要。

0x6upsns

0x6upsns3#

对不起,我不能给你一个Python的解决方案,但是我可以向你展示技术和结果,只需要在命令行中使用ImageMagick
从这个开始:

首先,使用普通三次或双线性插值法将图像的大小缩小到16x16像素,然后使用 "最近邻" 插值法将图像缩放回原始大小:

magick artistic-swirl.jpg -resize 16x16 -scale 500x500 result.png

    • 关键字**:

像素化,像素化,像素化,ImageMagick,命令行,图像,图像处理,最近邻插值。

lvmkulzt

lvmkulzt4#

下面是我使用滑动窗口的解决方案

import numpy as np
import matplotlib.pyplot as plt

def pixelate_rgb(img, window):
    n, m, _ = img.shape
    n, m = n - n % window, m - m % window
    img1 = np.zeros((n, m, 3))
    for x in range(0, n, window):
        for y in range(0, m, window):
            img1[x:x+window,y:y+window] = img[x:x+window,y:y+window].mean(axis=(0,1))
    return img1

img = plt.imread('test.png')

fig, ax = plt.subplots(1, 4, figsize=(20,10))

ax[0].imshow(pixelate_rgb(img, 5))
ax[1].imshow(pixelate_rgb(img, 10))
ax[2].imshow(pixelate_rgb(img, 20))
ax[3].imshow(pixelate_rgb(img, 30))

# remove frames
[a.set_axis_off() for a in ax.flatten()]
plt.subplots_adjust(wspace=0.03, hspace=0)

其主要思想是在图像上滑动一个一定大小的窗口,计算该区域的平均颜色,然后用该颜色替换该区域的原始像素。
另一个想法是处理灰度图像,这里我们计算一个区域的灰度图像的平均颜色,但现在我们根据平均值是否超过阈值,用白色或黑色替换原始像素:

def pixelate_bin(img, window, threshold):
    n, m = img.shape
    n, m = n - n % window, m - m % window
    img1 = np.zeros((n,m))
    for x in range(0, n, window):
        for y in range(0, m, window):
            if img[x:x+window,y:y+window].mean() > threshold:
                img1[x:x+window,y:y+window] = 1
    return img1

# convert image to grayscale
img = np.dot(plt.imread('test.png'), [0.299 , 0.587, 0.114])

fig, ax = plt.subplots(1, 3, figsize=(15,10))

plt.tight_layout()
ax[0].imshow(pixelate_bin(img, 5, .2), cmap='gray')
ax[1].imshow(pixelate_bin(img, 5, .3), cmap='gray')
ax[2].imshow(pixelate_bin(img, 5, .45), cmap='gray')

# remove frames
[a.set_axis_off() for a in ax.flatten()]
plt.subplots_adjust(wspace=0.03, hspace=0)

Live demo

请记住:png的值介于0和1之间,而jpg的值介于0和255之间

相关问题