成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

基于Python查找圖像中很常見的顏色

開發(fā) 后端
如果我們能夠得知道一幅圖像中最多的顏色是什么的話,可以幫助我們解決很多實際問題。例如在農(nóng)業(yè)領(lǐng)域中想確定水果的成熟度,我們可以通過檢查水果的顏色是否落在特定范圍內(nèi),來判斷它們是否已經(jīng)成熟。

 如果我們能夠得知道一幅圖像中最多的顏色是什么的話,可以幫助我們解決很多實際問題。例如在農(nóng)業(yè)領(lǐng)域中想確定水果的成熟度,我們可以通過檢查水果的顏色是否落在特定范圍內(nèi),來判斷它們是否已經(jīng)成熟。

 

[[351022]]

 

接下來我們將使用Python和一些常用庫(例如Numpy,Matplotlib和OpenCV)來解決這個問題。

 

 

01. 準(zhǔn)備工作

第一步:添加程序包

我們將在此處加載基本軟件包。另外,由于我們要使用Jupyter進(jìn)行編程,因此小伙伴們不要忘記添加%matplotlib inline命令。

第二步:加載并顯示示例圖像

我們將并排顯示兩個圖像,因此我們需要做一個輔助函數(shù)。接下來我們將加載一些在本教程中將要使用的示例圖像,并使用上述功能對其進(jìn)行顯示。

 

 

 

 

02. 常用方法

方法一:平均值

第一種方法是最簡單(但無效)的方法-只需找到平均像素值即可。使用numpy的average功能,我們可以輕松獲得行和寬度上的平均像素值-axis=(0,1)

 

  1. img_temp = img.copy() 
  2. img_temp[:,:,0], img_temp[:,:,1], img_temp[:,:,2] = np.average(img, axis=(0,1)) 
  3.  
  4. img_temp_2 = img_2.copy() 
  5. img_temp_2[:,:,0], img_temp_2[:,:,1], img_temp_2[:,:,2] = np.average(img_2, axis=(0,1)) 
  6.  
  7. show_img_compar(img, img_temp) 
  8. show_img_compar(img_2, img_temp_2) 

 

 

 

從上面圖像中可以看出,平均方法可能會產(chǎn)生錯誤結(jié)果,它給出的最常見的顏色可能并不是我們想要的顏色,這是因為平均值考慮了所有像素值。當(dāng)我們具有高對比度的圖像(一張圖像中同時包含“淺色”和“深色”)時這個問題會很嚴(yán)重。在第二張圖片中,這一點更加清晰。它為我們提供了一種新的顏色,該顏色在圖像中根本看不到。

方法二:最高像素頻率

第二種方法將比第一種更加準(zhǔn)確。我們的工作就是計算每個像素值出現(xiàn)的次數(shù)。numpy給我們提供了一個函數(shù)可以完成這個任務(wù)。但是首先,我們必須調(diào)整圖像數(shù)據(jù)結(jié)構(gòu)的形狀,以僅提供3個值的列表(每個R,G和B通道強度一個)。

 

 

 

 

我們可以使用numpy的reshape函數(shù)來獲取像素值列表。

 

 

 

 

現(xiàn)在我們已經(jīng)有了正確結(jié)構(gòu)的數(shù)據(jù),可以開始計算像素值的頻率了,使用numpy中的unique函數(shù)即可。

 

 

 

 

 

  1. img_temp = img.copy() 
  2. unique, counts = np.unique(img_temp.reshape(-1, 3), axis=0, return_counts=True
  3. img_temp[:,:,0], img_temp[:,:,1], img_temp[:,:,2] = unique[np.argmax(counts)] 
  4.  
  5. img_temp_2 = img_2.copy() 
  6. unique, counts = np.unique(img_temp_2.reshape(-1, 3), axis=0, return_counts=True
  7. img_temp_2[:,:,0], img_temp_2[:,:,1], img_temp_2[:,:,2] = unique[np.argmax(counts)] 
  8.  
  9. show_img_compar(img, img_temp) 
  10. show_img_compar(img_2, img_temp_2) 

 

 

 

比第一個更有意義嗎?最常見的顏色是黑色區(qū)域。但是如果我們不僅采用一種最常見的顏色,還要采用更多的顏色怎么辦?使用相同的概念,我們可以采用N種最常見的顏色。換句話說,我們要采用最常見的不同顏色群集該怎么辦。

方法三:使用K均值聚類

我們可以使用著名的K均值聚類將顏色組聚類在一起。

 

 

 

 

 

 

  1. def palette(clusters): 
  2.     width=300 
  3.     palette = np.zeros((50, width, 3), np.uint8) 
  4.     steps = width/clusters.cluster_centers_.shape[0] 
  5.     for idx, centers in enumerate(clusters.cluster_centers_):  
  6.         palette[:, int(idx*steps):(int((idx+1)*steps)), :] = centers 
  7.     return palette 
  8.  
  9.  
  10. clt_1 = clt.fit(img.reshape(-1, 3)) 
  11. show_img_compar(img, palette(clt_1)) 
  12.  
  13. clt_2 = clt.fit(img_2.reshape(-1, 3)) 
  14. show_img_compar(img_2, palette(clt_2)) 

容易吧!現(xiàn)在,我們需要的是一個顯示上面的顏色簇并立即顯示的功能。我們只需要創(chuàng)建一個高度為50,寬度為300像素的圖像來顯示顏色組/調(diào)色板。對于每個顏色簇,我們將其分配給我們的調(diào)色板。

 

 

 

 

是不是很漂亮?就圖像中最常見的顏色而言,K均值聚類給出了出色的結(jié)果。在第二張圖像中,我們可以看到調(diào)色板中有太多的棕色陰影。這很可能是因為我們選擇了太多的群集。讓我們看看是否可以通過選擇較小的k值來對其進(jìn)行修復(fù)。

 

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

 

 

 

由于我們使用K均值聚類,因此我們?nèi)匀槐仨氉约捍_定適當(dāng)數(shù)量的聚類。三個集群似乎是一個不錯的選擇。但是我們?nèi)匀豢梢愿纳七@些結(jié)果,并且仍然可以解決集群問題。我們還如何顯示群集在整個圖像中所占的比例?

