基于Python的顏色識(shí)別器
點(diǎn)擊上方“小白學(xué)視覺(jué)”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時(shí)間送達(dá)

在這篇文章中,我們將展示如何使用Python構(gòu)建顏色識(shí)別器。此過(guò)程也稱為“顏色檢測(cè)”。我們將創(chuàng)建一個(gè)基本應(yīng)用程序,該應(yīng)用程序?qū)椭覀儥z測(cè)圖像中的顏色。該程序還將返回顏色的RGB值。構(gòu)建顏色識(shí)別器是Computer Vision中最基礎(chǔ)的項(xiàng)目。
如果大家以前從未聽(tīng)說(shuō)過(guò)Computer Vision,那么這是了解它的最佳時(shí)間。大多數(shù)機(jī)器學(xué)習(xí)和人工智能領(lǐng)域都與計(jì)算機(jī)視覺(jué)緊密相關(guān)。隨著我們的發(fā)展和探索,看到外部世界對(duì)我們的發(fā)展具有重大影響。對(duì)于機(jī)器來(lái)說(shuō),情況也是如此,他們使用圖像看到外界,并且這些圖像被轉(zhuǎn)換為計(jì)算機(jī)可以理解的數(shù)據(jù)值。
目錄
? 入門(mén)
? 庫(kù)
? 定義圖片
? 顏色識(shí)別
? 應(yīng)用
? 結(jié)果
我們將為此項(xiàng)目使用三個(gè)主要模塊。它們是NumPy,Pandas和OpenCv。OpenCv是一個(gè)高度優(yōu)化的庫(kù),專注于實(shí)時(shí)應(yīng)用程序。
OpenCV(開(kāi)源計(jì)算機(jī)視覺(jué)庫(kù))是一個(gè)開(kāi)源計(jì)算機(jī)視覺(jué)和機(jī)器學(xué)習(xí)軟件庫(kù)。OpenCV的構(gòu)建旨在為計(jì)算機(jī)視覺(jué)應(yīng)用程序提供通用的基礎(chǔ)結(jié)構(gòu),并加速在商業(yè)產(chǎn)品中使用機(jī)器感知。
資料來(lái)源:https?:?//opencv.org
庫(kù)
如前所述,我們將在此項(xiàng)目中使用三個(gè)模塊。要使用這些模塊,我們必須安裝必要的庫(kù)。使用pip安裝庫(kù)非常簡(jiǎn)單。Pip是程序包管理工具。我們將使用命令行界面進(jìn)行安裝。這是一次安裝所有3個(gè)庫(kù)的行:
pip install numpy pandas opencv-python
安裝完成后,我們必須將它們導(dǎo)入到我們的程序中。在大家喜歡的代碼編輯器中打開(kāi)一個(gè)新文件。以下是有關(guān)如何導(dǎo)入已安裝庫(kù)的代碼:
import numpy as np
import pandas as pd
import cv2
OpenCv導(dǎo)入為cv2。對(duì)于其他庫(kù),我們將它們“ as”導(dǎo)入,以便在程序中更輕松地調(diào)用它們。
完善!現(xiàn)在,我們可以進(jìn)行下一步,在此步驟中,我們將定義要用于測(cè)試顏色識(shí)別器應(yīng)用程序的圖像。
定義圖片
您可以選擇任何想要的圖像。我將圖像保存在與程序相同的文件夾中,這使查找和導(dǎo)入更加容易。
img = cv2.imread("color_image.jpg")
為了給您一些想法,這是我將用于此項(xiàng)目的圖像:

大家準(zhǔn)備好進(jìn)行一些編程了嗎?讓我們繼續(xù)下一步。
顏色識(shí)別
我問(wèn)大家一個(gè)好問(wèn)題。小伙伴們知道機(jī)器就相當(dāng)于一張白紙嗎?我們認(rèn)為是因?yàn)樗麄儗W(xué)到了教給他們的東西。
教授色彩
首先,我們必須教給他們什么是顏色。為此,我們需要包含顏色名稱和一些與這些顏色匹配的值的數(shù)據(jù)。由于大多數(shù)顏色都可以使用紅色,綠色和藍(lán)色定義。這就是為什么我們將RGB格式用作數(shù)據(jù)點(diǎn)的原因。我找到了一個(gè)準(zhǔn)備就緒的csv文件,其中包含大約1000個(gè)顏色名稱和RGB值。下面是相關(guān)鏈接:
https://github.com/codebrainz/color-names/blob/master/output/colors.csv
我們將在程序中使用此csv文件。該文件的屏幕截圖可讓您有所了解:

