基于颜色分割图像

时间:2018-02-11 19:32:49

标签: python-3.x opencv image-processing opencv3.0

enter image description here

enter image description here

我在应用具有簇= 3的k均值之后获得了图像。现在我想基于在k均值之后获得的颜色获得3个单独的图像。 例如,考虑附加图像。现在我需要 一个图像,使其仅包含蓝色方块。 一个有字母v,一个有背景 有没有办法用OpenCV和python做到这一点。

2 个答案:

答案 0 :(得分:1)

您可以通过计算图像的直方图来解决问题。 下图显示了图像的峰值。

plot

由此,您可以对颜色进行阈值处理。代码和结果:

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()

结果:

image1

image2

image3

答案 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