日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Python OpenCV应用K均值聚类进行颜色量化

發(fā)布時間:2023/11/27 生活经验 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python OpenCV应用K均值聚类进行颜色量化 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Python OpenCV應用K均值聚類進行顏色量化

    • 1. 效果圖
    • 2. 顏色量化是什么?
    • 3. MiniBatchKMeans & KMeans
    • 4. 源碼
    • 參考

在這篇博客文章中,我將向您展示如何使用K-means聚類和顏色量化在圖像中創(chuàng)建“ A Scanner Darkly”效果。

1. 效果圖

左側原始圖像,右側顏色量化圖像

可以看到 k= 12 基本可以跟原始圖像一致;

隨著量化聚類數(shù)量的增加,我們能夠更好地模仿原始色彩空間。

在聚簇數(shù)和量化圖像的質(zhì)量之間存在明顯的權衡。類似于時間換空間,空間換時間;
(1)隨著聚簇數(shù)量的增加,執(zhí)行聚簇所需的時間也隨之增加。
(2)隨著聚簇數(shù)量的增加,存儲輸出圖像所需的內(nèi)存量也隨之增加。但是,在兩種情況下,由于您使用的調(diào)色板要小得多,因此內(nèi)存占用量仍將小于原始圖像。

2. 顏色量化是什么?

顏色量化(Color Quantization)是減少圖像中不同顏色數(shù)量的過程。通常,目的是盡可能保留圖像的顏色外觀,同時減少顏色數(shù)量,無論是用于內(nèi)存限制還是壓縮。

在我自己的工作中,我發(fā)現(xiàn)在構建基于內(nèi)容的圖像檢索(CBIR)系統(tǒng),即“圖像搜索引擎”時,最好使用色彩量化。

任何給定的24位RGB圖像都有256 x 256 x 256種可能的顏色,我們可以基于這些強度值構建標準的顏色直方圖;也可以顯式量化圖像并減少顏色的數(shù)量,例如16或64。這會產(chǎn)生明顯較小的空間,并且會減少噪聲和差異。

我們可以使用顏色量化構造更嚴格的顏色直方圖,也可以利用二次距離中的量化顏色直方圖來計算相似度。

3. MiniBatchKMeans & KMeans

MiniBatchKMeans的速度明顯快于普通K均值,盡管質(zhì)心可能不那么穩(wěn)定。這是因為MiniBatchKMeans在數(shù)據(jù)集的較小“批次”上進行操作,而K-Means在數(shù)據(jù)集的總體上進行操作,因此使每個質(zhì)心以及質(zhì)心更新循環(huán)的平均值計算要慢得多。

通常,可以從MiniBatchKMeans開始,如果(且僅當)結果不佳時,再切換到普通K-Means。

4. 源碼

# USAGE
# python quant.py --image images/cactus.jpg --clusters 10import argparse  # 命令行參數(shù)解析import cv2
# 導入必要的類
from sklearn.cluster import MiniBatchKMeans  # K-Means實現(xiàn)def show_image(title, image, width=300):# resize圖像以使得圖像具有固定的大小,以便整個屏幕都可以展示r = width / float(image.shape[1])dim = (width, int(image.shape[0] * r))resized = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)# 展示縮放后的圖像cv2.imshow(title, resized)# 構建命令行參數(shù)及解析
# --image 原始圖像
# --cluster 輸出圖像將要具有的顏色數(shù)
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="Path to the image")
ap.add_argument("-c", "--clusters", required=True, type=int,help="# of clusters")
args = vars(ap.parse_args())# 加載圖像獲取寬度和高度
image = cv2.imread(args["image"])
(h, w) = image.shape[:2]# 轉(zhuǎn)換圖像空間 BGR--> LAB顏色空間
# 為什么轉(zhuǎn)換呢? 因為在L * a * b 顏色空間中,顏色之間的歐幾里德距離具有實際的感知意義-RGB顏色空間不是這種情況
# 鑒于k均值聚類也假設了一個歐式空間,因此最好使用L * a * b *而不是RGB;
image = cv2.cvtColor(image, cv2.COLOR_BGR2LAB)# 為了聚類像素強度,reshape圖像為(M*N,3)特征向量
image = image.reshape((image.shape[0] * image.shape[1], 3))# 根據(jù)預先設置的期望顏色數(shù),應用MiniBatchKMeans算法聚類
# 真正執(zhí)行聚類操作
# 基于預測結果來生成量化圖像
clt = MiniBatchKMeans(n_clusters=args["clusters"])
labels = clt.fit_predict(image)
quant = clt.cluster_centers_.astype("uint8")[labels]# 將特征向量重塑為圖像
quant = quant.reshape((h, w, 3))
image = image.reshape((h, w, 3))# 轉(zhuǎn)換顏色空間 L*a*b* ---> RGB
quant = cv2.cvtColor(quant, cv2.COLOR_LAB2BGR)
image = cv2.cvtColor(image, cv2.COLOR_LAB2BGR)# 展示圖像
show_image("origin", image, 300)
show_image("quant", quant, 300)
cv2.waitKey(0)

參考

  • https://www.pyimagesearch.com/2014/07/07/color-quantization-opencv-using-k-means-clustering/

總結

以上是生活随笔為你收集整理的Python OpenCV应用K均值聚类进行颜色量化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。