使用Python尋找圖像最常見的顏色

2020-12-17 人工智慧遇見磐創

如果我們知道圖像或對象最常見的是哪種顏色,那麼可以解決圖像處理中的幾個用例,例如在農業領域,我們可能需要確定水果的成熟度。我們可以簡單地檢查一下水果的顏色是否在預定的範圍內,看看它是成熟的,腐爛的,還是未成熟的。

與往常一樣,我們可以使用Python和簡單但功能強大的庫(如Numpy、Matplotlib和OpenCV)來解決這個問題。我將演示如何使用這些軟體包在圖像中找到最常見的顏色的幾種方法。

步驟1-加載包

import cv2 as cvimport numpy as npimport matplotlib.pyplot as pltimport PIL%matplotlib inline在這裡加載基本包,後續會繼續加載更多的包。另外,由於我們是用Jupyter編程的,所以不要忘了包含%matplotlib內聯命令。

步驟2-加載並顯示示例圖像

在本教程中,我們將展示兩個並排的圖像。所以,讓我們用一個helper函數來實現。

def show_img_compar(img_1, img_2 ): f, ax = plt.subplots(1, 2, figsize=(10,10)) ax[0].imshow(img_1) ax[1].imshow(img_2) ax[0].axis('off') # 隱藏軸 ax[1].axis('off') f.tight_layout() plt.show()接下來,我們將加載一些在本教程中使用的示例圖像,並使用上面的函數演示它們。

img = cv.imread("img/img_1.jpg")img = cv.cvtColor(img, cv.COLOR_BGR2RGB)img_2 = cv.imread("img/img_2.jpg")img_2 = cv.cvtColor(img_2, cv.COLOR_BGR2RGB)dim = (500, 300)# 圖像大小自定義img = cv.resize(img, dim, interpolation = cv.INTER_AREA)img_2 = cv.resize(img_2, dim, interpolation = cv.INTER_AREA)show_img_compar(img, img_2)

現在我們準備好了。接下來要找出這些圖像中最常見的顏色了。

方法1-平均值

第一種方法是最簡單的(但無效的),找到平均像素值。

img_temp = img.copy()img_temp[:,:,0], img_temp[:,:,1], img_temp[:,:,2] = np.average(img, axis=(0,1))img_temp_2 = img_2.copy()img_temp_2[:,:,0], img_temp_2[:,:,1], img_temp_2[:,:,2] = np.average(img_2, axis=(0,1))show_img_compar(img, img_temp)show_img_compar(img_2, img_temp_2)使用numpy的average函數,我們可以很容易地得到行和寬度軸的平均像素值axis=(0,1)。

我們可以看出,平均法可以給出誤導或不準確的結果,因為它給出的最常見的顏色與實際偏離,這是因為平均值結合了所有像素值。當我們有高對比度的圖像(在一個圖像中「光」和「暗」),如在第二幅圖中,這個問題更明顯。

它給了我們一種在圖像中不明顯的新顏色。

方法2-最高像素頻率

第二種方法要比第一種方法精確一些,我們只需計算每個像素值中出現的次數。

幸運的是,numpy給了我們另一個函數,這個函數給出了精確的結果。但首先,我們必須重塑圖像數據結構,使其僅給出3個值的列表(每個R、G和B通道強度各一個)。

可以簡單地使用numpy的reshape函數來獲得像素值的列表。

現在我們有了正確結構的數據,我們可以開始計算像素值的頻率。只需使用numpy的unique函數,參數return_counts=True。

完成了,接下來在圖像上運行。

img_temp = img.copy()unique, counts = np.unique(img_temp.reshape(-1, 3), axis=0, return_counts=True)img_temp[:,:,0], img_temp[:,:,1], img_temp[:,:,2] = unique[np.argmax(counts)]img_temp_2 = img_2.copy()unique, counts = np.unique(img_temp_2.reshape(-1, 3), axis=0, return_counts=True)img_temp_2[:,:,0], img_temp_2[:,:,1], img_temp_2[:,:,2] = unique[np.argmax(counts)]show_img_compar(img, img_temp)show_img_compar(img_2, img_temp_2)

