最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用python在excel中畫(huà)圖的實(shí)現(xiàn)方法

 更新時(shí)間:2020年03月17日 11:51:52   作者:P&p  
這篇文章主要介紹了利用python在excel中畫(huà)圖的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

一、前言

以前大學(xué)時(shí)候,學(xué)EXCEL看到N多大神利用excel畫(huà)圖,覺(jué)得很不可思議。今個(gè)學(xué)了一個(gè)來(lái)月python,膨脹了就想用excel畫(huà)圖。當(dāng)然,其實(shí)用畫(huà)圖這個(gè)詞不甚嚴(yán)謹(jǐn),實(shí)際上是利用opencv遍歷每一個(gè)像素的rgb值,再將其轉(zhuǎn)化為16進(jìn)制,最后調(diào)用openpyxl進(jìn)行填充即可。

1.1、實(shí)現(xiàn)效果

效果如下圖

1.2、需要用到的庫(kù)的安裝

需要用到庫(kù)如下:

import cv2   #導(dǎo)入OpenCV庫(kù)
import xlsxwriter #利用這個(gè)調(diào)整行高列寬
import openpyxl  #利用這個(gè)填充顏色
import numpy as np #下面這兩個(gè)是數(shù)據(jù)存儲(chǔ)的兩種方式,用此種方式處理數(shù)據(jù),比列表高效,具體可自行查看文檔
import pandas as pd

除了第一個(gè)庫(kù)其他的可以直接用pip在命令提示行進(jìn)行安裝,或者利用編輯器的一些自動(dòng)安裝功能也非常的方便,具體的請(qǐng)參看這篇文章 的第三節(jié): 三、開(kāi)始安裝

第一個(gè)庫(kù)如果你直接用pip3 install opencv-python 進(jìn)行安裝的話,無(wú)論你網(wǎng)速多么快,都會(huì)非常慢幾k/s,如下:


如果能安裝好還行,關(guān)鍵有的可能等上幾分鐘也不行,直接出現(xiàn)幾十行的紅色字看的頭疼。幾經(jīng)百度后才知道是安裝源的問(wèn)題,切換為國(guó)內(nèi)的安裝源即可,利用如下命令,

pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python

如下圖,我準(zhǔn)備截取安裝速度和上面的作對(duì)比的,結(jié)果直接安裝好了

二、代碼分開(kāi)講解

本文我們利用面相對(duì)象的編程思維進(jìn)行。

2.1、對(duì)象的定義以及初始化

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

前面兩行很好理解就是定義對(duì)象的格式以及初始化對(duì)象

其中image_path和excel_path這兩個(gè)變量是你的圖像儲(chǔ)存路徑和后續(xù)的excel文件保存位置。

第三行self.imgviewx=cv2.imread(image_path,cv2.IMREAD_COLOR)意思是調(diào)用opencv的imread讀取圖片。其中第一個(gè)參數(shù)就是對(duì)象實(shí)例化時(shí)候傳遞進(jìn)來(lái)的圖像儲(chǔ)存路徑。該函數(shù)返回的是一個(gè)三維數(shù)組,分別表示x,y,rgb 就是x,y坐標(biāo)對(duì)應(yīng)的rgb值,其中x,y單位為1像素。最后將這個(gè)三維數(shù)組傳遞給對(duì)象的一個(gè)屬性imgviewx,等待后續(xù)對(duì)象方法調(diào)用。我們將之打印出來(lái)如下。


第四行<<self.excel_path=excel_path>>是將對(duì)象實(shí)例化時(shí)候傳遞進(jìn)來(lái)的excel_path傳遞給對(duì)象的屬性excel_path,同樣等待后續(xù)對(duì)象的方法調(diào)用。

2.2、對(duì)象的方法

1:行高列寬調(diào)整,以防止圖像變形

#excel行高列寬調(diào)整
 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()

