我實作了一種演算法,該演算法使用 opencv kmeans 來量化灰度影像中存在的唯一亮度值。量化唯一值有助于避免偏向通常都是相同值的影像背景。
然而,我很難找到一種方法來利用這些資料來量化給定的輸入影像。
我實作了一個非常幼稚的解決方案,但是對于所需的輸入大小(4000x4000)來說它非常慢:
for x in range(W):
for y in range(H):
center_id = np.argmin([(arr[y,x]-center)**2 for center in centers])
ret_labels2D[y,x] = sortorder.index(center_id)
ret_qimg[y,x] = centers[center_id]
基本上,我只是將每個像素調整到具有最小平方誤差的預定義級別。
有什么辦法可以更快地做到這一點?我試圖處理大小為 4000x4000 的影像,但此實作完全無法使用。
完整代碼:
def unique_quantize(arr, K, eps = 0.05, max_iter = 100, max_tries = 20):
"""@param arr: 2D numpy array of floats"""
H, W = arr.shape
unique_values = np.squeeze(np.unique(arr.copy()))
unique_values = np.array(unique_values, float)
if unique_values.ndim == 0:
unique_values = np.array([unique_values],float)
unique_values = np.ravel(unique_values)
unique_values = np.expand_dims(unique_values,1)
Z = unique_values.astype(np.float32)
criteria = (cv2.TERM_CRITERIA_EPS cv2.TERM_CRITERIA_MAX_ITER,max_iter,eps)
compactness, labels, centers = cv2.kmeans(Z,K,None,criteria,max_tries,cv2.KMEANS_RANDOM_CENTERS)
labels = np.ravel(np.squeeze(labels))
centers = np.ravel(np.squeeze(centers))
sortorder = list(np.argsort(centers)) # old index --> index to sortorder
ret_center = centers[sortorder]
ret_labels2D = np.zeros((H,W),int)
ret_qimg = np.zeros((H,W),float)
for x in range(W):
for y in range(H):
center_id = np.argmin([(arr[y,x]-center)**2 for center in centers])
ret_labels2D[y,x] = sortorder.index(center_id)
ret_qimg[y,x] = centers[center_id]
return ret_center, ret_labels2D, ret_qimg
編輯:我再次查看了輸入檔案。大小實際上是 12000x12000。
uj5u.com熱心網友回復:
由于您的影像是灰度影像(大概是 8 位),因此查找表將是一種有效的解決方案。一次將所有 256 個灰度級映射到最近的中心就足夠了,然后將其用作轉換表。即使是 16 位范圍(65536 個條目)也會顯著加速。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/519703.html
上一篇:函式如何知道回傳什么