這比第一個更有意義,對吧?最常見的顏色是黑色區域。但我們可以更進一步,如果不只取一種最常見的顏色,而是多取一種呢?用同樣的方法,我們可以選擇前N種最常見的顏色。但是如果你看第一張圖片,頻率最高的許多顏色很可能是相鄰的顏色,可能只有幾個像素的差別。

換言之,我們要取最常見的,不同顏色的簇。

方法3-使用K均值聚類

我們使用Scikit-Learn來實現。我們可以使用K-Means聚類將顏色組聚集在一起。

現在,我們只需要一個函數來顯示上面的顏色簇並立即顯示出來。

def palette(clusters): width=300 palette = np.zeros((50, width, 3), np.uint8) steps = width/clusters.cluster_centers_.shape[0] for idx, centers in enumerate(clusters.cluster_centers_): palette[:, int(idx*steps):(int((idx+1)*steps)), :] = centers return paletteclt_1 = clt.fit(img.reshape(-1, 3))show_img_compar(img, palette(clt_1))clt_2 = clt.fit(img_2.reshape(-1, 3))show_img_compar(img_2, palette(clt_2))我們只需創建一個高度為50、寬度為300像素的圖像來顯示顏色組/調色板。對於每個顏色簇,將其指定給調色板。

K-Means聚類在檢測圖像中最常見的顏色方面給出了很好的結果。在第二張圖中,我們可以看到調色板中有太多的棕色陰影。這很可能是因為我們選擇了太多的簇。讓我們看看是否可以通過選擇較小的k值來修復它。

def palette(clusters): width=300 palette = np.zeros((50, width, 3), np.uint8) steps = width/clusters.cluster_centers_.shape[0] for idx, centers in enumerate(clusters.cluster_centers_): palette[:, int(idx*steps):(int((idx+1)*steps)), :] = centers return paletteclt_3 = KMeans(n_clusters=3)clt_3.fit(img_2.reshape(-1, 3))show_img_compar(img_2, palette(clt_3))

是的,解決了。

由於我們使用K-Means聚類,仍然需要自己確定適當的k。3似乎是個不錯的選擇。

但我們仍然可以在這些結果的基礎上改進。我們也展示一下這些簇在整個圖像中所佔的比例如何?

方法3.1-K均值+比例顯示

我們需要做的就是修改調色板函數。我們不使用固定的步長,而是將每個簇的寬度更改為與該簇中的像素數成比例。

from collections import Counterdef palette_perc(k_cluster): width = 300 palette = np.zeros((50, width, 3), np.uint8) n_pixels = len(k_cluster.labels_) counter = Counter(k_cluster.labels_) # 計算每個簇有多少像素 perc = {} for i in counter: perc[i] = np.round(counter[i]/n_pixels, 2) perc = dict(sorted(perc.items())) # 用於日誌記錄 print(perc) print(k_cluster.cluster_centers_) step = 0 for idx, centers in enumerate(k_cluster.cluster_centers_): palette[:, step:int(step + perc[idx]*width+1), :] = centers step += int(perc[idx]*width+1) return paletteclt_1 = clt.fit(img.reshape(-1, 3))show_img_compar(img, palette_perc(clt_1))clt_2 = clt.fit(img_2.reshape(-1, 3))show_img_compar(img_2, palette_perc(clt_2))

這樣好多了,它不僅給了我們圖像中最常見的顏色。它還提供了每個像素出現的比例。

它也有助於告訴我們應該使用多少個簇。在上面的圖像中,兩到四個簇似乎是合理的。在第二張圖像中,我們至少需要兩個簇。不使用一個簇(k=4)的原因是可能會遇到與平均方法相同的問題。

結論

我們介紹了使用Python和一些著名的庫來獲取圖像中最常見顏色的幾種技術。另外,我們也看到了這些技術的優缺點。到目前為止,使用K>1的K-Means找到最常見的顏色是在圖像中找到最常見顏色的最佳解決方案之一(至少與我們已經使用的其他方法相比)。

Github倉庫代碼:https://github.com/mrakelinggar/data-stuffs/tree/master/frequent_color。

