kmeans聚類實現(xiàn)灰度圖像色彩量化(使用更少灰度值表示原灰度圖像)
# coding: utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt
#讀取原始圖像灰度顏色
img = cv2.imread('d:/paojie_g.jpg', 0)
#print(img.shape)
#獲取圖像高度糕韧、寬度
rows, cols = img.shape[:]
#圖像二維像素轉(zhuǎn)換為一維
data = img.reshape((rows * cols))
data = np.float32(data)
#定義中心 (type,max_iter,epsilon)
criteria = (cv2.TERM_CRITERIA_EPS +
cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
#設(shè)置標簽
flags = cv2.KMEANS_RANDOM_CENTERS
#K-Means聚類 聚集成4類
compactness, labels, centers = cv2.kmeans(data, 4, None, criteria, 10, flags)
#生成最終圖像
res = centers[labels.flatten()]
dst = res.reshape((img.shape[0],img.shape[1]))
#用來正常顯示中文標簽
plt.rcParams['font.sans-serif']=['SimHei']
#顯示圖像
titles = [u'原始圖像', u'聚類圖像']
images = [img, dst]
for i in range(2):
plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray'),
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()
程序輸出結(jié)果
使用4種灰度值表示原圖像
kmeans聚類實現(xiàn)彩色圖像色彩量化(使用更少色彩值表示原彩色圖像)
# coding: utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt
#讀取原始圖像
img = cv2.imread('d:paojie.png')
print(img.shape)
#圖像二維像素轉(zhuǎn)換為一維
data = img.reshape((-1,3))
data = np.float32(data)
#定義中心 (type,max_iter,epsilon)
criteria = (cv2.TERM_CRITERIA_EPS +
cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
#設(shè)置標簽
flags = cv2.KMEANS_RANDOM_CENTERS
#K-Means聚類 聚集成2類
compactness, labels2, centers2 = cv2.kmeans(data, 2, None, criteria, 10, flags)
print('compactness:', compactness)
print('labels2.shape:', labels2.shape)
print('centers2.shape:', centers2.shape)
print('labels2:\n', labels2)
print('centers2:\n', centers2)
#K-Means聚類 聚集成4類
compactness, labels4, centers4 = cv2.kmeans(data, 4, None, criteria, 10, flags)
#K-Means聚類 聚集成8類
compactness, labels8, centers8 = cv2.kmeans(data, 8, None, criteria, 10, flags)
#K-Means聚類 聚集成16類
compactness, labels16, centers16 = cv2.kmeans(data, 16, None, criteria, 10, flags)
#K-Means聚類 聚集成64類
compactness, labels64, centers64 = cv2.kmeans(data, 64, None, criteria, 10, flags)
#圖像轉(zhuǎn)換回uint8二維類型
centers2 = np.uint8(centers2)
res = centers2[labels2.flatten()]
print('res:\n', res)
dst2 = res.reshape((img.shape))
centers4 = np.uint8(centers4)
res = centers4[labels4.flatten()]
dst4 = res.reshape((img.shape))
centers8 = np.uint8(centers8)
res = centers8[labels8.flatten()]
dst8 = res.reshape((img.shape))
centers16 = np.uint8(centers16)
res = centers16[labels16.flatten()]
dst16 = res.reshape((img.shape))
centers64 = np.uint8(centers64)
res = centers64[labels64.flatten()]
dst64 = res.reshape((img.shape))
#圖像轉(zhuǎn)換為RGB顯示
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
dst2 = cv2.cvtColor(dst2, cv2.COLOR_BGR2RGB)
dst4 = cv2.cvtColor(dst4, cv2.COLOR_BGR2RGB)
dst8 = cv2.cvtColor(dst8, cv2.COLOR_BGR2RGB)
dst16 = cv2.cvtColor(dst16, cv2.COLOR_BGR2RGB)
dst64 = cv2.cvtColor(dst64, cv2.COLOR_BGR2RGB)
#用來正常顯示中文標簽
plt.rcParams['font.sans-serif']=['SimHei']
#顯示圖像
titles = [u'原始圖像', u'聚類圖像 K=2', u'聚類圖像 K=4',
u'聚類圖像 K=8', u'聚類圖像 K=16', u'聚類圖像 K=64']
images = [img, dst2, dst4, dst8, dst16, dst64]
for i in range(6):
plt.subplot(2,3,i+1), plt.imshow(images[i], 'gray'),
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()
控制臺輸出
控制臺輸出內(nèi)容
量化結(jié)果輸出
彩色圖像色彩量化結(jié)果展示