使用Python的PIL如何将数组输出图像

 更新时间:2024年02月27日 10:25:33   作者:Vic·Tory  
这篇文章主要介绍了使用Python的PIL如何将数组输出图像问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

PIL将数组输出图像

最近拿到一幅txt格式的城市地图,其格式为2400×2400的二维数组,每个数组的值为一个整数,从1到800,将城市划分为800个不同的区,一个区的整数值相同,直接查看txt文档不太容易,因此考虑将该txt利用python转化为图像。

通常的彩色图像可以看作是三维数组,长×宽×通道,其中通道为每个像素点上用于表示颜色的数据,例如RGB三通道就是利用三个0~255的值来描述红、绿、蓝三个颜色。

PIL.Image打开PNG、BMP和JPG彩色图像格式会将其保存为RGB模式的三维数组。

但是现在的txt文件是二维数组,只有长×宽,需要填充RGB颜色通道的值。

由于有800个不同的数字,因此我们将区域数值对255取模作为B通道的值,取整作为G通道的值,这样已经足以区别800个区域的值了,但是相邻区域颜色太接近,因此将取模的值先乘以50再对255取模,这样可以将相邻区域的颜色值在R通道上拉开,便于观察。

import numpy as np
from PIL import Image
 
map_data = np.loadtxt("./city_map.txt")
map_data = map_data.tolist()
 
# 填充地图数组的颜色通道
for i in range(2400):
    for j in range(2400):
        value = int(map_data[i][j])
        if value == 0:  # 如果地图值为0,显示黑色
            map_data[i][j] = [0, 0, 0]
        else:           # 将流量低的区域根据区域号码来填充RGB三通道
            r = (value % 255) * 50 % 255        # 取模乘以50再取模作为R通道
            g = (value // 255) * 50 + 100       # 取整加100作为G通道的值
            b = value % 255                     # 取模作为B通道的值
            map_data[i][j] = [r, g, b]
 
# 输出png图像
map_data = np.array(map_data)
map_data = np.asarray(map_data, np.uint8)
pic = Image.fromarray(map_data)
pic.save('city.png')

生成图像如下:

如果需要根据每个地区的不同指标数值来生成由浅至深的图像,首先根据区域的索引从指标数组flow_data[]读出该地区的指标flow_value,然后将flow_value与指标最大值max_flow相除,再乘以255,这样就将指标的值映射到了R通道的0~255的值上,然后用255减去该值,将G、B通道都染为255,这样是为了指标数值小的地方显示为白色。

    map_data = np.loadtxt("./city.txt")
    map_data = map_data.tolist()
    max_flow = flow_data.max()
    for i in range(2400):
        for j in range(2400):
            area = int(map_data[i][j])
            flow_value = flow_data[area - 1]   # 根据地图区域索引读取值
            if area == 0:  # 如果地图值为0,显示黑色
                map_data[i][j] = [0, 0, 0]
            else:  # 根据区域流量值来填充RGB三通道
                r = 255 - flow_value / max_flow * 255
                g = 255
                b = 255
                map_data[i][j] = [r, g, b]
    # 输出png图像
    map_data = np.array(map_data)
    map_data = np.asarray(map_data, np.uint8)
    pic = Image.fromarray(map_data)
    pic.save('./output/' + flow_type + '_flow_map.png')

使用PIL的Image对象生成图像的模式有九种

除了RGB之外还有如下:

模式“1”为二值图像,非黑即白。但是它每个像素用8个bit表示,0表示黑,255表示白。

模式“L”为灰色图像,它的每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度

模式“I”为32位整型灰色图像,它的每个像素用32个bit表示,0表示黑,255表示白,(0,255)之间的数字表示不同的灰度。

模式“F”为32位浮点灰色图像,它的每个像素用32个bit表示,0表示黑,255表示白,(0,255)之间的数字表示不同的灰度。

模式“P”为8位彩色图像,它的每个像素用8个bit表示,其对应的彩色值是按照调色板查询出来的。

模式“RGBA”为32位彩色图像,它的每个像素用32个bit表示,其中24bit表示红色、绿色和蓝色三个通道,另外8bit表示alpha通道,即透明通道。

模式“CMYK”为32位彩色图像,它的每个像素用32个bit表示。模式“CMYK”就是印刷四分色模式,它是彩色印刷时采用的一种套色模式,利用色料的三原色混色原理,加上黑色油墨,共计四种颜色混合叠加,形成所谓“全彩印刷”。四种标准颜色是:C:Cyan = 青色,又称为‘天蓝色’或是‘湛蓝’M:Magenta = 品红色,又称为‘洋红色’;Y:Yellow = 黄色;K:Key Plate(blacK) = 定位套版色(黑色)。

模式“YCbCr”为24位彩色图像,它的每个像素用24个bit表示。YCbCr其中Y是指亮度分量,Cb指蓝色色度分量,而Cr指红色色度分量。人的肉眼对视频的Y分量更敏感,因此在通过对色度分量进行子采样来减少色度分量后,肉眼将察觉不到的图像质量的变化。

例如通过image.convert("F")可以将图片转换为F模式

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Django中的文件的上传的几种方式

    Django中的文件的上传的几种方式

    这篇文章主要介绍了Django中的文件的上传的几种方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • pandas全表查询定位某个值所在行列的方法

    pandas全表查询定位某个值所在行列的方法

    下面小编就为大家分享一篇pandas全表查询定位某个值所在行列的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • Python自动化办公之创建PPT文件

    Python自动化办公之创建PPT文件

    python-pptx模块是Python中用于PPT操作的模块。本文将利用这一模块实现创建PPT文件。文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-05-05
  • pytorch中的weight-initilzation用法

    pytorch中的weight-initilzation用法

    这篇文章主要介绍了pytorch中的weight-initilzation用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • Python3 venv搭建轻量级虚拟环境的步骤(图文)

    Python3 venv搭建轻量级虚拟环境的步骤(图文)

    这篇文章主要介绍了Python3 venv搭建轻量级虚拟环境的步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • 对Python的交互模式和直接运行.py文件的区别详解

    对Python的交互模式和直接运行.py文件的区别详解

    今天小编就为大家分享一篇对Python的交互模式和直接运行.py文件的区别详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • Python 3.8 新功能大揭秘【新手必学】

    Python 3.8 新功能大揭秘【新手必学】

    Python 3.8 是 Python 编程语言的最新主要版本, 它包含许多新功能和优化。这篇文章主要介绍了Python 3.8 新功能【新手必学】,需要的朋友可以参考下
    2020-02-02
  • 关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的问题

    关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribu

    这篇文章主要介绍了pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 解决,需要的朋友可以参考下
    2020-11-11
  • 如何利用Python拟合函数曲线详解

    如何利用Python拟合函数曲线详解

    在实际项目中,往往有这样的需求:对采集到的数据进行数据处理(曲线拟合),再计算出一些想要的参数,比如峰值/dip值/周期等等,下面这篇文章主要给大家介绍了关于如何利用Python拟合函数曲线的相关资料,需要的朋友可以参考下
    2022-04-04
  • python pandas数据处理之删除特定行与列

    python pandas数据处理之删除特定行与列

    Pandas是数据科学中的利器,你可能想到的数据处理骚操作,貌似用Pandas都能够实现,下面这篇文章主要给大家介绍了关于python pandas数据处理之删除特定行与列的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08

最新评论