相關焦點

  • 一文概述用 python 的 scikit-image 模塊進行圖像分割
    而圖像分割是圖像處理中非常重要的一個步驟,它是把圖像分成若干個特定的、具有獨特性質的區域,並提取出感興趣目標的技術。近日,工程師 Parul Pandey 發表了一篇博文,在博文中,她介紹了用 python 的 scikit-image 庫進行圖像分割的方法。具體涉及 scikit-image 的安裝,圖像導入以及用監督算法和無監督算法進行圖像分割的方法。
  • 介紹TensorFlow物體檢測API訓練神經網絡、Python腳本尋找威利的過程
    「Where’s Wally」的商標已在28個國家進行了註冊,為方便語言翻譯,每一個國家都會給威利起一個新名字,最成功的是北美版的「Where’s Waldo」,在這裡,威利改名成了沃爾多(Waldo)。
  • Python類庫Pillow實現圖片裁剪、縮放、效果增強等功能
    setup.py install使用提供了廣泛的文件格式支持,高效的內部展現,以及十分強大的圖像處理能力。用於圖像歸檔和圖像批量處理,你可以使用它建立縮略圖,轉換格式,列印圖片等等,現在的版本可以驗證和讀取大量的圖片格式。
  • 「python opencv視覺零基礎實戰」七邏輯運算應用
    一、學習目標了解opencv中圖像的邏輯運算了解opencv中邏輯運算的應用如有錯誤歡迎指出~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python
  • 使用Python生成10,000多個唯一的8位光劍
    我將使用Pillow(7.1.1版)進行所有圖像處理,使用Tweepy(3.8.0版)發出tweets,使用numpy(1.18.3版)進行一些顏色處理,我將在後面討論。總體來說,這是一個非常簡單的要求。
  • 用20行python代碼給證件照換底色
    而今天本文要說的是,python也可以實現類似的功能。 我知道有人會說:「PS它不香嗎?」。是的,僅從這一個小功能來說,python不是「最佳實踐」,但我們並不是要告訴你如何換一個圖片的背景色,而是讓你了解python中有豐富的黑科技庫(比如opencv),以及如何用這些庫結合其他知識(比如圖像處理)實現各種實用或者有趣的功能。
  • 教程| 你來手繪塗鴉,人工智慧生成「貓片」:edges2cats圖像轉換詳解
    pix2pix 使用了一種條件生成式對抗網絡(Conditional Generative Adversarial Networks)來學習從輸入圖像到輸出圖像的映射。這個網絡由兩個主要部分組成,生成器(generator)和辨別器 (discriminator)。生成器接收了輸入圖像,經過轉變來得到輸出圖像。
  • 圖像處理中曝光 - CSDN
    這裡所謂的曝光度的,這裡所謂的曝光度,實際上是借用了英文單詞exposure的翻譯,因為在這一講中,我們要涉及到python中skimage.exposure中涉及到的函數啦。這一講主要包括圖像的直方圖,直方圖均衡化,自適應直方圖均衡化,顏色閾值調整,gamma校正等等內容。
  • 初學者如何用「python爬蟲」技術抓取網頁數據?
    想要入門Python 爬蟲首先需要解決四個問題:1.熟悉python編程2.了解HTML3.了解網絡爬蟲的基本原理4.學習使用python爬蟲庫1、HTML標記是最常見的標記,通常成對出現,例如<h1>和</ h1>。 在成對出現的標籤中,第一個標籤是開始標籤,第二個標籤是結束標籤。 在兩個標籤之間是元素的內容(文本,圖像等)。 有些標籤沒有內容,並且是空元素,例如<img>。
  • 藉助Streamlit框架,可僅使用Python代碼來構建基於瀏覽器的UI
    使用pip安裝Streamlit:Pip install streamlit並在python腳本上運行streamlit:Streamlit run app.py使用例子>我在上一篇文章中演示構建了一個Python程序(https://towardsdatascience.com/solving-mazes-with-python-f7a412f2493f),該程序將解決給定圖像文件和起始/結束位置的迷宮。
  • datatype在python專題及常見問題 - CSDN
    title category layout tags date python教程之3基本數據類型 pythonl,但建議使用大寫L,避免與數字1混淆。python的字串列表有2種取值順序:從左到右索引默認0開始的,最大範圍是字符串長度少1從右到左索引默認-1開始的,最大範圍是字符串開頭如果要實現從字符串中獲取一段子字符串的話,可以使用變量 [頭下標:尾下標],就可以截取相應的字符串,其中下標是從 0 開始算起,可以是正數或負數,下標可以為空表示取到頭或尾。
  • 超硬核的 Python 數據可視化教程!
    matplotlibpython中最基本的作圖庫就是matplotlib,是一個最基礎的Python可視化庫,一般都是從matplotlib上手Python數據可視化,然後開始做縱向與橫向拓展。函數則根據第一步中選擇好的圖形,去找python中對應的函數。第三步:參數設置,一目了然原始圖形畫完後,我們可以根據需求修改顏色(color),線型(linestyle),標記(maker)或者其他圖表裝飾項標題(Title),軸標籤(xlabel,ylabel),軸刻度(set_xticks),還有圖例(legend)等,讓圖形更加直觀。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    因篇幅有限,以下展示的只是課程裡部分內容如對python課程有更多疑問 請諮詢客服 1零基礎入門全能班 01 –python簡介 02 第一個程序 03-python執行方式和pycharm設置 04-程序的注釋和算術運算符 05 程序執行原理 06變量的使用以及類型 07
  • 會照片處理的不只是ps,還有Python!
    最近發現了程式設計師的p圖神器——python。 python也可以修圖嗎?是滴!下面就帶你進入python的修圖世界。(以下面這張照片為例。) 圖片來源於pixabay 庫名稱:Pillow Pillow是Python中最流行的圖像預處理函數庫
  • 基於opencv 的圖像處理入門教程
    安裝OpenCV 的安裝還是比較簡單的,直接用 pip 命令在命令行安裝即可,輸入以下命令:pip install opencv-python驗證是否安裝成功,可以運行 python 命令,然後分別輸入以下命令:import cv2
  • 慢步python,你苦苦找尋的python中文使用手冊在哪裡?這裡有答案
    #學習難度大python對大家來說,應該算是相對新的程式語言。即使這樣,我們學習python的道路依舊困難重重。問題在,相關的學習資料不夠系統。初學者使用手冊像以前剛開始使用電視、手機一樣,都有一本使用說明書,即使用手冊。
  • 單張圖像就可以訓練GAN!Adobe改良圖像生成方法 | 已開源
    當然,ConSinGAN還可以用來處理許多其他任務,例如圖像超解析度( image super-resolution)、圖像動畫(image animation),以及圖像去霧(image dehazing)。  下面兩張就是它在圖像協調(image harmonization)和圖像編輯(image editing)上的效果。
  • 教你學習:Python-100-Days-01
    python是腳本語言,學習簡單。包含很多環境的數學包,可以簡化我們的開發,方便我們數學計算。未來是數據的時代,java和python是必須要會的語言,是人工智慧和大數據的基礎。python結構介紹及運行python需要安裝python環境,目前主要學習python3,python2不值得學習。java分為編譯和執行,兩個過程,python腳本語言,只有執行過程。
  • 學Python 都用來幹嘛的?
    這很可能是全GitHub最德高望重的購票小助手了,功能一直在更新!4、做PhotoshopPS作為世界四大發明之一可以說被廣大網友用到了極致,只有你想不到、沒有我P不了!PIL全稱是Python Image Library,顧名思義,是用來做圖像處理的。它是一個Python的庫,可以實現很多PS裡的效果,PIL可以做的和圖像處理相關的事情包括了:圖像歸檔(Image Archives)。PIL非常適合於圖像歸檔以及圖像的批處理任務。
  • python飛機大戰1
    大戰外星人首先檢查python中是否帶有pygame沒有的話:1.安裝pip驗證是否安裝pip,輸入查看版本命令,pip --version如果出現版本信息,則說明安裝成功;如果沒有,則需要安裝pip。