【问题标题】:image palette's dimension reduction using matplotlib and/or numpy to create blocky image图像调色板的降维使用 matplotlib 和/或 numpy 创建块状图像
【发布时间】:2015-09-11 10:15:31
【问题描述】:

我正在使用 iPython 笔记本,我有一个 512x512 图像,我想使用块中的“最近”插值将其“转换”为“块状”图像,类似于 Photoshop 中的“马赛克”过滤器,对于某些人来说进一步处理一批图片。

在 Photoshop 中,您加载图像,您可以将过滤器设置为“马赛克”,并设置“块大小”(以像素为单位)。

Here 有一个关于如何使用 numpy 的部分解释,但由于我不是 numpy 专家,我发现了一个使用 PIL 对我有用的“快捷方式”。我不知道如何正确调整它以避免一些不必要的步骤。

img = Image.open(filename) 
h = img.size[0]
v = img.size[1]

blocksize = 100

rsize = img.resize((h/blocksize,v/blocksize))  # resize the image
rsizeArr = np.asarray(rsize)
lum_img = rsizeArr[:,:,0]

#plt.axes.get_xaxis().set_visible(False)
#plt.axes.get_yaxis().set_visible(False)

imgplot = plt.imshow(rsizeArr)
#imgplot = plt.imsave('test.jpg', rsizeArr)
imgplot.set_interpolation('nearest')

imgplot.axes.get_xaxis().set_visible(False)
imgplot.axes.get_yaxis().set_visible(False)

plt.savefig('testplot1.png', bbox_inches = 'tight')

由于我使用的是 iPython 笔记本,因此一旦执行该行,就会在笔记本中生成内联输出。 (我不想显示此特定步骤的内联输出,因为我将在笔记本中处理几张图片)。

“tesplot1.png”文件大小为 1KB,但由于某种原因,其尺寸减小到 264x264 像素。由于我希望图像的原始尺寸为 512x512,因此我执行以下操作:

img2 = Image.open('testplot1.png')
rsize = img2.resize((512,512))  # resize the image
rsize.save('testplot2.jpg') 

这会生成 512x512 像素的右图。

我的问题是: 1) 有没有办法生成图像而无需通过 imgplot = plt.imshow(rsizeArr) 内联显示它?我的笔记本需要 pylab inline,所以我不知道它是否可以“暂时”禁用。 2)有没有办法通过以正确的大小保存'tesplot1.png'来省略调整大小的步骤(img2)? 3) 使用here 的解释来完成此操作所需的向量操作是什么?

【问题讨论】:

    标签: python numpy matplotlib python-imaging-library ipython-notebook


    【解决方案1】:
    1. 不要使用 pylab 内联。
    2. 如果您仍想使用 pylab 内联,请不要。它已被弃用。
    3. 使用 %matplotlib 内联
    4. 学习 matplotlib OO 方式,您不会在当前活动轴上隐式执行操作。

    你的绘图问题会消失。

    对于您想要将图像作为 numpy 数组逐块处理的块:例如How can I efficiently process a numpy array in blocks similar to Matlab's blkproc (blockproc) function

    【讨论】:

    • 谢谢马特。我找到了另一个解决方案。干杯
    猜你喜欢
    • 2018-08-19
    • 2018-02-07
    • 2011-05-23
    • 2020-03-18
    • 2020-09-10
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    相关资源
    最近更新 更多