這個(gè)其實(shí)你可以后續(xù)在excel中調(diào)整也可以。
第二行第三行基本一看就懂,就是在你剛開(kāi)始對(duì)象實(shí)例化時(shí)候傳入的一個(gè)路徑中創(chuàng)建一個(gè)工作簿并添加一個(gè)名為test的工作表。
第三行意思是將A列到CAA列的列寬設(shè)置為1(注意:這里面設(shè)置為1不知道為什么在工作表中就是0.94,列寬同樣小點(diǎn)
第四行意思同樣,不過(guò)行高不能批量只能通過(guò)循環(huán)。
最后一樣看著像關(guān)閉,其實(shí)最主要功能是保存,沒(méi)有這一行,前面的所有設(shè)置都不會(huì)被保存。

2.3、對(duì)象的方法2:10進(jìn)制轉(zhuǎn)化為16進(jìn)制

 #10進(jìn)制轉(zhuǎn)化為16進(jìn)制
 def ten2_16(self,num):
  num1 = hex(num).replace('0x', '')
  return num1 if len(num1) > 1 else '0' + num1

這個(gè)方法不用細(xì)說(shuō),就是利用系統(tǒng)自帶的函數(shù)hex將10進(jìn)制轉(zhuǎn)化為16進(jìn)制。我們都知道hex返回的16進(jìn)制是以0x開(kāi)頭的,而16進(jìn)制顏色碼中明顯沒(méi)有,所以要用replace去掉。
如果rgb值是16以內(nèi)的,以16進(jìn)制顯示的話會(huì)是1位數(shù),而同樣這個(gè)在16進(jìn)制顏色碼中也沒(méi)有,所以最后一行的意思就是一位數(shù)的話在開(kāi)頭補(bǔ)0。

2.4、對(duì)象的方法3:獲取r、g、b值并運(yùn)用方法1轉(zhuǎn)化為16進(jìn)制顏色碼

#獲取像素?cái)?shù)據(jù)并轉(zhuǎn)化為16進(jìn)制
 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() >>是在本方法本調(diào)用時(shí)候先調(diào)用方法1調(diào)整行高列寬。我們后面說(shuō),這關(guān)系到對(duì)象方法之間的參數(shù)傳遞,我們后續(xù)說(shuō)。
三四五行的代碼結(jié)構(gòu)一樣,我們挑一個(gè)說(shuō)。比如第三行data_r=pd.DataFrame( np.array(self.imgviewx)[:,:,2] ).applymap(self.ten2_16)這個(gè)代碼我們可以拆開(kāi)成下面的代碼

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

這下就容易懂了
第一行意思是將剛開(kāi)始對(duì)象初始化時(shí)候得到的包含目標(biāo)圖片的所有像素點(diǎn)的rgb值的三維列表轉(zhuǎn)化為數(shù)組并提取其中的r。
第二行是將第一行得到的數(shù)組轉(zhuǎn)化為DataFrame對(duì)象并存儲(chǔ)在tmp變量中,以便第三行的處理。
第三行是利用DataFrame中的applymap將r值轉(zhuǎn)化為16進(jìn)制。

最后一行<<return (data_r+data_g+data_b).values>>意思是將轉(zhuǎn)化為16進(jìn)制的rgb值合并后就得到了16進(jìn)制的顏色碼并轉(zhuǎn)化為數(shù)組。

2.5、對(duì)象的方法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()>>是不是似曾相識(shí),對(duì),就是在方法2中調(diào)用方法1時(shí)候用的。
這里就是在本方法也就是方法3中調(diào)用方法2。唯一的區(qū)別就是有沒(méi)有返回值。
我們這樣在方法3中調(diào)用方法2然后方法2中調(diào)用方法1。這樣在對(duì)象外的時(shí)候我們就只用對(duì)象實(shí)例化并調(diào)用方法3即可實(shí)現(xiàn)功能。
第三行、第四行就是調(diào)用openpyxl.load_workbook打開(kāi)我們?cè)诜椒?中新建的工作簿中的test工作表
五到七行兩個(gè)循環(huán)嵌套很容易懂就是利用循環(huán)遍歷每個(gè)工作表
第八行的代碼可能可以簡(jiǎn)化 ,這個(gè)是我修改網(wǎng)上的一個(gè)填充漸變色的代碼。
最后一行就是工作表的保存,沒(méi)什么可說(shuō)的。

三、完整代碼

import cv2   #導(dǎo)入OpenCV庫(kù)
import xlsxwriter #利用這個(gè)調(diào)整行高列寬
import openpyxl  #利用這個(gè)填充顏色
import numpy as np #下面這兩個(gè)是數(shù)據(jù)存儲(chǔ)的兩種方式,用此種方式處理數(shù)據(jù),比列表高效
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行高列寬調(diào)整
 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轉(zhuǎn)16進(jìn)制顏色碼
 def ten2_16(self,num):
  tmp = hex(num).replace('0x', '')
  return tmp if len(tmp) > 1 else '0' + tmp
 #獲取像素?cái)?shù)據(jù)并轉(zhuǎn)化為16進(jìn)制
 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()

最后四行前兩行可以直接寫(xiě)在第三行中,就是對(duì)象的實(shí)例化中
另外還有一點(diǎn),image_path中的 tttt.jpg是直接和我的py文件放在一起的,不然運(yùn)行會(huì)報(bào)錯(cuò)。

四、結(jié)語(yǔ)

好啦,到此所有東西已全部搞定,當(dāng)然還有很多要注意的,
第一、方法3中紅綠藍(lán)的提取中這部分的編號(hào)是剛好相反的,提取時(shí)候需要注意
如下


當(dāng)然你也可以嘗試改變這個(gè)值看最后會(huì)得到什么結(jié)果。藍(lán)色的太陽(yáng) 紅色的天空 或者是綠色的帽子,哈哈 好吧這個(gè)就你們自己發(fā)揮了。
第二、除了以上一點(diǎn)需要注意的,還有一個(gè)需要注意,就是像素不能太高。我測(cè)試了下342*218的話我的i7-6700u打開(kāi)excel就不是很流暢了。
你可以遍歷的時(shí)候以2個(gè)像素點(diǎn)或者四個(gè)像素點(diǎn)為步長(zhǎng),不過(guò)這樣我沒(méi)試過(guò),可能顆粒感比較明顯吧(自己猜測(cè)沒(méi)試過(guò)),或者把原始圖片修改下。

