使用 OpenCV 对灰度图像进行姿态处理-Python
Posturizing grayscale image using OpenCV-Python
我试图使用 opencv 对 python 中的图像进行分色,经过一段时间的搜索后,我在 openCV documentations 中找到了线索。但是正如您所见,它是 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()
输入图像:
输出图像:
如果您进一步查看示例,您可以找到如下解决方案:
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 图像。
Can someone please explain whats going on ?
Kmeans 输入是向量的向量,或者在很多情况下,是像素的向量或 2D/3D 点的向量。在您的代码中,您传递了一个图像,它是一行中值的向量。这就是为什么你会得到这个奇怪的值。
你能做什么?
很简单,将输入重塑为灰度值的一维向量。
Z = img.reshape((-1,1))
这样,它会尝试使用每个灰度值作为输入来对它们进行聚类(分组),然后相应地标记每个值。
我试图使用 opencv 对 python 中的图像进行分色,经过一段时间的搜索后,我在 openCV documentations 中找到了线索。但是正如您所见,它是 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()
输入图像:
输出图像:
如果您进一步查看示例,您可以找到如下解决方案:
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 图像。
Can someone please explain whats going on ?
Kmeans 输入是向量的向量,或者在很多情况下,是像素的向量或 2D/3D 点的向量。在您的代码中,您传递了一个图像,它是一行中值的向量。这就是为什么你会得到这个奇怪的值。
你能做什么?
很简单,将输入重塑为灰度值的一维向量。
Z = img.reshape((-1,1))
这样,它会尝试使用每个灰度值作为输入来对它们进行聚类(分组),然后相应地标记每个值。