首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么‘`imshow`’以颜色显示2D (非RGB)数组,以及如何将这样的彩色图像导出到.png文件中?

为什么‘`imshow`’以颜色显示2D (非RGB)数组,以及如何将这样的彩色图像导出到.png文件中?
EN

Stack Overflow用户
提问于 2015-11-11 18:39:08
回答 2查看 2.4K关注 0票数 1

我生成了一个Mandelbrot图形,作为10000x10000像素的numpy数组:

代码语言:javascript
复制
[[ 100.  100.  100. ...,   12.   12.   13.]
 [ 100.  100.  100. ...,   12.   13.   14.]
 [ 100.  100.  100. ...,   12.   12.   14.]
 ..., 
 [   3.    3.    3. ...,    3.    3.    3.]
 [   3.    3.    3. ...,    3.    3.    3.]
 [   3.    3.    3. ...,    3.    3.    3.]]

如果我使用matplotlib显示数组:

代码语言:javascript
复制
arr = np.zeros((10000, 10000)) # my array
import matplotlib.pyplot at plt
plt.imshow(arr)
plt.show()

我得到了一个非常漂亮的彩色图像。

但是为什么

此外,如果我试图将其导出到.png,则会得到一个黑白图像:

代码语言:javascript
复制
import PIL.Image as im
iimg = im.fromarray(arr)
iimg = iimg.convert("RGB") # std was "F", but it didn't work
iimg.save("img_mandelbrot.png")

有没有办法向巴布亚新几内亚输出这样的彩色图像?matplotlib似乎不是一个可行的选择,因为决议太糟糕了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-11 20:44:50

正如我在上面的评论中提到的,savefig有一个dpi选项

例如:

代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plt

plt.figure(figsize=(10,10)) #
arr = np.random.random((10000,10000)) # my array
plt.imshow(arr)

plt.savefig('fig.png', dpi=1000)

我不能张贴原来的PNG (它大约是200兆字节),但这给你更多的细节,你想要。一些放大了上面脚本输出的屏幕截图:

请注意,这样的数字(包括。边框、轴线标签等)是10000x10000像素,所以您仍然不能单独看到来自arr的实际10000x10000像素。ali_m和imsave的解决方案确实解决了这个问题,如果您不介意没有轴标签、titels等等的话。

票数 1
EN

Stack Overflow用户

发布于 2015-11-11 20:07:28

将2D数组传递给plt.imshow时,强度值将映射到RGBA值。这是根据一个称为颜色映射的查找表完成的,该表可以通过cmap=关键字参数指定。例如,要用灰度绘制Mandelbrot数组,可以选择'gray'颜色图:

代码语言:javascript
复制
plt.imshow(arr, cmap='gray')

如果您不传递cmap=参数,matplotlib将使用任何默认值,您也可以在matplotlibrc文件中修改它。为了干净地安装当前版本的matplotlib,默认的是一个名为'jet'的彩色映射,如下所示:

是一个非常糟糕的彩色地图,有很多用途不久将被替换为matplotlib v2.0中的默认颜色映射。您可以阅读更多关于在正式文件中选择共轨文件的信息。

您还可以向imshow传递一个3D数组,其中最终维度的大小为3或4。在这种情况下,最终维度被解释为每个像素的RGB(A)值。由于颜色信息已经包含在数组中,因此不需要查找表,因此cmap=参数将被忽略。

为了解决您问题的第二部分,将数组保存为共现的全分辨率.png图像的一种简单方法是使用plt.imsave,这也采用了cmap=参数:

代码语言:javascript
复制
plt.imsave('mandelbrot.png', arr, cmap='jet')

plt.imsave只是导出数组中的原始像素,所以一个10000x10000输入数组将生成一个正好为10000x10000像素的.png图像。

相反,plt.savefig呈现整个图形画布(包括边距、轴、其他绘图元素等),并根据(1)图形的大小(以英寸为单位)和(2) dpi=关键字参数进行缩放。尽管通过将DPI设置为比您需要的要大得多,可以获得足够高的分辨率,但是使用这种方法呈现实际大小的数组要困难得多,因为您需要摆弄图形大小和/或DPI,以及轴的位置和大小等。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33657547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档