colors.csv
讓我們使用read_csv方法將colors.csv文件導(dǎo)入到我們的程序中。由于我們下載的csv文件沒(méi)有列名,因此我將在程序中定義它們。此過(guò)程稱為數(shù)據(jù)處理。
index=["color", "color_name", "hex", "R", "G", "B"]csv = pd.read_csv('colors.csv', names=index, header=None)
全局變量
在以下步驟中,我們將定義兩個(gè)函數(shù)。為了使應(yīng)用程序順利運(yùn)行,我們需要一些全局變量。大家將了解全局變量在使用函數(shù)時(shí)是如何幫助大家的。
clicked = False
r = g = b = xpos = ypos = 0
顏色識(shí)別功能
當(dāng)我們雙擊圖像的某個(gè)區(qū)域時(shí),將調(diào)用此函數(shù)。它將返回顏色名稱和該顏色的RGB值。這就是神奇的地方!
def recognize_color(R,G,B):minimum = 10000for i in range(len(csv)):d = abs(R- int(csv.loc[i,"R"])) + abs(G- int(csv.loc[i,"G"]))+ abs(B- int(csv.loc[i,"B"]))if(d<=minimum):minimum = dcname = csv.loc[i,"color_name"]return cname
鼠標(biāo)點(diǎn)擊功能
此函數(shù)用于定義我們的雙擊過(guò)程。在創(chuàng)建應(yīng)用程序部分時(shí),我們將需要它。
def mouse_click(event, x, y, flags, param):if event == cv2.EVENT_LBUTTONDBLCLK:global b,g,r,xpos,ypos, clickedclicked = Truexpos = xypos = y= img[y,x]b = int(b)g = int(g)r = int(r)
希望大家繼續(xù)和我在一起!看起來(lái)可能有些復(fù)雜,但是當(dāng)我們開(kāi)始在編輯器中編寫(xiě)它們時(shí),大局就會(huì)顯現(xiàn)出來(lái)。我們盡量使事情變得簡(jiǎn)單易懂。
應(yīng)用
很高興大家能完成此步驟。在這一步中,我們將使用OpenCV方法將圖像作為新窗口打開(kāi)。在該窗口中,我們將使用我們先前定義的功能。該應(yīng)用程序非常簡(jiǎn)單,當(dāng)我們雙擊圖像上的某個(gè)區(qū)域時(shí),它將返回顏色名稱和顏色值。
應(yīng)用窗口
首先,讓我向大家展示如何使用OpenCV將圖像文件作為新窗口打開(kāi)。
cv2.namedWindow('Color Recognition App')
其次,讓我們調(diào)用我們創(chuàng)建的鼠標(biāo)單擊功能。這為我們的應(yīng)用程序提供了更多功能。
cv2.setMouseCallback('Color Recognition App',mouse_click)
應(yīng)用程序
這是while循環(huán),用于啟動(dòng)我們的應(yīng)用程序窗口。
while(1):cv2.imshow("Color Recognition App",img)if (clicked):#cv2.rectangle(image, startpoint, endpoint, color, thickness)-1 fills entire rectanglecv2.rectangle(img,(20,20), (750,60), (b,g,r), -1)#Creating text string to display( Color name and RGB values )text = recognize_color(r,g,b) + ' R='+ str(r) + ' G='+ str(g) + ' B='+ str(b)#cv2.putText(img,text,start,font(0-7),fontScale,color,thickness,lineType )cv2.putText(img, text,(50,50),2,0.8,(255,255,255),2,cv2.LINE_AA)#For very light colours we will display text in black colourif(r+g+b>=600):cv2.putText(img, text,(50,50),2,0.8,(0,0,0),2,cv2.LINE_AA)clicked=False
關(guān)閉申請(qǐng)
如果您使用過(guò)OpenCV項(xiàng)目,則可能熟悉此步驟。我們必須定義如何結(jié)束和關(guān)閉應(yīng)用程序窗口。否則,它將因?yàn)槲覀兪褂?/span>while(1)啟動(dòng)應(yīng)用程序而永遠(yuǎn)運(yùn)行。添加以下行是您未來(lái)項(xiàng)目的一個(gè)好習(xí)慣。
#Break the loop when user hits 'esc' keyif cv2.waitKey(20) & 0xFF ==27:breakcv2.destroyAllWindows()
交流群
歡迎加入公眾號(hào)讀者群一起和同行交流,目前有SLAM、三維視覺(jué)、傳感器、自動(dòng)駕駛、計(jì)算攝影、檢測(cè)、分割、識(shí)別、醫(yī)學(xué)影像、GAN、算法競(jìng)賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺(jué)SLAM“。請(qǐng)按照格式備注,否則不予通過(guò)。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~
