首页 » 网站建设 » php挪用python绘图技巧_运用python在excel中画图的实现方法

php挪用python绘图技巧_运用python在excel中画图的实现方法

duote123 2024-12-18 0

扫一扫用手机浏览

文章目录 [+]

以前大学时候,学EXCEL看到N多大神利用excel画图,以为很不可思议。
今儿个学了一个来月python,膨胀了就想用excel画图。
当然,其实用画图这个词不甚严谨,实际上是利用opencv遍历每一个像素的rgb值,再将其转化为16进制,末了调用openpyxl进行添补即可。

这是

1.1、实现效果

效果如下图

php挪用python绘图技巧_运用python在excel中画图的实现方法

1.2、须要用到的库的安装

须要用到库如下:

php挪用python绘图技巧_运用python在excel中画图的实现方法
(图片来自网络侵删)

import cv2 #导入OpenCV库import xlsxwriter #利用这个调度行高列宽import openpyxl #利用这个添补颜色import numpy as np #下面这两个是数据存储的两种办法,用此种办法处理数据,比列表高效,详细可自行查看文档import pandas as pd

除了第一个库其他的可以直接用pip在命令提示行进行安装,或者利用编辑器的一些自动安装功能也非常的方便,详细的请参看这篇文章 的第三节。

第一个库如果你直接用pip3 install opencv-python 进行安装的话,无论你网速多么快,都会非常慢几k/s,如下:

如果能安装好还行,关键有的可能等上几分钟也弗成,直接涌现几十行的赤色字看的头疼。
几经百度后才知道是安装源的问题,切换为海内的安装源即可,利用如下命令:

pip3 install -i https://pypi.tuna.tsinghua.ed... opencv-python

如下图,我准备截取安装速率和上面的为难刁难比的,结果直接安装好了

二、代码分开讲解

本文我们利用面相工具的编程思维进行。

2.1、工具的定义以及初始化

class ImageToExcel():def __init__(self,image_path,excel_path):self.imgviewx=cv2.imread(image_path,cv2.IMREAD_COLOR)self.excel_path=excel_path

前面两行很好理解便是定义工具的格式以及初始化工具。

个中image_path和excel_path这两个变量是你的图像储存路径和后续的excel文件保存位置。

第三行self.imgviewx=cv2.imread(image_path,cv2.IMREAD_COLOR)意思是调用opencv的imread读取图片。
个中第一个参数便是工具实例化时候通报进来的图像储存路径。
该函数返回的是一个三维数组,分别表示x,y,rgb 便是x,y坐标对应的rgb值,个中x,y单位为1像素。
末了将这个三维数组通报给工具的一个属性imgviewx,等待后续工具方法调用。
我们将之打印出来如下。

第四行<<self.excel_path=excel_path>>是将工具实例化时候通报进来的excel_path通报给工具的属性excel_path,同样等待后续工具的方法调用。

2.2、工具的方法

1:行高列宽调度,以防止图像变形

#excel行高列宽调度def excel_size(self):workbook = xlsxwriter.Workbook(self.excel_path)worksheet = workbook.add_worksheet('test')worksheet.set_column('A:CAA', 1)for x in range(2000):worksheet.set_row(x, 8.4)workbook.close()

这个实在你可往后续在excel中调度也可以。

第二行第三行基本一看就懂,便是在你刚开始工具实例化时候传入的一个路径中创建一个事情簿并添加一个名为test的事情表。

第三行意思是将A列到CAA列的列宽设置为1(把稳:这里面设置为1不知道为什么在事情表中便是0.94,列宽同样小点)

第四行意思同样,不过行高不能批量只能通过循环。

末了一样看着像关闭,实在最紧张功能是保存,没有这一行,前面的所有设置都不会被保存。

2.3、工具的方法2:10进制转化为16进制

#10进制转化为16进制def ten2_16(self,num):num1 = hex(num).replace('0x', '')return num1 if len(num1) > 1 else '0' + num1

这个方法不用细说,便是利用系统自带的函数hex将10进制转化为16进制。
我们都知道hex返回的16进制因此0x开头的,而16进制颜色码中明显没有,以是要用replace去掉。

如果rgb值是16以内的,以16进制显示的话会是1位数,而同样这个在16进制颜色码中也没有,以是末了一行的意思便是一位数的话在开头补0。

2.4、工具的方法3:获取r、g、b值并利用方法1转化为16进制颜色码

#获取像素数据并转化为16进制def get_rgb_data(self):self.excel_size()data_r=pd.DataFrame( np.array(self.imgviewx)[:,:,2] ).applymap(self.ten2_16)data_g=pd.DataFrame( np.array(self.imgviewx)[:,:,1] ).applymap(self.ten2_16)data_b=pd.DataFrame( np.array(self.imgviewx)[:,:,0] ).applymap(self.ten2_16)return (data_r+data_g+data_b).values

个中第二行self.excel_size() 是在本方法本调用时候先调用方法1调度行高列宽。
我们后面说,这关系到工具方法之间的参数通报,我们后续说。

三四五行的代码构造一样,我们挑一个说。
比如第三行data_r=pd.DataFrame( np.array(self.imgviewx)[:,:,2] ).applymap(self.ten2_16)这个代码我们可以拆开成下面的代码:

r=np.array(self.imgviewx)[:,:,2]tmp=pd.DataFrame( r )data_r=tmp.applymap(self.ten2_16)

