python判断图片主颜色

一 、 问题:python判断图片主颜色

python判断图片主颜色(HSV)

二 、 项目背景:

app选项是否能被点击,判断执行逻辑。做自动化测试的朋友肯定遇到好多次,按钮属性无法判别时,就需要自己将app选项颜色进行判断。网上大多数方案:通过图片AI识别,识别精度再高也不能到达百分百。就会识别错误几个选项,导致大批量的测试失败几次。
决定用RGB值判断图片主颜色,结果发现颜色模型太复杂,太烧脑细胞,果断放弃。
在这里插入图片描述

三 、解决方案:

  • 我个人的方案就是用过app选项颜色RGB值判断,执行会百分百成功。RGB值对我们个人不太友好,值的范围也不好弄清楚,所以我采用让人更容易理解的HSV值去判断app选项的颜色。

    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
直接上代码

import colorsys
import PIL.Image as Image


# 获取图片主要颜色rgb值
def get_dominant_color(image):
    max_score = 0.0001
    dominant_color = None
    for count,(r,g,b) in image.getcolors(image.size[0]*image.size[1]):
    # 转为HSV标准
        saturation = colorsys.rgb_to_hsv(r/255.0, g/255.0, b/255.0)[1]
        y = min(abs(r*2104+g*4130+b*802+4096+131072)>>13,235)
        y = (y-16.0)/(235-16)

        #忽略高亮色
        if y > 0.9:
            continue
        score = (saturation+0.1)*count
        if score > max_score:
            max_score = score
            dominant_color = (r,g,b)
    return dominant_color


# 图片rgb值转为hsv
def rgb2hsv(r, g, b):
    r, g, b = r/255.0, g/255.0, b/255.0
    mx = max(r, g, b)
    mn = min(r, g, b)
    m = mx-mn
    if mx == mn:
        h = 0
    elif mx == r:
        if g >= b:
            h = ((g-b)/m)*60
        else:
            h = ((g-b)/m)*60 + 360
    elif mx == g:
        h = ((b-r)/m)*60 + 120
    elif mx == b:
        h = ((r-g)/m)*60 + 240
    if mx == 0:
        s = 0
    else:
        s = m/mx
    v = mx

    #此时h,s,v值范围分别是0-360, 0-1, 0-1,在OpenCV中,H,S,V范围是0-180,0-255,0-255,加上下面代码转换:
    H = h / 2
    S = s * 255.0
    V = v * 255.0

    return H,S,V
# # 返回值是255 100 100的范围
#     return h,s*100,v*100


def pan_duan_yan_se(h_0,s_0,v_0):
    if 0<=h_0<180 and 0<=s_0<255 and 0<=v_0<46 :
        print("黑色")
    elif 0<=h_0<180 and 0<=s_0<43 and 46<=v_0<220:
        print("灰色")
    elif 0<=h_0<180 and 0<=s_0<30 and 221<=v_0<255:
        print("白色")
    elif (0<=h_0<10 or 156<=h_0<180) and 43<=s_0<255 and 46<=v_0<255:
        print("红色")
    elif 11<=h_0<25 and 43<=s_0<255 and 16<=v_0<255:
        print("橙色")
    elif 26<=h_0<34 and 43<=s_0<255 and 46<=v_0<255:
        print("黄色")
    elif 35<=h_0<77 and 43<=s_0<255 and 46<=v_0<255:
        print("绿色")
    elif 78<=h_0<99 and 43<=s_0<255 and 46<=v_0<255:
        print("青色")
    elif 100<=h_0<124 and 43<=s_0<255 and 46<=v_0<255:
        print("蓝色")
    elif 125<=h_0<155 and 43<=s_0<255 and 46<=v_0<255:
        print("紫色")
    else:
        print("色调H超出范围,饱和度S,亮度V明度")




if __name__ == '__main__':
    image = Image.open(放自己图片保存路径)
    image = image.convert('RGB')
    
    print(get_dominant_color(image))
    print(type(get_dominant_color(image)))
    r, g, b = get_dominant_color(image)[0], get_dominant_color(image)[1], get_dominant_color(image)[2]
    hsv_value = rgb2hsv(r, g, b)
    print(hsv_value)
    h_0 = hsv_value[0]
    s_0 = hsv_value[1]
    v_0 = hsv_value[2]
    pan_duan_yan_se(h_0,s_0,v_0)
  • 在网上查了好多的资料,发现都转换为RGB值,然后就不好判断了,因为自己项目中要用,就赶快写一个HSV判断图片主颜色,这个方案仅供大家参考学习,如果有不当之处,请多多包含。修改其中的一些代码放在自己项目中,希望可以帮到小伙伴。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据采集及分析RPA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值