Python制作拾色器!鼠標點擊即可獲取當前位置的顏色!
我們做可視化經(jīng)常會遇到配色問題,如果是在PPT中,只需使用顏色填充的取色器功能,就可以獲取指定點的顏色,為自己作品增香添色。
有人用Python也實現(xiàn)了一個類似的拾色器,今天就來講一講具體是怎么做到的!

如上圖所示,運行時只需鼠標點擊,就可以獲取當前圖片位置的顏色。

顏色值轉(zhuǎn)換
opencv讀取圖片的默認像素排列是BGR,具體為什么這么設(shè)計,這里就不展開了,感興趣的小伙伴可以參考這篇文章:https://learnopencv.com/why-does-opencv-use-bgr-color-format/
而實際上最常見的是RGB顏色,也是Photoshop中默認使用的顏色,也是最常用的一種顏色模式。RGB模式的圖像由3個顏色通道組成,分別為紅色通道(Red)、綠色通道(Green)和藍色通道(Blue),這三個通道組合可以產(chǎn)生1670萬余種不同的顏色。
cv2.cvtColor(img,?cv2.COLOR_BGR2RGB)
另外,還有一些小伙伴更熟悉十六進制顏色碼。

在搜索引擎中,可以輕松找到顏色值在線轉(zhuǎn)換網(wǎng)址。在Python中,則需要根據(jù)規(guī)則自定義個轉(zhuǎn)換函數(shù)。
def?rgb2hex(RGB):
????text?=?'#'?+?''.join([hex(i)[-2:].replace('x',?'0')?for?i?in?list(map(int,?RGB))])
????return?text
這樣就再也不怕顏色值轉(zhuǎn)換了。
鼠標交互獲取顏色
回到本文最開始,一個拾色器最核心的就是鼠標交互功能。
#?定義鼠標交互函數(shù)
def?get_Color(event,?x,?y,?flags,?param):
????if?event?==?cv2.EVENT_LBUTTONDOWN:
????????points?=?rgb2hex(img[y,?x])
????????print(points)
????????cv2.circle(img,?(x,?y),?3,?(255,?255,?255),?thickness=2)
????????cv2.putText(img,?points,?(x,?y),?cv2.FONT_HERSHEY_PLAIN,?2,?(0,?0,?0),?thickness=2)
????????cv2.imshow("image",?img)
cv2.namedWindow("image")
cv2.setMouseCallback("image",?get_Color)
cv2.imshow("image",?img)
cv2.waitKey(0)
cv2.circle()中的幾個參數(shù)分別為:圖片,圓心,半徑,顏色,線條的粗細。
cv2.putText()中的幾個參數(shù)分別為:圖片,添加的文字,左上角坐標,字體,字體大小,顏色,字體粗細。
運行效果:

最后再驗證一下,提取到的顏色是否正確?
可以拿一張帶有顏色碼的圖片,運行我們的程序試試。

驗證成功,測試得到的十六進制顏色碼與正確答案一致!

獲取本文相關(guān)的代碼和文件,請在公眾號后臺回復關(guān)鍵字:拾色器
作者:朱小五
_往期文章推薦_