这下就随意马虎懂了。

第一行意思是将刚开始工具初始化时候得到的包含目标图片的所有像素点的rgb值的三维列表转化为数组并提取个中的r。

第二行是将第一行得到的数组转化为DataFrame工具并存储在tmp变量中,以便第三行的处理。

第三行是利用DataFrame中的applymap将r值转化为16进制。

末了一行return (data_r+data_g+data_b).values意思是将转化为16进制的rgb值合并后就得到了16进制的颜色码并转化为数组。

2.5、工具的方法4:颜色添补

def color_fill(self):rgb_list=self.get_rgb_data()wb = openpyxl.load_workbook(self.excel_path)ws = wb['test']for x,tmp1 in list(enumerate(rgb_list)):print('统共有%s行,已添补%s行,还剩下%s行'%(len(rgb_list),x+1,len(rgb_list)-x-1))for y ,tmp2 in list(enumerate(tmp1)):ws.cell(x+1,y+1).fill = openpyxl.styles.fills.GradientFill(stop=[str(tmp2),str(tmp2)])wb.save(self.excel_path)

第二行rgb_list=self.get_rgb_data()是不是似曾相识,对,便是在方法2中调用方法1时候用的。

这里便是在本方法也便是方法3中调用方法2。
唯一的差异便是有没有返回值。

我们这样在方法3中调用方法2然后方法2中调用方法1。
这样在工具外的时候我们就只用工具实例化并调用方法3即可实现功能。

第三行、第四行便是调用openpyxl.load_workbook打开我们在方法1中新建的事情簿中的test事情表。

五到七行两个循环嵌套很随意马虎懂便是利用循环遍历每个事情表。

第八行的代码可能可以简化 ,这个是我修正网上的一个添补渐变色的代码。

末了一行便是事情表的保存,没什么可说的。

三、完全代码

import cv2 #导入OpenCV库import xlsxwriter #利用这个调度行高列宽import openpyxl #利用这个添补颜色import numpy as np #下面这两个是数据存储的两种办法,用此种办法处理数据,比列表高效import pandas as pd class ImageToExcel():#初始化def __init__(self,image_path,excel_path):self.imgviewx=cv2.imread(image_path,cv2.IMREAD_COLOR)self.excel_path=excel_path# excel行高列宽调度def excel_size(self):workbook = xlsxwriter.Workbook(self.excel_path)worksheet = workbook.add_worksheet('test')worksheet.set_column('A:CAA', 1)for x in range(2000): worksheet.set_row(x, 8.4)workbook.close()#rgb转16进制颜色码def ten2_16(self,num):tmp = hex(num).replace('0x', '')return tmp if len(tmp) > 1 else '0' + tmp#获取像素数据并转化为16进制def get_rgb_data(self):self.excel_size()data_r=pd.DataFrame( np.array(self.imgviewx)[:,:,2] ).applymap(self.ten2_16)data_g=pd.DataFrame( np.array(self.imgviewx)[:,:,1] ).applymap(self.ten2_16)data_b=pd.DataFrame( np.array(self.imgviewx)[:,:,0] ).applymap(self.ten2_16)return (data_r+data_g+data_b).values#颜色添补def color_fill(self):rgb_list=self.get_rgb_data()wb = openpyxl.load_workbook(self.excel_path)ws = wb['test']for x,tmp1 in list(enumerate(rgb_list)):print('统共有%s行,已添补%s行,还剩下%s行'%(len(rgb_list),x+1,len(rgb_list)-x-1))for y ,tmp2 in list(enumerate(tmp1)):ws.cell(x+1,y+1).fill = openpyxl.styles.fills.GradientFill(stop=[str(tmp2),str(tmp2)])wb.save(self.excel_path)excel_path='test23.xlsx'image_path='tttt.png'image=ImageToExcel(image_path,excel_path)image.color_fill()末了四行前两行可以直接写在第三行中,便是工具的实例化中其余还有一点,image_path中的 tttt.jpg是直接和我的py文件放在一起的,不然运行会报错。
四、结语

好啦,到此所有东西已全部搞定,当然还有很多要把稳的:

第一、方法3中红绿蓝的提取中这部分的编号是刚好相反的,提取时候须要把稳。

如下:

当然你也可以考试测验改变这个值看末了会得到什么结果。
蓝色的太阳、赤色的天空或者是绿色的帽子,这个就你们自己发挥了。

第二、除了以上一点须要把稳的,还有一个须要把稳,便是像素不能太高。
我测试了下342218的话我的i7-6700u打开excel就不是很流畅了。

你可以遍历的时候以2个像素点或者四个像素点为步长,不过这样我没试过,可能颗粒感比较明显吧(自己预测没试过),或者把原始图片修正下。

标签:

相关文章

php为无色透明技巧_水货钻石其实也还行

从各种钻石中,可以看到大大小小的“包裹体” 图片来源:参考文献包裹体的种类多样。比钻石形成更早的包裹体,叫“原生包裹体”;与钻石同...

网站建设 2024-12-19 阅读0 评论0

phpstudy发送gbk技巧_php的文件上传

这里首先声明一下这一章的内容比较多,比较难,你要抱着和自己去世磕的态度。细微之处不放过,多敲多练是王道。 学习就像爬山,得一步一步...

网站建设 2024-12-19 阅读0 评论0