opencv 如何从颜色字典中获取最接近的相似颜色

hgqdbh6s  于 2023-04-21  发布在  其他
关注(0)|答案(2)|浏览(140)

我写了一个程序来识别文件中的颜色,并打印出给定颜色的名称,文件的颜色与之具有最高的相似性。我使用HSV来获取颜色范围,并将HSV与此范围进行比较以获得最相似的颜色。我试图迭代颜色字典以将它们与我传递的文件的HSV进行比较。然而,它不起作用并显示任何错误。

from pickletools import uint8
import cv2
from matplotlib import image
import numpy as np
#HSV Hue - color, Saturation - color density, Value - brightness of color. 
#use lower and upper value of a color to define range where picture will fit.
#opencv's HSV values are H(0-179)S(0-255)V(0-255)

img = cv2.imread('purple.jpg', cv2.COLOR_BGR2HSV)
#colors 
color_list= {
    "white":([0,0,50],[0,0,255]),
    "black":([0,0,0],[0,0,49]),
    "red":([0,0,225],[127,0,255]),
    "green":([40,40,40],[70,255,255]),
    "yellow":([23,41,223],[40,150,255]),
    "blue":([78,158,124],[138,255,255])
}

#get image 
img = cv2.imread('purple.jpg')
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

for color_name, (lower, upper) in color_list.items():
    lower = np.array(lower, dtype = np.uint8)
    upper = np.array(upper, dtype = np.uint8)

    mask = cv2.inRange(img,lower,upper)
    output = cv2.bitwise_and(img,img, mask = mask)

    if mask.any():
        print(f"{color_name} :{mask.sum}")
ntjbwcob

ntjbwcob1#

您的想法是正确的,但是您需要找到每个颜色范围的白色像素数,而不是对mask中的像素求和
这里有一个简单的方法。

  • 对于字典中的每种颜色,获取mask
  • mask是一个二进制图像(白色图像),其值为0(黑色)和255(白色)。白色像素表示它包含指定范围内的颜色。
  • 对于每个颜色范围,计算mask中存在的白色像素的数量。如果图像的范围具有最多的白色像素,则图像具有相应的颜色。
    附加码:
final_color = None
final_count = None

for color_name, (lower, upper) in color_list.items():
  mask = cv2.inRange(hsv, tuple(lower), tuple(upper))

  # count non-zero pixels in mask
  count=np.count_nonzero(mask)
  
  if count > 0:
    final_count = count
    final_color = color_name
    

print("Nearest Color is {}".format(final_color))
wz1wpwve

wz1wpwve2#

你需要调用cv2.cvtColor()方法,如下所示:

import cv2

img = cv2.cvtColor(cv2.imread('purple.jpg'), cv2.COLOR_BGR2HSV)

相关问题