Python OpenCV应用K均值聚类进行颜色量化
Python OpenCV應用K均值聚類進行顏色量化
- 1. 效果圖
- 2. 顏色量化是什么?
- 3. MiniBatchKMeans & KMeans
- 4. 源碼
- 參考
在這篇博客文章中,我將向您展示如何使用K-means聚類和顏色量化在圖像中創建“ A Scanner Darkly”效果。
1. 效果圖
左側原始圖像,右側顏色量化圖像
可以看到 k= 12 基本可以跟原始圖像一致;
隨著量化聚類數量的增加,我們能夠更好地模仿原始色彩空間。
在聚簇數和量化圖像的質量之間存在明顯的權衡。類似于時間換空間,空間換時間;
(1)隨著聚簇數量的增加,執行聚簇所需的時間也隨之增加。
(2)隨著聚簇數量的增加,存儲輸出圖像所需的內存量也隨之增加。但是,在兩種情況下,由于您使用的調色板要小得多,因此內存占用量仍將小于原始圖像。
2. 顏色量化是什么?
顏色量化(Color Quantization)是減少圖像中不同顏色數量的過程。通常,目的是盡可能保留圖像的顏色外觀,同時減少顏色數量,無論是用于內存限制還是壓縮。
在我自己的工作中,我發現在構建基于內容的圖像檢索(CBIR)系統,即“圖像搜索引擎”時,最好使用色彩量化。
任何給定的24位RGB圖像都有256 x 256 x 256種可能的顏色,我們可以基于這些強度值構建標準的顏色直方圖;也可以顯式量化圖像并減少顏色的數量,例如16或64。這會產生明顯較小的空間,并且會減少噪聲和差異。
我們可以使用顏色量化構造更嚴格的顏色直方圖,也可以利用二次距離中的量化顏色直方圖來計算相似度。
3. MiniBatchKMeans & KMeans
MiniBatchKMeans的速度明顯快于普通K均值,盡管質心可能不那么穩定。這是因為MiniBatchKMeans在數據集的較小“批次”上進行操作,而K-Means在數據集的總體上進行操作,因此使每個質心以及質心更新循環的平均值計算要慢得多。
通常,可以從MiniBatchKMeans開始,如果(且僅當)結果不佳時,再切換到普通K-Means。
4. 源碼
# USAGE
# python quant.py --image images/cactus.jpg --clusters 10import argparse # 命令行參數解析import cv2
# 導入必要的類
from sklearn.cluster import MiniBatchKMeans # K-Means實現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)# 構建命令行參數及解析
# --image 原始圖像
# --cluster 輸出圖像將要具有的顏色數
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]# 轉換圖像空間 BGR--> LAB顏色空間
# 為什么轉換呢? 因為在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))# 根據預先設置的期望顏色數,應用MiniBatchKMeans算法聚類
# 真正執行聚類操作
# 基于預測結果來生成量化圖像
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))# 轉換顏色空間 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均值聚类进行颜色量化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一个qq网名男生搞笑!
- 下一篇: 撒野广播剧封面是谁画的啊?