方法四:K均值+比例顯示

我們需要做的就是修改我們的palette功能。代替使用固定步驟,我們將每個群集的寬度更改為與該群集中的像素數(shù)成比例。

 

  1. from collections import Counter 
  2.  
  3. def palette_perc(k_cluster): 
  4.     width = 300 
  5.     palette = np.zeros((50, width, 3), np.uint8) 
  6.  
  7.     n_pixels = len(k_cluster.labels_) 
  8.     counter = Counter(k_cluster.labels_) # count how many pixels per cluster 
  9.     perc = {} 
  10.     for i in counter: 
  11.         perc[i] = np.round(counter[i]/n_pixels, 2) 
  12.     perc = dict(sorted(perc.items())) 
  13.  
  14.     #for logging purposes 
  15.     print(perc) 
  16.     print(k_cluster.cluster_centers_) 
  17.  
  18.     step = 0 
  19.  
  20.     for idx, centers in enumerate(k_cluster.cluster_centers_):  
  21.         palette[:, step:int(step + perc[idx]*width+1), :] = centers 
  22.         step += int(perc[idx]*width+1) 
  23.  
  24.     return palette 
  25.  
  26. clt_1 = clt.fit(img.reshape(-1, 3)) 
  27. show_img_compar(img, palette_perc(clt_1)) 
  28.  
  29. clt_2 = clt.fit(img_2.reshape(-1, 3)) 
  30. show_img_compar(img_2, palette_perc(clt_2)) 

 

 

 

它不僅為我們提供了圖像中最常見的顏色。這也給了我們每個像素出現(xiàn)的比例。

03. 結(jié)論

我們介紹了幾種使用Python以及最知名的庫來獲取圖像中最常見顏色的技術(shù)。另外,我們還看到了這些技術(shù)的優(yōu)缺點。到目前為止,使用k> 1的K均值找到最常見的顏色是找到圖像中最頻繁的顏色的最佳解決方案之一。

責(zé)任編輯:華軒 來源: 小白學(xué)視覺
相關(guān)推薦

2015-12-31 10:00:41

Java日志記錄規(guī)則

2022-05-13 12:46:06

開源深度學(xué)習(xí)技術(shù)

2021-03-28 22:55:44

Python編程技術(shù)

2018-02-02 10:03:54

2022-08-20 18:33:08

開源代碼模型

2020-02-04 17:31:49

Python 開發(fā)編程語言

2024-05-15 15:27:39

2024-01-03 16:01:23

2023-12-06 12:04:52

Pythonhelp函數(shù)

2021-03-19 10:05:23

鴻蒙HarmonyOS應(yīng)用

2022-12-18 19:49:45

AI

2021-04-20 22:09:13

Python編程語言

2020-07-28 17:08:43

SQL數(shù)據(jù)庫

2022-09-29 23:53:06

機器學(xué)習(xí)遷移學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)

2022-11-06 19:28:02

分布式鎖etcd云原生

2024-10-24 08:04:00

2017-05-22 13:15:45

TensorFlow深度學(xué)習(xí)

2024-06-28 10:16:58

2022-05-05 10:40:36

Spring權(quán)限對象

2017-12-28 15:20:50

點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 91av视频在线播放 | 国产精品免费一区二区三区四区 | 欧美日韩视频一区二区 | 在线一区二区观看 | 亚洲经典一区 | 欧美一级在线 | 成人一区二区电影 | 人人艹人人 | 国产成人久久av免费高清密臂 | 美女在线国产 | 久久综合久色欧美综合狠狠 | 在线免费黄色小视频 | 欧美在线不卡 | 亚洲一二三视频 | 国产一区二区自拍 | 国产精品久久久免费 | 看一级毛片视频 | 国产精品福利网站 | 国产精品99一区二区 | 国产精品国产 | 久久久久国产精品人 | 全部免费毛片在线播放网站 | 蜜桃特黄a∨片免费观看 | 人人天天操 | 日韩快播电影网 | 久草院线 | 日本一区二区影视 | 少妇诱惑av | 91文字幕巨乱亚洲香蕉 | 日韩毛片在线视频 | 亚洲日韩视频 | 91成人精品视频 | 欧美一级二级三级视频 | 亚洲欧美精品 | 国产精品久久久久久久久久久久午夜片 | 亚洲综合视频 | 黄色一级网| 麻豆久久精品 | 精精国产xxxx视频在线 | 鸳鸯谱在线观看高清 | 精品国产色 |