我在应用具有簇= 3的k均值之后获得了图像。现在我想基于在k均值之后获得的颜色获得3个单独的图像。 例如,考虑附加图像。现在我需要 一个图像,使其仅包含蓝色方块。 一个有字母v,一个有背景 有没有办法用OpenCV和python做到这一点。
答案 0 :(得分:1)
您可以通过计算图像的直方图来解决问题。 下图显示了图像的峰值。
由此,您可以对颜色进行阈值处理。代码和结果:
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread("inputs/hist.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
hist = cv2.calcHist([gray],[0],None,[256],[0,256])
colors = np.where(hist>5000)
img_number = 0
for color in colors[0]:
print(color)
split_image = img.copy()
split_image[np.where(gray != color)] = 0
cv2.imwrite(str(img_number)+".jpg",split_image)
img_number+=1
plt.hist(gray.ravel(),256,[0,256])
plt.savefig('plt')
plt.show()
结果:
答案 1 :(得分:1)
最常用也是最简单的方法是为每个区域使用三种独特的灰色(虽然我可以在上面的图像中找到三个以上的灰度级,可能是由于imgur压缩造成的变化。虽然,在一天结束时,kmeans应该给出确切的三个BGR值)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
unique = np.unique(gray)
c1, c2, c3 = unique[0], unique[1], unique[2]
mask1 = np.zeros_like(gray)
mask1[gray == c1] = 255
mask2 = np.zeros_list(gray)
mask2[gray == c2] = 255
mask3 = np.zeros_list(gray)
mask3[mask3 == c3] = 255