zoukankan      html  css  js  c++  java
  • 形状识别标签类-LAB空间

     1 #实现颜色识别与标记
     2 #实现原理:LAB颜色空间与欧几里得距离
     3 
     4 from scipy.spatial import distance as dist
     5 from collections import OrderedDict
     6 import numpy as np
     7 import cv2
     8 
     9 class ColorLabeler:
    10     def __init__(self):
    11         #初始化颜色词典
    12         colors = OrderedDict({
    13             "红色":(255, 0, 0),
    14             "绿色":(0, 255, 0),
    15             "蓝色":(0, 0, 255),
    16             "黑色":(0, 0, 0),
    17             "白色":(255, 255, 255) })
    18 
    19         #初始化属性(变量)
    20         #为lab图像分配空间
    21         #为颜色分配列表
    22         self.lab = np.zeros((len(colors), 1, 3), dtype="uint8")
    23         self.colorName =[]
    24 
    25         #枚举,以词典长度为循环次数-->更新数字阵列与色名列表
    26         #将rgb值赋予lab空间
    27         #将name变量的值一次次加入列表中(此处name还未分配值)
    28         for(i, (name, rgb)) in enumerate(colors.items()):
    29             self.lab[i] = rgb
    30             self.colorName.append(name)
    31 
    32         #颜色空间转换
    33         self.lab = cv2.cvtColor(self.lab,cv2.COLOR_RGB2LAB)
    34 # 为什么选择LAB空间?-->其中与欧几里得距离的关系帮助我们标记颜色
    35 
    36 # 将选择最小化欧几里德距离的已知颜色作为颜色标识。
    37     def label(self, image, c):
    38         #标志mask,绘制轮廓 shape属性用来查看图像结构,返回行和列
    39         mask = np.zeros(image.shape[:2], dtype="uint8")
    40         cv2.drawContours(mask, [c], -1, 255, -1)
    41         mask = cv2.erode(mask, None, iterations=2)#腐蚀
    42         mean = cv2.mean(image, mask=mask)[:3]#均值
    43 
    44         #初始化最小距离
    45         minDist = (np.inf, None)#np.inf表示无穷大的正数
    46 
    47         # 遍历已知的LAB颜色值
    48         for (i, row) in enumerate(self.lab):
    49             # 计算当前l*a*b*颜色值与图像平均值之间的距离
    50             d = dist.euclidean(row[0], mean)
    51 
    52             # 如果当前的距离小于最小的距离,则进行变量更新
    53             if d < minDist[0]:
    54                 minDist = (d, i)
    55 
    56         # 返回最小距离对应的颜色值
    57         return self.colorNames[minDist[1]]

     效果图:

  • 相关阅读:
    Mysql 解压安装
    线程进程池,协程,IO模型
    并发编程 线程
    并发编程 进程
    socket 套接字
    网络编程
    面向对象(反射,元类) 排序方法
    面向对象(多态,类方法,魔法方法)
    Day22 面向对象(继承封装)
    php一行代码获取本周一,本周日,上周一,上周日,本月一日,本月最后一日,上月一日,上月最后一日日期 转
  • 原文地址:https://www.cnblogs.com/isadoraytwwt/p/15024097.html
Copyright © 2011-2022 走看看