【问题标题】:split image on the basis of color根据颜色分割图像
【发布时间】:2018-07-21 23:30:35
【问题描述】:

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

【问题讨论】:

  • 所以再做 2 个克隆。合而为一,把所有不是白色的东西都做成黑色的,然后保存。在另一种情况下,制作所有不是蓝色、黑色等的东西。
  • @MarkSetchell 这只是一个示例图像,我不知道我会收到什么颜色
  • 好的,选择随机像素直到你有 3 种不同的像素,或者从左上角开始迭代直到你有 3 种不同的颜色。
  • 你能再发几张图片进行测试
  • 你不能使用标签图像而不是量化颜色的图像吗?这样可以避免对颜色进行“逆向工程”。

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


【解决方案1】:

最通用和最简单的方法是为每个区域使用三种独特的灰色。 (虽然我可以在上面的图像中找到三个以上的灰度级,可能是由于 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

【讨论】:

    【解决方案2】:

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

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

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

    结果:

    【讨论】:

    • 当两种或更多颜色具有相同的亮度时,这将失败。
    • @YvesDaoust 我们可以使用 HSV 颜色空间来解决问题吗?
    • 无需切换到 HSV。保持RGB。 (事实上​​,使用标签图像会好得多。)
    猜你喜欢
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多