根据饱和度值和图像数字数组中的值计算颜色可见性

2024-04-26 18:54:03 发布

您现在位置:Python中文网/ 问答频道 /正文

为了一个有趣的项目,我想分析一些图像,特别是哪些颜色(色调)比其他颜色更明显。因为我想考虑颜色的“可见性”,仅仅计算像素的色调是不够的(例如,完美的黑色在其色调为0°时就等于红色)。我想出了一个对我的项目来说足够好的公式。在

目前我做以下工作:

  • 使用opencv读取图像(结果为BGR numpy数组)
  • 将图像转换为HSV
  • 对于每个像素,计算其色调的可见性(根据饱和度和值),并将其相加为色调的dict。在

公式是color_visibility = sqrt(saturation * value)。因此,一个完整的红色RGB=255,0,0; HSV=0,1,1将产生{},而例如浅红色RGB=255,128,128; HSV=0,0.5,1将产生{}。在

以下是我使用的(完整工作)代码:

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循环,如何计算公式?也许直接和纽比在一起?在


Tags: 项目in图像imageimportnumpy颜色像素
1条回答
网友
1楼 · 发布于 2024-04-26 18:54:03

您要寻找的魔力在^{}中,因为它相当直接地将h值转换为循环版本-

H,S,V = pixels.T
d_arr = np.bincount(H, ((S/255.0) * (V/255.0))**0.5 )

请注意,结果数组的元素的值计数可能为零

相关问题 更多 >