首页 > 解决方案 > 我试图找出背景是彩色的还是单色的

问题描述

我试图找出背景是彩色的还是单色的

我正在将前景中的对象设为黑色我找不到确定背景是彩色还是单色的方法

输入图像 正常

import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('d2.jpg')
height = np.size(img, 0)
width = np.size(img, 1)
mask = np.zeros(img.shape[:2], np.uint8)
bgdModel = np.zeros((1, 65), np.float64)
fgdModel = np.zeros((1, 65), np.float64)
rect = (0, 7, width, height)
cv2.grabCut(img, mask, rect, bgdModel, fgdModel, 5, 
cv2.GC_INIT_WITH_RECT)
mask2 = np.where((mask == 0) | (mask == 3), 0, 1).astype('uint8')
img = img*mask2[:, :, np.newaxis]
#plt.imshow(img), plt.axis("off"), plt.show()

newmask = cv2.imread('yenimaske.png', 0)

mask[newmask == 0] = 0
mask[newmask == 255] = 1

mask, bgdModel, fgdModel = cv2.grabCut(img, mask, None, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_MASK)
mask = np.where((mask == 0) | (mask == 3), 0, 1).astype('uint8')
img = img*mask[:, :, np.newaxis]

plt.imshow(img), plt.axis("off"),  plt.show()

输出图像

标签: pythonopencvimage-processingcolorscomputer-vision

解决方案


首先,您的代码有几个问题:

  1. 您的 ROI ( rect) 比图像大,只有前 7 行用作背景。您可以考虑定义更精确的 ROI,或者改用 GC_EVAL 模式
  2. 您正在提取前景而不是背景:

    mask = np.where((mask == 3) | (mask == 1), 0, 1).astype('uint8') img = img*mask[:, :, np.newaxis]

  3. 您对图像的颜色感兴趣,但您将图像加载为黑白

    resim = cv2.imread("histogram.jpg", 0)

由于您只对饱和度(以像素为单位的“颜色”量)真正感兴趣,因此您应该将图像从 BGR 颜色空间转换为 HSV 空间并创建饱和度通道的直方图。您实际上可能不需要直方图,并且可以使用简单的阈值:

img = img*mask[:, :, np.newaxis]
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
saturation_threshold = 20 # try different thresholds to see which value works for you
ratio = numpy.count_nonzero(hsv[:,:,1] > saturation_threshold ) / numpy.count_nonzero(mask)

ratio将是非灰度的像素数


推荐阅读