为了一个有趣的项目,我想分析一些图像,特别是哪些颜色(色调)比其他颜色更明显。因为我想考虑颜色的“可见性”,仅仅计算像素的色调是不够的(例如,完美的黑色将算作红色,因为它的色调是0°)。我想出了一个公式,这是海事组织足够好,我的项目。
目前我做以下工作:
- 使用opencv读取图像(结果为BGR numpy数组)
- 将图像转换为HSV
- 对于每个像素,计算其色调的可见性(从饱和度和值),并在色调的字典中求和。
公式为color_visibility = sqrt(saturation * value)
,因此全红色的RGB=255,0,0; HSV=0,1,1
将得到1
,而例如浅红色的RGB=255,128,128; HSV=0,0.5,1
将得到0.70
。
下面是我使用的(完整工作)代码:
import urllib
import cv2
import numpy as np
url = 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/02/Leuchtturm_in_Westerheversand_crop.jpg/299px-Leuchtturm_in_Westerheversand_crop.jpg'
image = np.asarray(bytearray(urllib.urlopen(url).read()), dtype="uint8")
image = cv2.imdecode(image, cv2.IMREAD_COLOR)
d = {}
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
pixels = hsv.reshape((hsv.shape[0] * hsv.shape[1], 3))
for h,s,v in pixels:
d[h] = d.get(h, 0.) + (s/255. * v/255.) ** 0.5
正如您可能猜到的那样,当图像像素较多时,代码会变得非常慢。
我的问题是,如果没有dict和for循环,我怎么计算公式呢?也许直接用numpy?
1条答案
按热度按时间v7pvogib1#
您正在寻找的神奇之处在于
np.bincount
,因为它非常直接地转换为使用h
值作为bin的循环版本-请注意,结果数组中的元素计数可能为零