日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
基于Python查找圖像中很常見的顏色

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

景德鎮(zhèn)ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!

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

01. 準(zhǔn)備工作

第一步:添加程序包

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

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

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

02. 常用方法

方法一:平均值

第一種方法是最簡(jiǎn)單(但無效)的方法-只需找到平均像素值即可。使用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. img_temp_2 = img_2.copy()
  4. img_temp_2[:,:,0], img_temp_2[:,:,1], img_temp_2[:,:,2] = np.average(img_2, axis=(0,1))
  5. show_img_compar(img, img_temp)
  6. show_img_compar(img_2, img_temp_2)

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

方法二:最高像素頻率

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

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

現(xiàn)在我們已經(jīng)有了正確結(jié)構(gòu)的數(shù)據(jù),可以開始計(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. img_temp_2 = img_2.copy()
  5. unique, counts = np.unique(img_temp_2.reshape(-1, 3), axis=0, return_counts=True)
  6. img_temp_2[:,:,0], img_temp_2[:,:,1], img_temp_2[:,:,2] = unique[np.argmax(counts)]
  7. show_img_compar(img, img_temp)
  8. show_img_compar(img_2, img_temp_2)

比第一個(gè)更有意義嗎?最常見的顏色是黑色區(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. clt_1 = clt.fit(img.reshape(-1, 3))
  9. show_img_compar(img, palette(clt_1))
  10. clt_2 = clt.fit(img_2.reshape(-1, 3))
  11. show_img_compar(img_2, palette(clt_2))

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

是不是很漂亮?就圖像中最常見的顏色而言,K均值聚類給出了出色的結(jié)果。在第二張圖像中,我們可以看到調(diào)色板中有太多的棕色陰影。這很可能是因?yàn)槲覀冞x擇了太多的群集。讓我們看看是否可以通過選擇較小的k值來對(duì)其進(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. clt_3 = KMeans(n_clusters=3)
  9. clt_3.fit(img_2.reshape(-1, 3))
  10. show_img_compar(img_2, palette(clt_3))

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

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

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

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

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

03. 結(jié)論

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


文章題目:基于Python查找圖像中很常見的顏色
轉(zhuǎn)載來源:http://www.dlmjj.cn/article/dhihgch.html