最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python+OpenCV實(shí)戰(zhàn)之利用?K-Means?聚類進(jìn)行色彩量化

 更新時(shí)間:2021年12月03日 11:58:07   作者:盼小輝丶  
這篇文章主要介紹了如何利用?K-Means?聚類進(jìn)行色彩量化,以減少圖像中顏色數(shù)量。文中的代碼具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以關(guān)注一下

前言

K-Means 聚類算法的目標(biāo)是將 n 個(gè)樣本劃分(聚類)為 K 個(gè)簇,在博文《OpenCV與機(jī)器學(xué)習(xí)的碰撞》中,我們已經(jīng)學(xué)習(xí)利用 OpenCV 提供了 cv2.kmeans() 函數(shù)實(shí)現(xiàn) K-Means 聚類算法,該算法通過(guò)找到簇的中心并將輸入樣本分組到簇周圍,同時(shí)通過(guò)簡(jiǎn)單的示例了解了 K-Means 算法的用法。在本文中,我們將學(xué)習(xí)如何利用 K-Means 聚類進(jìn)行色彩量化,以減少圖像中顏色數(shù)量。

利用 K-Means 聚類進(jìn)行色彩量化

色彩量化問(wèn)題可以定義為減少圖像中顏色數(shù)量的過(guò)程。色彩量化對(duì)于某些設(shè)備顯示圖像非常關(guān)鍵,這些設(shè)備可能由于內(nèi)存限制等原因只能顯示有限顏色,因此,在這些設(shè)備上顯示色彩通常需要在準(zhǔn)確性和減少顏色數(shù)量之間進(jìn)行權(quán)衡,在利用 K-Means 聚類進(jìn)行色彩量化時(shí),權(quán)衡兩者是通過(guò)正確設(shè)置 K 參數(shù)來(lái)進(jìn)行的。

利用 K-Means 聚類算法來(lái)執(zhí)行色彩量化,簇中心數(shù)據(jù)由 3 個(gè)特征組成,它們對(duì)應(yīng)于圖像每個(gè)像素的 B、G 和 R 值。因此,關(guān)鍵是將圖像轉(zhuǎn)換為數(shù)據(jù):

data = np.float32(image).reshape((-1, 3))

為了觀察如何權(quán)衡準(zhǔn)確性和顏色數(shù),我們使用不同 K 值 (3 、 5 、 10 、 20 和 40) 執(zhí)行聚類過(guò)程,以查看生成的圖像如何變化,如果我們想要只有 3 種顏色 (K = 3) 的結(jié)果圖像,需要執(zhí)行以下操作:

加載 BGR 圖像:

img = cv2.imread('example.jpg')

使用 color_quantization() 函數(shù)執(zhí)行色彩量化:

def color_quantization(image, k):
    # 將圖像轉(zhuǎn)換為數(shù)據(jù)
    data = np.float32(image).reshape((-1, 3))
    # 算法終止條件
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 20, 1.0)
    # K-Means 聚類
    ret, label, center = cv2.kmeans(data, k, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)
    # 簇中心
    center = np.uint8(center)
    # 將具有 k 顏色中心的圖像轉(zhuǎn)換為 uint8
    result = center[label.flatten()]
    result = result.reshape(img.shape)
    return result
color_3 = color_quantization(img, 3)

color_quantization() 函數(shù)中,關(guān)鍵點(diǎn)是利用 cv2.kmeans() 方法。最后,可以用 k 種顏色來(lái)構(gòu)建圖像,用它們對(duì)應(yīng)的中心值替換每個(gè)像素值,程序的運(yùn)行結(jié)果如下所示:

完整代碼

利用 K-Means 聚類進(jìn)行色彩量化的完整代碼如下所示:

import numpy as np
import cv2
from matplotlib import pyplot as plt


def show_img_with_matplotlib(color_img, title, pos):
    img_RGB = color_img[:, :, ::-1]

    ax = plt.subplot(2, 4, pos)
    plt.imshow(img_RGB)
    plt.title(title, fontsize=8)
    plt.axis('off')

