簡體   English   中英

使用 OpenCV-Python 對灰度圖像進行姿態處理

[英]Posturizing grayscale image using OpenCV-Python

我試圖使用 opencv 在 python 中對圖像進行后處理,經過一段時間的搜索,我在openCV 文檔中找到了一個線索。 但是正如您所看到的 rgb 圖像,而我得到的是灰度圖像,無論如何我都這樣做了並得到了奇怪的輸出。 我調整了代碼中的一些地方,得到了更奇怪的輸出。 有人可以解釋一下發生了什么嗎?

編輯:

我的代碼

import numpy as np
import cv2

img = cv2.imread('Lenna.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

Z = np.float32(gray)

criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
K = 8
ret,label,center=cv2.kmeans(Z,K,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)

center = np.uint8(center)
res = center[label.flatten()]

cv2.imshow('res',res)
cv2.waitKey(0)
cv2.destroyAllWindows()

輸入圖像:

輸入

輸出圖像:

輸出

有人可以解釋一下發生了什么嗎?

Kmeans 輸入是向量的向量,或者在很多情況下,是像素向量或 2D/3D 點向量。 在您的代碼中,您正在傳遞一個圖像,它是一行中的值的向量。 這就是為什么你會得到這個奇怪的值。

你能做什么?

簡單,將輸入重塑為灰度值的一維向量。

Z = img.reshape((-1,1))

這樣,它會嘗試使用每個灰度值作為輸入來對它們進行聚類(分組),然后相應地標記每個值。

如果您在示例中進一步查看,您可以找到如下解決方案:

import numpy as np
import cv2

img = cv2.imread('Lenna.png')

Z = img.reshape((-1,3))

# convert to np.float32
Z = np.float32(Z)

# define criteria, number of clusters(K) and apply kmeans()
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
K = 8


ret,label,center=cv2.kmeans(Z,K,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)

# Now convert back into uint8, and make original image
center = np.uint8(center)
res = center[label.flatten()]
res2 = res.reshape((img.shape))

cv2.imshow('res2',res2)
cv2.waitKey(0)
cv2.destroyAllWindows()

請注意此處的重塑以考慮 RGB 圖像。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM