利用python进行png图像的读写操作

最近遇到了对png灰度图像进行读取,并统计图像中众数的需求,现将代码记录如下。ps:适用于单波段图,形如(X,Y)。

1.导入需要的包

import matplotlib.pyplot as plt  # 绘图
import matplotlib.image as mpimg # 显示图像
import numpy as np  # 处理数据
from scipy.stats import mode    # 统计操作

2.架构框架

主要思路为,先利用matplotlib读取多张图像,并转换为多个2维数组,再通过拼接多个2维数组到3维,实现单波段到多波段图像的转变,最后利用mode函数挑出多波段图片中的众数,返回一个单波段png图片。

class png_mode:'''png_mode类 用于多张单波段png格式图片组合取众数,最后生成一张由多组众数生成的单波段png图片read_picture 可读取图片join_picture 可令单波段图片组合成多波段图片mode_picture 可取得多波段图片众数show_picture 可显示并保存众数结果'''def __init__(self,picture_path,picture_count):passdef read_picture(self):passdef join_picture(self):passdef mode_picture(self):passdef show_picture(self):pass

写了5个函数进行类的定义,通过上述框架进行需求实现。

3.__init__函数

__init__函数一般定义需要键入的常量,这里选择picture_path和picture_count传入,分别代表图片具体路径和图片张数。picture_path为多个图片路径字符串组成的列表(懒的用os和正则直接读png了),picture_count为整形。

    def __init__(self,picture_path,picture_count):self.picture_path = picture_pathself.picture_count = picture_count

4.read_picture函数

read_picture函数实现原始png图片的读取操作。pictures主要储存读取的图片结果,利用循环和mping.imread函数读取图片。

    def read_picture(self):pictures = []for i in range(0,self.picture_count):pictures.append(mpimg.imread(self.picture_path[i]))return pictures

5.join_picture函数

join_picture函数可以把pictures中的图片深度拼接在一起,也就是把单波段图拼接为多波段图,形如(X,Y,Z)其中Z为图片张数。本次实验所用单张图片规格为(1804,2181),这个函数可以通过dstack把多张(1804,2181)规格的图片转换为(1804,2181,n)的图片。

    def join_picture(self):new_picture = self.read_picture()[0]for j in range(0,self.picture_count-1):new_picture = np.dstack((new_picture,self.read_picture()[j+1]))self.new_picture = new_picturereturn new_picture

ps:利用dstack可以进行深度拼接。
例:

 a = np.array([[1],[2],[3]])b = np.array([[2],[3],[4]])np.dstack((a,b))
# 结果
array([[[1, 2]],[[2, 3]],[[3, 4]]])

6.mode_picture函数

利用mode_picture函数可以求得形如(1804,2181,n)图片的众数,也就是所有n个波段在每个点处的众数,最终会出一张(1804,2181,1)的图片。

    def mode_picture(self):new_picture1 = []for i in self.join_picture():new_picture1.append(mode(i, axis=1)[0])new_picture1 =np.array(new_picture1).reshape(np.array(new_picture1).shape[0],np.array(new_picture1).shape[1])return new_picture1

ps:关于mode函数

a = np.array([[6, 8, 3, 0],[3, 2, 1, 7],[8, 1, 8, 4],[5, 3, 0, 5],[4, 7, 5, 9]])print(mode(a))

返回值如下

ModeResult(mode=array([[3, 1, 0, 0]]), count=array([[1, 1, 1, 1]]))

