?? 作者:韓信子@ShowMeAI
?? Python3?技能提升系列:https://www.showmeai.tech/tutorials/56
?? 計算機視覺實戰系列:https://www.showmeai.tech/tutorials/46
?? 本文地址:https://www.showmeai.tech/article-detail/404
?? 宣告:著作權所有,轉載請聯系平臺與作者并注明出處
?? 收藏ShowMeAI查看更多精彩內容
?? 引言
我們本次用到的資料集是 ??Kaggle 100 種鳥資料集,大家可以通過 ShowMeAI 的百度網盤地址下載,
?? 實戰資料集下載(百度網盤):公眾號『ShowMeAI研究中心』回復『實戰』,或者點擊 這里 獲取本文 [39]使用Python構建圖片顏色提取器 『Bird 450 Species資料集』
? ShowMeAI官方GitHub:https://github.com/ShowMeAI-Hub
大家在做影像處理或者制作PPT時,一個非常常用的功能是顏色提取,我們可以通過提取器從已有影像的某個位置提取顏色,而不用自己肉眼比對和選擇,今天ShowMeAI就帶大家用python來實作這個功能,
我們會構建如下2個顏色提取器:
- 簡單提取器——從單個影像中選擇顏色
- 復雜提取器——從多個影像中選擇顏色串列并顯示顏色
本文的實作涉及python編程知識與部分資料可視化知識,大家可以通過ShowMeAI的以下教程和文章進行系統學習:
??圖解Python編程:從入門到精通系列教程
?? 資料科學工具庫速查表 | Matplotlib 速查表
?? 顏色提取器實作
?? 匯入工具庫
首先我們需要匯入本次所需的工具庫,matplotlib.image用于顯示影像,pyperclip用于將字串保存到剪貼板,glob用于處理檔案路徑,
#Imports
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import pyperclip
import random
import glob
我們將從不同的鳥類影像中提取顏色(即大家在第1節看到的影像),我們讀取路徑下所有的jpg格式影像,代碼如下:
#Dataset
read_path = "../../data/birds/"
img_path = glob.glob(read_path + "*.jpg")
?? 簡單顏色提取器實作
我們先實作一個簡單顏色提取器,它的功能是,每次我們單擊影像中的某個位置,該像素的 RGB 通道會保存到我們的剪貼板中,然后我們可以將該值粘貼到筆記本中,
![]() |
我們先構建一個onclick函式,每次單擊影像時都會運行此程式,我們獲取點擊的 x 和 y 坐標,然后得到該坐標處像素的 RGB 通道值,并將其作為字串保存到剪貼板,完整的代碼如下:
def onclick(event):
global img
# get x,y of click
x = round(event.xdata)
y = round(event.ydata)
# get RGB values
rgb = img[y][x]
# save to clip board
pyperclip.copy(str(rgb))
我們要使用上面這個函式,我們首先使用 matplotlib 創建一個圖形,然后設定該圖的互動功能,將onclick函式作為引數傳入,這樣我們每次點擊就會呼叫上述函式進行顏色提取,
%matplotlib notebook
global img
fig = plt.figure(figsize=(5,5))
#Add an interactive widget to figure
cid = fig.canvas.mpl_connect('button_press_event', onclick)
#Load image and add count
path = img_path[0]
img = mpimg.imread(path)
plt.imshow(img)
plt.show()
注意:上述代碼的第2行使用了全域變數,這樣就可以在
onclick函式中更新這些變數,
?? 復雜顏色提取器實作
下面我們來構建一個復雜顏色提取器,它實作的功能如下圖所示:我們多次點擊不同影像的多個位置,我們會按照順序編號和記錄顏色(注意顏色框左上角的紅色數字),并把顏色保存到串列中,
![]() |
我們還是需要構建onclick函式,和之前的簡單顏色提取器有點類似,這里的主要區別在于我們不直接保存 RGB 通道值,而是呼叫change_choice來調整右側顯示的提取顏色,
def onclick(event):
global img
global rgb
# get x,y of click
x = round(event.xdata)
y = round(event.ydata)
# get RGB values
rgb = img[y][x]
#Update second plot with colour
change_choice()
我們再定義一個函式onpress,它會在按下鍵盤時運行,這個函式在按下了不同鍵的情況下做不同的處理:(change_image和change_choice會分別用于更新圖片和更新顯示顏色框,在后續會定義)
n:運行change_image函式,c:我們將 RGB 通道值保存到剪貼板和顏色串列中,接著運行change_choice函式,
具體代碼實作如下:
def onpress(event):
global rgb
global colours
#Get key
key = event.key
if key == 'n':
change_image()
elif key == 'c':
# save to clip board
pyperclip.copy(str(rgb))
# add to list of colours
colours.append(rgb)
change_choice()
change_choice函式用于更新右側顏色框,右側的顏色框有與影像框相同的尺寸,并且根據當前全域 rgb 值進行顏色顯示,
def change_choice():
global img
global ax
global colours
global rgb
# remove previous count
for txt in ax[1].texts:
txt.set_visible(False)
# create array of colour choice
dims = np.shape(img)
col = np.array([[rgb]*dims[0]]*dims[1])
ax[1].imshow(col)
# update colour count
ax[1].text(0, 15, len(colours),color='r',size=20)
plt.show()
change_choice函式在2處呼叫和執行:
- 點擊圖片時呼叫的onclick函式中,它完成 全域 rgb 更新并調整框中的顏色,
- 呼叫
onpress函式并按下“c”時,這里顏色串列的長度+1,顏色計數也會改變,
接下來我們定義change_image函式,我們在按下“n”時會呼叫它更新影像框,代碼如下:
def change_image():
global img_path
global img
global ax
global rgb
# close all open plots
plt.close('all')
fig,ax = plt.subplots(1,2,figsize=(10,5))
# add an interactive widget to figure
cid = fig.canvas.mpl_connect('button_press_event', onclick)
cid2 = fig.canvas.mpl_connect('key_press_event', onpress)
# load random image
path = random.choice(img_path)
img = mpimg.imread(path)
ax[0].imshow(img)
# reset the colour window
rgb = [255,255,255]
change_choice()
我們可以通過運行change_image函式來啟動顏色選擇器,如下:
%matplotlib tk
global img_path
global colours
colours = []
# load image paths
read_path = "../../data/birds/"
img_path = glob.glob(read_path + "*.jpg")
# start widget
change_image()
接下來當你就可以使用這個復雜顏色提取器啦,在您遍歷影像并保存顏色時,顏色串列隨之更更新,我們在下圖的 colours 里可以看到提取的顏色構建的rgb值序列,
參考資料
- ?? Kaggle 100 種鳥資料集:https://www.kaggle.com/datasets/gpiosenka/100-bird-species
- ?? Python3?技能提升系列:https://www.showmeai.tech/tutorials/56
- ?? 資料科學工具庫速查表 | Matplotlib 速查表:https://www.showmeai.tech/article-detail/103
推薦閱讀
- ?? 資料分析實戰系列 :https://www.showmeai.tech/tutorials/40
- ?? 機器學習資料分析實戰系列:https://www.showmeai.tech/tutorials/41
- ?? 深度學習資料分析實戰系列:https://www.showmeai.tech/tutorials/42
- ?? TensorFlow資料分析實戰系列:https://www.showmeai.tech/tutorials/43
- ?? PyTorch資料分析實戰系列:https://www.showmeai.tech/tutorials/44
- ?? NLP實戰資料分析實戰系列:https://www.showmeai.tech/tutorials/45
- ?? CV實戰資料分析實戰系列:https://www.showmeai.tech/tutorials/46
- ?? AI 面試題庫系列:https://www.showmeai.tech/tutorials/48
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/539312.html
標籤:其他
下一篇:時針分針與秒針


