python - 我试图找出背景是彩色的还是单色的
问题描述
我试图找出背景是彩色的还是单色的
我正在将前景中的对象设为黑色我找不到确定背景是彩色还是单色的方法
输入图像 正常
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()
解决方案
首先,您的代码有几个问题:
- 您的 ROI (
rect
) 比图像大,只有前 7 行用作背景。您可以考虑定义更精确的 ROI,或者改用 GC_EVAL 模式 您正在提取前景而不是背景:
mask = np.where((mask == 3) | (mask == 1), 0, 1).astype('uint8') img = img*mask[:, :, np.newaxis]
您对图像的颜色感兴趣,但您将图像加载为黑白
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
将是非灰度的像素数
推荐阅读
- c# - 在单个 DataGridView 中显示来自相关表的数据
- azure - 如何在 Azure CLI 命令的 az vm 扩展中使用动态变量
- visual-studio-code - VS Code Emmet - 不使用选项卡
- security - 桌面应用程序凭证存储的最佳实践?
- postgresql - Apache Ignite 与 Posgresql
- node.js - 阐明 neo4j 和 neo4j-driver 的不同行为
- anylogic - 该函数停止创建代理
- php - 用于实时视频流的 PHP + cURL(cURL 可以处理无限数据吗?)
- c# - 回发后如何保持下拉选择相同
- translation - wagtail StreamField 块名称翻译问题