def color_quantization(image, k):
    # 將圖像轉(zhuǎn)換為數(shù)據(jù)
    data = np.float32(image).reshape((-1, 3))
    # 算法終止條件
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 20, 1.0)
    # K-Means 聚類
    ret, label, center = cv2.kmeans(data, k, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)
    # 簇中心
    center = np.uint8(center)
    # 將具有 k 顏色中心的圖像轉(zhuǎn)換為 uint8
    result = center[label.flatten()]
    result = result.reshape(img.shape)
    return result

fig = plt.figure(figsize=(16, 8))
plt.suptitle("Color quantization using K-means clustering algorithm", fontsize=14, fontweight='bold')
# 圖片加載
img = cv2.imread('example.png')
show_img_with_matplotlib(img, "original image", 1)
# 使用不同 K 值進(jìn)行色彩量化
for i in range(7):
    color = color_quantization(img, (i+1) * 10)
    show_img_with_matplotlib(color, "color quantization (k = {})".format((i+1) * 10), i+2)

plt.show()

顯示色彩量化后的色彩分布

可以擴(kuò)展以上程序使其顯示色彩量化后的色彩分布,該色彩分布顯示了分配給每個(gè)聚類中心的像素?cái)?shù)。只需擴(kuò)展 color_quantization() 函數(shù)已被修改為包含所需功能:

import collections
def color_quantization(image, k):
    # 將圖像轉(zhuǎn)換為數(shù)據(jù)
    data = np.float32(image).reshape((-1, 3))
    # 算法終止條件
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 20, 1.0)
    # K-Means 聚類
    ret, label, center = cv2.kmeans(data, k, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)
    # 簇中心
    center = np.uint8(center)
    # 將具有 k 顏色中心的圖像轉(zhuǎn)換為 uint8
    result = center[label.flatten()]
    result = result.reshape(img.shape)
    # 統(tǒng)計(jì)分配給每個(gè)聚類中心的像素?cái)?shù)
    counter = collections.Counter(label.flatten())
    print(counter)
    # 計(jì)算輸入圖像的總像素?cái)?shù)
    total = img.shape[0] * img.shape[1]
    # 為色彩分布圖像指定寬度和高度:
    desired_width = img.shape[1]
    
    desired_height = 70
    desired_height_colors = 50
    # 初始化色彩分布圖像
    color_distribution = np.ones((desired_height, desired_width, 3), dtype='uint8') * 255
    start = 0

    for key, value in counter.items():
        # 歸一化
        value_normalized = value / total * desired_width
        end = start + value_normalized
        # 繪制與當(dāng)前顏色對(duì)應(yīng)的矩形
        cv2.rectangle(color_distribution, (int(start), 0), (int(end), desired_height_colors), center[key].tolist(), -1)
        start = end

    return np.vstack((color_distribution, result))

上述代碼中,使用 collections.Counter() 來(lái)統(tǒng)計(jì)分配給每個(gè)聚類中心的像素?cái)?shù):

counter = collections.Counter(label.flatten())

例如,如果 K = 10,則可以得到如下結(jié)果:

Counter({7: 37199, 3: 36302, 0: 29299, 5: 23987, 6: 23895, 1: 20077, 9: 19814, 8: 18427, 4: 16221, 2: 14779})

構(gòu)建色彩分布圖像后,將其與色彩量化后的圖像連接在一起:

np.vstack((color_distribution, result))

程序的輸出如下所示:

從上圖可以看出,使用 K-Means 聚類算法應(yīng)用色彩量化后改變參數(shù) k (10、20、30、40、50、60 和 70) 的結(jié)果,k 值越大產(chǎn)生的圖像越逼真。

Note:除了 color_quantization() 函數(shù)外,由于其他代碼并未修改,因此不再另外給出。?

