我想做一种从白色到黄色的色度计。
我将尝试更好地解释,但由于我是Python和图像处理的新手,如果我说错了什么,请纠正我。
我使用HSV colorspace,因为我读到它可以更好地表示三个分量(色调,饱和度和值)的颜色特征。假设我有一个带有一些白色阴影的图像,程序应该能够根据像素的色调,饱和度和图像的值来计算一个值,就好像我提供了一个略微白色到黄色阴影的图像,它应该给出类似的值。
以下是image of sugar crystals的一个示例。当忽略紫色的背景时,糖有白色和黄色的阴影。
我的第一个尝试是计算一个几乎全白的图像的直方图并将其作为参考,然后计算另一个图像的直方图并比较它们是否相似。它越黄,它应该越不相似,请记住,单个图像可以同时具有白色和黄色像素,甚至可以在色调直方图中具有一系列不同的黄色阴影):
import numpy as np
import cv2
from matplotlib import pyplot as plt
image = cv2.imread("C:\...\im1.png")
image2 = cv2.imread("C:\...\im2.png")
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
hsv_image2 = cv2.cvtColor(image2, cv2.COLOR_BGR2HSV)
hue_hist = cv2.calcHist([hsv_image], [0], None, [180], [0, 180])
sat_hist = cv2.calcHist([hsv_image], [1], None, [256], [0, 256])
val_hist = cv2.calcHist([hsv_image], [2], None, [256], [0, 256])
hue_hist2 = cv2.calcHist([hsv_image2], [0], None, [180], [0, 180])
sat_hist2 = cv2.calcHist([hsv_image2], [1], None, [256], [0, 256])
val_hist2 = cv2.calcHist([hsv_image2], [2], None, [256], [0, 256])
dh = cv2.compareHist(hue_hist, hue_hist2, cv2.cv.CV_COMP_CORREL)
ds = cv2.compareHist(sat_hist, sat_hist2, cv2.cv.CV_COMP_CORREL)
dv = cv2.compareHist(val_hist, val_hist2, cv2.cv.CV_COMP_CORREL)
在那之后,我会有这三个单独的值来表示直方图在色调,饱和度和值上的相似性,然后我可以尝试一些数学模型,以便为dh,ds,dv的每个组合获得一些y分数值。
问题是,如果你比较黄色像素图像的色调直方图,相关性比较将表明它们完全不同,即使它们可能被解释为相似,因为白色到黄色的色调略有变化。我需要一些东西,它不仅依赖于直方图上像素的频率,还依赖于色调值的接近程度。
我想的另一个解决方案是计算直方图的加权平均值,这样即使比较一张图像和一张像素峰值为30色调的图像和另一张像素峰值为25色调的图像(它们彼此之间不会完全分开),我也可以对相似的分布有一个更接近的值。我还没试过这个呢。
你知道是否有更好的方法来实现这一点,或者至少我是在正确的方式上做这样的应用程序吗?
发布于 2017-03-09 02:19:11
要获得图像的“黄色度”,首先要获取色调。然后将其划分为扇区,在180-300-60 (C-M-Y)处切割。60到180之间的任何值都是黄色和青色的线性组合;60到300之间的任何值都是黄色和洋红色的线性组合。160到300之间的任何值都将具有黄色值0。将线性组合转换为0-100%黄色。将该值称为y
。
要获得白色“白度”,请使用饱和度。S=0是100%白色,S=30是70%白色。将该值称为w
。
然后你可以做类似这样的事情
yellowness = y / (y + w)
whiteness = w / (y + w)
发布于 2017-03-09 09:25:02
我不会使用HSV空间,因为白色的色调是不确定的(因为噪声,你可以得到任何值)。
我会首先观察像素在RGB空间中的扩散。(但您没有提供任何示例图像。)
https://stackoverflow.com/questions/42680312
复制