到此這篇關(guān)于利用python在excel中畫(huà)圖的實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)python excel畫(huà)圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python結(jié)合PyWebView庫(kù)打造跨平臺(tái)桌面應(yīng)用

    Python結(jié)合PyWebView庫(kù)打造跨平臺(tái)桌面應(yīng)用

    隨著Web技術(shù)的發(fā)展,將HTML/CSS/JavaScript與Python結(jié)合構(gòu)建桌面應(yīng)用成為可能,本文將系統(tǒng)講解如何使用PyWebView庫(kù)實(shí)現(xiàn)這一創(chuàng)新方案,希望對(duì)大家有一定的幫助
    2025-04-04
  • Python中的分布式框架Ray的安裝與使用教程

    Python中的分布式框架Ray的安裝與使用教程

    Ray框架下不僅可以通過(guò)conda和Python十分方便的構(gòu)建一個(gè)集群,還可以自動(dòng)的對(duì)分布式任務(wù)進(jìn)行并發(fā)處理,且支持GPU分布式任務(wù)的提交,本文介紹了基于Python的分布式框架Ray的基本安裝與使用,感興趣的朋友一起看看吧
    2024-08-08
  • python庫(kù)pydantic的簡(jiǎn)易入門(mén)教程

    python庫(kù)pydantic的簡(jiǎn)易入門(mén)教程

    pydantic庫(kù)是一種常用的用于數(shù)據(jù)接口schema定義與檢查的庫(kù),通過(guò)pydantic庫(kù),我們可以更為規(guī)范地定義和使用數(shù)據(jù)接口,下面這篇文章主要給大家介紹了關(guān)于python庫(kù)pydantic的簡(jiǎn)易入門(mén)教程,需要的朋友可以參考下
    2022-03-03
  • tensorflow使用CNN分析mnist手寫(xiě)體數(shù)字?jǐn)?shù)據(jù)集

    tensorflow使用CNN分析mnist手寫(xiě)體數(shù)字?jǐn)?shù)據(jù)集

    這篇文章主要介紹了tensorflow使用CNN分析mnist手寫(xiě)體數(shù)字?jǐn)?shù)據(jù)集,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • python文件名批量重命名腳本實(shí)例代碼

    python文件名批量重命名腳本實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于python文件名批量重命名腳本的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Python語(yǔ)言實(shí)現(xiàn)SIFT算法

    Python語(yǔ)言實(shí)現(xiàn)SIFT算法

    SIFT,即尺度不變特征變換,是用于圖像處理領(lǐng)域的一種描述,本文重點(diǎn)給大家介紹Python語(yǔ)言實(shí)現(xiàn)SIFT算法,感興趣的朋友一起看看吧
    2021-11-11
  • 通過(guò)pycharm使用git的步驟(圖文詳解)

    通過(guò)pycharm使用git的步驟(圖文詳解)

    這篇文章主要介紹了通過(guò)pycharm使用git的步驟(圖文詳解),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • 使用python實(shí)現(xiàn)省市三級(jí)菜單效果

    使用python實(shí)現(xiàn)省市三級(jí)菜單效果

    本文給大家分享的是使用使用python實(shí)現(xiàn)省市三級(jí)菜單效果的代碼,非常的實(shí)用,有需要的小伙伴可以參考下。
    2016-01-01
  • python借助ChatGPT讀取.env實(shí)現(xiàn)文件配置隔離保障私有數(shù)據(jù)安全

    python借助ChatGPT讀取.env實(shí)現(xiàn)文件配置隔離保障私有數(shù)據(jù)安全

    這篇文章主要為大家介紹了python讀取.env實(shí)現(xiàn)文件配置隔離保障私有數(shù)據(jù)安全,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • 使用Python代碼識(shí)別股票價(jià)格圖表模式實(shí)現(xiàn)

    使用Python代碼識(shí)別股票價(jià)格圖表模式實(shí)現(xiàn)

    這篇文章主要為大家介紹了使用Python代碼識(shí)別股票價(jià)格圖表模式的實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12

最新評(píng)論

绵阳市| 江源县| 柯坪县| 莫力| 那曲县| 澄江县| 临泉县| 合山市| 额济纳旗| 株洲市| 云和县| 贡嘎县| 乐亭县| 嘉祥县| 博白县| 德钦县| 清水河县| 永顺县| 青铜峡市| 寿阳县| 土默特右旗| 白水县| 定西市| 自治县| 神农架林区| 泰顺县| 延长县| 伊金霍洛旗| 卢湾区| 正镶白旗| 循化| 张家口市| 洛浦县| 塔河县| 罗甸县| 德保县| 定州市| 龙南县| 岗巴县| 高雄市| 建瓯市|