到此這篇關(guān)于Python+OpenCV實(shí)戰(zhàn)之利用 K-Means 聚類進(jìn)行色彩量化的文章就介紹到這了,更多相關(guān)OpenCV? K-Means 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Matplotlab顯示OpenCV讀取到的圖像

    Matplotlab顯示OpenCV讀取到的圖像

    本文介紹了如何使用OpenCV和Matplotlib處理圖像,本文通過(guò)實(shí)例講解的非常詳細(xì),對(duì)Matplotlab?OpenCV圖像相關(guān)處理方法感興趣的朋友一起看看吧
    2025-02-02
  • Python 裝飾器@,對(duì)函數(shù)進(jìn)行功能擴(kuò)展操作示例【開閉原則】

    Python 裝飾器@,對(duì)函數(shù)進(jìn)行功能擴(kuò)展操作示例【開閉原則】

    這篇文章主要介紹了Python 裝飾器@,對(duì)函數(shù)進(jìn)行功能擴(kuò)展操作,結(jié)合實(shí)例形式分析了裝飾器的相關(guān)使用技巧,以及開閉原則下的函數(shù)功能擴(kuò)展,需要的朋友可以參考下
    2019-10-10
  • Python內(nèi)置數(shù)據(jù)結(jié)構(gòu)列表與元組示例詳解

    Python內(nèi)置數(shù)據(jù)結(jié)構(gòu)列表與元組示例詳解

    這篇文章主要給大家介紹了關(guān)于Python內(nèi)置數(shù)據(jù)結(jié)構(gòu)列表與元組的相關(guān)資料,列表是順序存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu),類似于數(shù)據(jù)結(jié)構(gòu)中的順序表,在存儲(chǔ)上是相連的一大塊內(nèi)存空間,在物理和邏輯上都是連續(xù)的,需要的朋友可以參考下
    2021-08-08
  • pycharm配置安裝autopep8自動(dòng)規(guī)范代碼的實(shí)現(xiàn)

    pycharm配置安裝autopep8自動(dòng)規(guī)范代碼的實(shí)現(xiàn)

    這篇文章主要介紹了pycharm配置安裝autopep8自動(dòng)規(guī)范代碼的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Python雙版本計(jì)算器詳解

    Python雙版本計(jì)算器詳解

    這篇文章主要介紹了如何用Python制作計(jì)算器,文章中有兩個(gè)版本,代碼詳細(xì),適合絕大部分朋友,如果你對(duì)python如何制作計(jì)算器有興趣,可以參考下這篇文章
    2021-04-04
  • Python2和Python3中urllib庫(kù)中urlencode的使用注意事項(xiàng)

    Python2和Python3中urllib庫(kù)中urlencode的使用注意事項(xiàng)

    這篇文章主要介紹了Python2和Python3中urllib庫(kù)中urlencode的使用注意事項(xiàng),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-11-11
  • Keras Convolution1D與Convolution2D區(qū)別說(shuō)明

    Keras Convolution1D與Convolution2D區(qū)別說(shuō)明

    這篇文章主要介紹了Keras Convolution1D與Convolution2D區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-05-05
  • Pandas實(shí)現(xiàn)DataFrame的簡(jiǎn)單運(yùn)算、統(tǒng)計(jì)與排序

    Pandas實(shí)現(xiàn)DataFrame的簡(jiǎn)單運(yùn)算、統(tǒng)計(jì)與排序

    本文主要介紹了Pandas實(shí)現(xiàn)DataFrame的簡(jiǎn)單運(yùn)算、統(tǒng)計(jì)與排序,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-03-03
  • python 使用建議與技巧分享(四)

    python 使用建議與技巧分享(四)

    這篇文章主要介紹了python的一些使用建議與技巧分享,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-08-08
  • ubuntu中配置pyqt4環(huán)境教程

    ubuntu中配置pyqt4環(huán)境教程

    本文給大家分享的是在Ubuntu系統(tǒng)中配置pyqt4的詳細(xì)教程,有需要的小伙伴可以參考下
    2017-12-12

最新評(píng)論

永宁县| 昆明市| 井研县| 英山县| 阿坝县| 时尚| 汉源县| 岳阳市| 镇沅| 信丰县| 报价| 贺兰县| 通辽市| 龙井市| 双江| 清原| 阳江市| 师宗县| 射洪县| 天峨县| 鄂托克旗| 集安市| 鄱阳县| 民县| 北票市| 灌阳县| 德江县| 浙江省| 五常市| 普格县| 锡林郭勒盟| 文山县| 罗源县| 安乡县| 普安县| 延庆县| 乌海市| 随州市| 衡山县| 镇巴县| 新郑市|