點擊上方"藍色小字"關注我呀
python
明天就是七夕了!
git
若是有對象,祝早生貴子!沒有對象,祝早結連理!bash
(搞笑一下,祝你們幸福美滿吧,嘿嘿嘿)
微信
給你們準備了一份已經寫好的代碼,利用python+opencv+openpyxl,opencv實現讀取圖片像素顏色,而後openpyxl自動填充Excel表格對應單元格背景顏色,獲得一副Excel填充圖畫。文末代碼下載連接。
app
先來看看效果叭(gif動圖)!
ide
把圖片換成女友的真人圖像會更逼真,會更加更好看。函數
而後看代碼叭!
字體
咱們須要用到python以及openpyxl和opencv包,沒有下載的小夥伴能夠去配置一下,超級簡單:
flex
大概就是在python終端(看我的環境)執行:ui
pip install opencv-pythonpip install openpyxl
下面是我安裝openpyxl包的錄屏,能夠參考一下,也能夠跳過。
配置完成後就是導入咱們須要的包了,這兒不須要過多瞭解:
#導入opencv和openpyxlimport openpyxlimport cv2 as cvimport numpy as npfrom openpyxl import load_workbookfrom openpyxl import workbook# 導入字體、邊框、顏色以及對齊方式相關庫from openpyxl.styles import Font, Border, Side, PatternFill, colors, Alignment
咱們首先須要讀取一個xlsx格式的Excel表格,須要提早在工做路徑或者某絕對路徑進行建立,並自定義命名,而後咱們獲得了一個表格對象sheet,就能夠對它進行讀寫設置等操做了。
#設置路徑#file_path = r"L:\jupyter notebook_code\file\zhaopian.xlsx" #絕對路徑# 加載工做簿wb = load_workbook(filename='zhaopian.xlsx') #默認工做路徑,zhaopian.xlsx爲Excel表格名稱,自行更改# 獲取活動中的表格sheet = wb.activeprint("open sheet:", sheet.title) #打印表格標題print("row:", sheet.max_row, "column:", sheet.max_column)
#opencv讀取圖像並顯示'''opencv的imread函數讀取圖片到srcImage若是按原始大小讀取圖片,能夠改成:srcImage = cv.imread('zhu.jpg')加上第二個參數33:srcImage = cv.imread('zhu.jpg',33)表示將原圖縮爲原來的1/4進行讀取。當原圖過大是能夠採用'''srcImage = cv.imread('zhaopian.jpg') #zhu.jpg爲照片名字,自行更改cv.imshow('image',srcImage)
#獲取圖像的高,寬並打印height = srcImage.shape[0]width = srcImage.shape[1]print("height:", height, "width:", width)
利用opencv將圖像讀取進來,以後咱們就要利用for循環遍歷圖像的各個像素值了,但在這以前咱們須要自定義一個函數,由於咱們是用openpyxl包的
PatternFill(fill_type='solid',fgColor= 'FFFFFF')
函數填充單元格顏色的,該函數只能設置十六進制的顏色格式:
因此咱們須要本身寫一個函數將RGB顏色格式轉換爲十六進制:
def color_transform(value): digit = list(map(str, range(10))) + list("ABCDEF") if isinstance(value, tuple): string = '' for i in value: a1 = i // 16 a2 = i % 16 string += digit[a1] + digit[a2] return string elif isinstance(value, str): a1 = digit.index(value[1]) * 16 + digit.index(value[2]) a2 = digit.index(value[3]) * 16 + digit.index(value[4]) a3 = digit.index(value[5]) * 16 + digit.index(value[6]) return (a1, a2, a3)
該函數實現的功能
輸入:(0,0,0),輸出:000000輸入:#FFFFFF,輸出:(255, 255, 255)
好了,解決了顏色轉換,咱們就遍歷像素吧!
#遍歷循環圖片,獲取各像素點位置的像素值,並利用openpyxl改寫對應位置單元格顏色for y in range(1, height): print("第幾行:",y) #供查看進度 for x in range(1, width): Blue_value = srcImage[y,x,0] #獲取藍,綠,紅三個通道 Green_value = srcImage[y,x,1] Red_value = srcImage[y,x,2] color = (Red_value,Green_value,Blue_value) #轉爲元組並附給color_transform函數獲得16進制 hex_ = color_transform(color) fille = PatternFill(fill_type='solid',fgColor= hex_) #設置顏色 sheet.cell(y,x).fill=fille #openpyxl進行顏色填充
具體你們看註釋了,大概就是遍歷像素並讀取RGB像素值,而後傳給color_transform函數進行轉換,而後賦值給openpyxl的PatternFill進行Excel表格填充。
還有一步,就是保存了:
wb.save(filename = 'zhaopian.xlsx') # 保存工做簿print("保存成功")
cv.waitKey(30)#圖片展現30mscv.destroyAllWindows()
完整代碼下載連接:
連接:
https://pan.baidu.com/s/1QOw28b-8tQpUp2j0qz26rg
提取碼:02q9
上面程序完畢以後,咱們只是完成了單元格的填充,但咱們知道,單元格不是正方形,運行完圖片是扁平的:
因此還須要咱們手動更改一下單元格的大小,其實openpyxl也是能夠作到的,但我也是第一天用openpyxl,也不熟練,能動手就動手吧,畢竟最麻煩的已經完成了。
還有還有!在發給對象以前,必定把excel表格打開看一下,確保是這樣的:
也就是縮放正常的表格,只有這樣,當她滾動鼠標滾輪進行縮放,漸漸變成下圖這樣時,纔會有驚喜嘛!
若是直接一打開就是上圖,和一個照片也沒什麼兩樣,也就沒那麼驚喜了,是否是?
還有,別告訴你對象是用代碼生成的,告訴她:
「這是我一個一個單元格填充了一個月顏色的成果,我是愛你的,麼麼噠,帶上身份證,我們去看電影吧~」
兄弟們,看在我熬夜調BUG的份上!轉發到大家空間或者羣聊吧!
點擊下方箭頭能夠來評論區評論哦!
本文分享自微信公衆號 - Opencv視覺實踐(gh_31e12b1be0e0)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。