根据颜色分割图像

split image on the basis of color

我在应用 k-means 后获得了一个图像,簇 = 3。现在我想根据 k-means 后获得的颜色获得 3 个单独的图像。 例如,考虑附加的图像。现在我需要 一张图片,它只包含蓝色方块。 一个有字母 v,一个只有背景 有什么可能的方法可以使用 OpenCV 和 python.

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

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

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

结果:

最通用和最简单的方法是为每个区域使用三种独特的灰色。 (虽然我可以在上图中找到超过三个灰度级,可能是由于 imgur 压缩导致的变化。虽然,在一天结束时,k-means 应该正好给出三个 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_like(gray)
mask2[gray == c2] = 255

mask3 = np.zeros_like(gray)
mask3[mask3 == c3] = 255