我想將圖像上的顏色聚類到預定義的類(黑色,白色,藍色,綠色,紅色)。我正在使用以下代碼:使用K-最近的方法來聚集顏色
import numpy as np
import cv2
src = cv2.imread('objects.png')
colors = np.array([[0x00, 0x00, 0x00],
[0xff, 0xff, 0xff],
[0xff, 0x00, 0x00],
[0x00, 0xff, 0x00],
[0x00, 0x00, 0xff]], dtype=np.float32)
classes = np.array([[0], [1], [2], [3], [4]], np.float32)
dst = np.zeros(src.shape, np.float32)
knn = cv2.KNearest()
knn.train(colors, classes)
# This loop is very inefficient!
for i in range(0, src.shape[0]):
for j in range(0, src.shape[1]):
sample = np.reshape(src[i,j], (-1,3)).astype(np.float32)
retval, result, neighbors, dist = knn.find_nearest(sample, 1)
dst[i,j] = colors[result[0,0]]
cv2.imshow('src', src)
cv2.imshow('dst', dst)
cv2.waitKey()
該代碼運行良好,結果如下所示。左側的圖像是輸入,右側的圖像是輸出。
然而上面的循環是非常低效的,使轉換慢。什麼是最有效的Numpy操作來取代上面的循環?
後者建議也將讓你的所有0xff的8個色組合和0,(爲0xFF,0xFF時,0),不只是你指定的五個等。 – mdurant