繁体   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