前面数组mode=array([[3, 1, 0, 0]])表示每一列的众数,如果没有则返回最小值,后一列count=array([[1, 1, 1, 1]]表示出现的次数。通过axis可以变换求众数的方向,当axis为None时,可以求得整个数组的众数。

a = np.array([[6, 8, 3, 0],[3, 2, 1, 7],[8, 1, 8, 4],[5, 3, 0, 5],[4, 7, 5, 9]])print(mode(a,axis=1))

返回值如下

ModeResult(mode=array([[0],[1],[8],[5],[4]]), count=array([[1],[1],[2],[2],[1]]))

7.show_picture函数

show_picture函数可以打印并保存最后的结果。

    def show_picture(self):plt.subplot(221)plt.imshow(self.new_picture[:,:,0])plt.subplot(222)plt.imshow(self.new_picture[:,:,1])plt.subplot(223)plt.imshow(self.new_picture[:,:,2])plt.subplot(224)plt.imshow(self.mode_picture())plt.axis('off')plt.savefig(r'C:\Users\Administrator\Desktop\tiff\jpg\212.png',dpi=300)plt.show()

这里我用的是3张图做例,所以出了一张4子图的结果图,可根据要求随时修改。

8.完整代码及结果展示

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
from scipy.stats import modeclass png_mode:'''png_mode类 用于多张单波段png格式图片组合取众数,最后生成一张由多组众数生成的单波段png图片read_picture 可读取图片join_picture 可令单波段图片组合成多波段图片mode_picture 可取得多波段图片众数show_picture 可显示并保存众数结果picture_path 为字符串类型,图片路径picture_count 为整数类型,图片张数'''def __init__(self,picture_path,picture_count):self.picture_path = picture_pathself.picture_count = picture_countdef read_picture(self):pictures = []for i in range(0,self.picture_count):pictures.append(mpimg.imread(self.picture_path[i]))return picturesdef join_picture(self):new_picture = self.read_picture()[0]for j in range(0,self.picture_count-1):new_picture = np.dstack((new_picture,self.read_picture()[j+1]))self.new_picture = new_picturereturn new_picturedef mode_picture(self):new_picture1 = []for i in self.join_picture():new_picture1.append(mode(i, axis=1)[0])new_picture1 =np.array(new_picture1).reshape(np.array(new_picture1).shape[0],np.array(new_picture1).shape[1])return new_picture1def show_picture(self):plt.subplot(221)plt.imshow(self.new_picture[:,:,0])plt.subplot(222)plt.imshow(self.new_picture[:,:,1])plt.subplot(223)plt.imshow(self.new_picture[:,:,2])plt.subplot(224)plt.imshow(self.mode_picture())plt.axis('off')plt.savefig(r'C:\Users\Administrator\Desktop\tiff\jpg\212.png',dpi=300)plt.show()a = [r'C:\Users\Administrator\Desktop\tiff\jpg\tif1.png',r'C:\Users\Administrator\Desktop\tiff\jpg\11.png',r'C:\Users\Administrator\Desktop\tiff\png\sanyue2.png']
b = png_mode(a,3)
b.read_picture()
b.join_picture()
b.mode_picture()
b.show_picture()


最后再放张多图成果:

over

利用python进行png图像的读写操作相关推荐

  1. 利用python中的csv库读写csv文件

    利用python中的csv库读写csv文件 python读写csv文件就我知道的方法有:1)利用csv库,2)利用读写txt文件的方式处理,3)利用numpy或pandas库处理 在这篇博客中,博主就 ...

  2. 2、OpenCV图像的读写操作

    OpenCV图像的读写操作 概要 图像由像素组成. 像素可以被认为是非常小的正方形结构,当连接在一起时会生成图像. 它们是任何图像的最小组成部分. 如果您仔细查看前面的图像,您将能够在图像中看到一些正 ...

  3. matlab对nii文件处理,使用Nibabel库对nii格式图像的读写操作

    因为后期主要的研究方向是医学图像处理,而现有手头的大部分数据都是nii格式或者是hdr,img格式的数据,所以首先第一步我们需要解决图像的读写问题. 其实使用OpenCV也可以方便的进行图像读取,但是 ...

  4. python对Excel数据进行读写操作

    python对Excel数据进行读写操作 将学习到的基础操作记录在这里,便与复习查看 1.python读取Excel工作簿.工作表 import xlrd # 读取工作簿 wb=xlrd.open_w ...

  5. oracle读写文件--利用utl_file包对磁盘文件的读写操作

    oracle读写文件--利用utl_file包对磁盘文件的读写操作 摘要: 用户提出一个需求,即ORACLE中的一个表存储了照片信息,字段类型为BLOB,要求能导出成文件形式. 本想写个C#程序来做, ...

  6. python用户输入列表有缺陷_利用Python对Jira缺陷进行管理操作

    转自:51testing 1.1.概要 本文主要内容是教大家学习如何利用Python对Jira缺陷进行管理操作. 在平时的测试中,大家对于缺陷管理平台一定不陌生,平时的缺陷都要去平台进行操作.今天我们 ...

  7. 利用Python+OpenCV对图像加密/解密

    原文地址:利用Python.OpenCV对图像加密解密 | QuantumCloud蕴藏一个有趣.不难且实用的理论知识https://myblog.quantumcloud.top/2021/05/1 ...

  8. 利用python中的xlrd和xlwt操作excel

    微信公众号:数据运营人 本系列为博主的读书学习笔记,如需转载请注明出处. 当提起数据处理,一般情况下我们都可以用python中的pandas完成,但是当我们发现一些不规则的excel数据,所谓不规则如 ...

  9. python文件写入_python 文件读写操作

    读文件 打开一个文件用open()方法(open()返回一个文件对象,它是可迭代的): >>> f = open('test.txt', 'r') r表示是文本文件,rb是二进制文件 ...

最新文章

  1. Python中的元编程:一个关于修饰器和元类的简单教程
  2. Windows Server 2016-图形化备份域控制器
  3. CTFshow 命令执行 web34
  4. 如何让人工智能更加实际的辅助网络安全
  5. C# Winform中DataGridView的DataGridViewCheckBoxColumn CheckBox选中判断
  6. struts2 mysql 分页代码_Struts2 + MySQL 实现分页
  7. python 计算循环次数,05.Python循环
  8. 使用软件或Python编程时EIS拟合的底层逻辑(EIS拟合的原理/过程)
  9. MyBatis拦截器执行顺序
  10. PCB线宽过流能力估算
  11. 用四位16进制代码控制颜色
  12. HTML之meta属性大全
  13. 研发团队管理实践总结
  14. luoguP4188 [USACO18JAN]Lifeguards S
  15. 【网易笔试】小易最近在数学课上学习到了集合的概念
  16. JMeter直连数据库报错Uncaught Exception java.lang.AbstractMethodError: com.mysql.jdbc.Connection.isValid(I)Z
  17. nnUNet一个医学图像分割神仙算法
  18. 首席新媒体黎想教程:活动推广提升线下活动转化率?
  19. 实战 | 手把手教你用Python+OpenCV实现滑块验证码->自动拖动验证
  20. 新版FPC摄像头测评 OV7725 OV7670 OV9650 OV9655 OV5640 OV5642 OV2640 OV3640 MT9D112

热门文章

  1. 鸡兔同笼问题,假设鸡兔同笼,上有35个头,下有94只足,问鸡兔分别有几只?
  2. C#报错“OS加载程序锁内执行托管代码,不要尝试在DllMain或映像初始化函数内运行托管代码”的解决方法。
  3. 知乎上的一道问题:出家人怎么解决性欲?
  4. 服务器和应用服务器迁移方案,服务器和应用统迁移方案.doc
  5. hbuilderx 使用总结
  6. 统计工作随笔—同比与环比(同期为负值)、百分点
  7. Failed to load JVM DLL
  8. 无懈可击 css html5,无懈可击的Web设计(第3版) 带目录书签完整pdf[80MB]
  9. 不带符号的阵列乘法器_阵列乘法器.ppt
  10. P1554 梦中的统计