所有分类
主题 主题
平台 平台
我的工作台
userHead
注册时间 [[userInfo.create_time]]
创造力 [[userInfo.creativity]]
[[userInfo.remark]]
[[d.project_title]]
articleThumb
[[d.material_name]]
timelineThumb
进入工作台
折叠
所有分类 我的工作台
展开

【花雕测评】【AI】MaixPy机器视觉与Color识别的8个尝试

驴友花雕 驴友花雕 2021-10-26 19:20:31

【花雕测评】【AI】尝试搭建Maixduino几种开发环境
https://makelog.dfrobot.com.cn/article-311383.html
【花雕测评】【AI】MaixPy基本使用、显示文字及摄像机的22个小项目
https://makelog.dfrobot.com.cn/article-311389.html
【花雕测评】【AI】Mind+图片文字显示、呼吸灯和网络应用的22项小实验
https://makelog.dfrobot.com.cn/article-311386.html
【花雕测评】【AI】MaixPy机器视觉与Color识别的8个尝试
https://makelog.dfrobot.com.cn/article-311393.html
【花雕测评】【AI】Mind+机器视觉之数字图像处理和显示的22种小测试
https://makelog.dfrobot.com.cn/article-311405.html
【花雕测评】【AI】MaixPy之神经网络KPU与人脸识别的初步体验
https://makelog.dfrobot.com.cn/article-311400.html
【花雕测评】【AI】Mind+机器视觉之颜色、维码与形状识别的8个小实验
https://makelog.dfrobot.com.cn/article-311417.html

 

机器视觉(machine vision)
是人工智能正在快速发展的一个分支。简单说来,机器视觉就是用机器代替人眼来做测量和判断。机器视觉系统是通过机器视觉产品(即图像摄取装置,分CMOS和CCD两种)将被摄取目标转换成图像信号,传送给专用的图像处理系统,得到被摄目标的形态信息,根据像素分布和亮度、颜色等信息,转变成数字化信号;图像系统对这些信号进行各种运算来抽取目标的特征,进而根据判别的结果来控制现场的设备动作。

projectImage

什么是机器视觉?
简单来说,机器视觉就是用机器代替人眼来做测量和判断。机器视觉系统是通过机器视觉产品将被摄取目标转换成图像信号,传送给专用的图像处理系统,得到被摄目标的形态信息,根据像素分布和亮度、颜色等信息,转变成数字化信号;图像系统对这些信号进行各种运算来抽取目标的特征,进而根据判别的结果来控制现场的设备动作。机器视觉是一项综合技术,包括图像处理、机械工程技术、控制、电光源照明、光学成像、传感器、模拟与数字视频技术、计算机软硬件技术(图像增强和分析算法、图像卡、 I/O卡等)。一个典型的机器视觉应用系统包括图像捕捉、光源系统、图像数字化模块、数字图像处理模块、智能判断决策模块和机械控制执行模块。

机器视觉系统最基本的特点就是提高生产的灵活性和自动化程度。在一些不适于人工作业的危险工作环境或者人工视觉难以满足要求的场合,常用机器视觉来替代人工视觉。同时,在大批量重复性工业生产过程中,用机器视觉检测方法可以大大提高生产的效率和自动化程度。

projectImage

计算机视觉系统
计算机视觉系统的结构形式很大程度上依赖于其具体应用方向。有些是独立工作的,用于解决具体的测量或检测问题;也有些作为某个大型复杂系统的组成部分出现,比如和机械控制系统,数据库系统,人机接口设备协同工作。计算机视觉系统的具体实现方法同时也由其功能决定——是预先固定的抑或是在运行过程中自动学习调整。尽管如此,有些功能却几乎是每个计算机系统都需要具备的:

1、图像获取:一幅数字图像是由一个或多个图像传感器产生,这里的传感器可以是各种光敏摄像机,包括遥感设备,X射线断层摄影仪,雷达,超声波接收器等。取决于不同的传感器,产生的图片可以是普通的二维图像,三维图组或者一个图像序列。图片的像素值往往对应于光在一个或多个光谱段上的强度(灰度图或彩色图),但也可以是相关的各种物理数据,如声波,电磁波或核磁共振的深度,吸收度或反射度。
2、预处理:在对图像实施具体的计算机视觉方法来提取某种特定的信息前,一种或一些预处理往往被采用来使图像满足后继方法的要求。例如:
二次取样保证图像坐标的正确
平滑去噪来滤除传感器引入的设备噪声
提高对比度来保证实现相关信息可以被检测到
调整尺度空间使图像结构适合局部应用
3、特征提取:从图像中提取各种复杂度的特征。例如:
线、边缘提取和脊侦测
局部化的特征点检测如边角检测、斑点检测
更复杂的特征可能与图像中的纹理形状或运动有关。
4、检测/分割:在图像处理过程中,有时会需要对图像进行分割来提取有价值的用于后继处理的部分,例如:
筛选特征点
分割一或多幅图片中含有特定目标的部分
5、高级处理:到了这一步,数据往往具有很小的数量,例如图像中经先前处理被认为含有目标物体的部分。这时的处理包括:
验证得到的数据是否符合前提要求
估测特定系数,比如目标的姿态、体积
对目标进行分类

projectImage

数字图像处理(DigitalImageProcessing)
又称为计算机图像处理,它是指将图像信号转换成数字信号并利用计算机对其进行处理的过程。通过计算机对图像进行去除噪声、增强、复原、分割、提取特征等处理的方法和技术。 数字图像处理的产生和迅速发展主要受三个因素的影响:一是计算机的发展;二是数学的发展(特别是离散数学理论的创立和完善);三是广泛的农牧业、林业、环境、军事、工业和医学等方面的应用需求的增长。

projectImage

数字图像处理常用方法有以下几个方面:
1)图像变换:由于图像阵列很大,直接在空间域中进行处理,涉及计算量很大。因此,往往采用各种图像变换的方法,如傅立叶变换、沃尔什变换、离散余弦变换等间接处理技术,将空间域的处理转换为变换域处理,不仅可减少计算量,而且可获得更有效的处理(如傅立叶变换可在频域中进行数字滤波处理)。新兴研究的小波变换在时域和频域中都具有良好的局部化特性,它在图像处理中也有着广泛而有效的应用。
2 )图像编码压缩:图像编码压缩技术可减少描述图像的数据量(即比特数),以便节省图像传输、处理时间和减少所占用的存储器容量。压缩可以在不失真的前提下获得,也可以在允许的失真条件下进行。编码是压缩技术中最重要的方法,它在图像处理技术中是发展最早且比较成熟的技术。
3 )图像增强和复原:图像增强和复原的目的是为了提高图像的质量,如去除噪声,提高图像的清晰度等。图像增强不考虑图像降质的原因,突出图像中所感兴趣的部分。如强化图像高频分量,可使图像中物体轮廓清晰,细节明显;如强化低频分量可减少图像中噪声影响。图像复原要求对图像降质的原因有一定的了解,一般讲应根据降质过程建立“降质模型”,再采用某种滤波方法,恢复或重建原来的图像。
4 )图像分割:图像分割是数字图像处理中的关键技术之一。图像分割是将图像中有意义的特征部分提取出来,其有意义的特征有图像中的边缘、区域等,这是进一步进行图像识别、分析和理解的基础。虽然已研究出不少边缘提取、区域分割的方法,但还没有一种普遍适用于各种图像的有效方法。因此,对图像分割的研究还在不断深入之中,是图像处理中研究的热点之一。
5 )图像描述:图像描述是图像识别和理解的必要前提。作为最简单的二值图像可采用其几何特性描述物体的特性,一般图像的描述方法采用二维形状描述,它有边界描述和区域描述两类方法。对于特殊的纹理图像可采用二维纹理特征描述。随着图像处理研究的深入发展,已经开始进行三维物体描述的研究,提出了体积描述、表面描述、广义圆柱体描述等方法。
6 )图像分类(识别):图像分类(识别)属于模式识别的范畴,其主要内容是图像经过某些预处理(增强、复原、压缩)后,进行图像分割和特征提取,从而进行判决分类。图像分类常采用经典的模式识别方法,有统计模式分类和句法(结构)模式分类,近年来新发展起来的模糊模式识别和人工神经网络模式分类在图像识别中也越来越受到重视。

projectImage

关于Maixduino的开发环境


详见《【花雕测评】【AI】尝试搭建Maixduino几种开发环境》
https://makelog.dfrobot.com.cn/article-311383.html

projectImage

 

【花雕测评】【AI】MaixPy机器视觉与Color识别的几个测试
  测试之一:数字图像处理之affine 仿射变换(实时缩放)

 1、实验开源代码

代码 代码
	                    					#【花雕测评】【AI】MaixPy机器视觉与Color识别的几个测试
# 测试之一:数字图像处理之affine 仿射变换(实时缩放)

import image
import lcd, sensor
import time

lcd.init()
# lcd.init(type=2, freq=20000000)

sensor.reset(freq=24000000)
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)


matrix = image.get_affine_transform([(0,0), (240, 0), (240, 240)], [(60,60), (240, 0), (220, 200)])
print("matrix:")
print("[{:.02f}, {:.02f}, {:.02f}]".format(matrix[0], matrix[1], matrix[2]))
print("[{:.02f}, {:.02f}, {:.02f}]".format(matrix[3], matrix[4], matrix[5]))
print("[{:.02f}, {:.02f}, {:.02f}]".format(matrix[6], matrix[7], matrix[8]))


try:
    del img
    del img2
except Exception:
    pass

img2 = image.Image(size=(320, 240))
img2.pix_to_ai()
flag = False
while 1:
    img = sensor.snapshot()

    image.warp_affine_ai(img, img2, matrix)

    img2.ai_to_pix()
    if flag:
        lcd.display(img2)
    else:
        lcd.display(img)
    flag = not flag
    time.sleep_ms(500)
	                    				

  2、实验串口返回情况

>>> init i2c:2 freq:100000
[MAIXPY]: sensor id = 9d
[MAIXPY]: find gc0328


matrix:
[1.34, -0.12, -62.37]
[0.12, 1.34, -56.84]
[0.00, 0.00, 1.00]

projectImage

 3、实验场景图

projectImage

4、实验场景动态图

projectImage


【花雕测评】【AI】MaixPy机器视觉与Color识别的几个测试
 测试之一:数字图像处理之affine 仿射变换(实时缩放)  

 5、实验视频剪辑

 

https://v.youku.com/v_show/id_XNTgxNDg3ODY1Ng==.html?spm=a2hcb.playlsit.page.1

变换模型
是指根据待匹配图像与背景图像之间几何畸变的情况,所选择的能最佳拟合两幅图像之间变化的几何变换模型。可采用的变换模型有如下几种:刚性变换、仿射变换、透视变换和非线形变换等,其中第三个的仿射变换就是这里要探讨的。

projectImage

仿射变换
拉伸、收缩、扭曲、旋转是图像的几何变换,在三维视觉技术中大量应用到这些变换,又分为仿射变换和透视变换。仿射变换可以将矩形转换成平行四边形,它可以将矩形的边压扁但必须保持边是平行的,也可以将矩形旋转或者按比例变化。透视变换提供了更大的灵活性,一个透视变换可以将矩阵转变成梯形。当然,平行四边形也是梯形,所以仿射变换是透视变换的子集。

projectImage
projectImage

image — 机器视觉
移植于 openmv, 与 openmv 功能相同

get_affine_transform()函数
计算3个二维点对之间的仿射变换矩阵H(2行x3列),自由度为6。仿射变换的原理就是根据源图像中一个三角形的顶点坐标和应用仿射变换之后的目标图像中一个三角形的顶点坐标计算出一个变换矩阵,然后将这个矩阵应用到整个源图像。

[mw_shl_code=arduino,true]matrix = image.get_affine_transform([(0,0), (240, 0), (240, 240)], [(60,60), (240, 0), (220, 200)])[/mw_shl_code]

前面三组为输入源图像中的三角形顶点坐标
后面三组为输出目标图像中的三角形顶点坐标

举例说明
输入源图像中的三角形顶点坐标 ([[20, 20], [30, 20], [20, 0]])
输出目标图像中的三角形顶点坐标 ([[20, 20], [30, 20], [25, 0]])

projectImage

红色是原图中的三角形,绿色是应用仿射变换之后的目标图像的三角形,根据这个设置应用仿射变换之后图像应该像左边扭曲,有了这两个三角形的顶点坐标,get_affine_transform()函数就能计算得到一个仿射变换矩阵,并在原图应用仿射变换就得到了扭曲之后的图像(绿色的)。

尝试变动目标图像的三个顶点,看看有什么变化

[mw_shl_code=arduino,true]matrix = image.get_affine_transform([(0,0), (240, 0), (240, 240)], [(60,60), (240, 0), (220, 200)])

matrix = image.get_affine_transform([(0,0), (240, 0), (240, 240)], [(40,80), (100, 60), (220, 180)])[/mw_shl_code]

 

【花雕测评】【AI】MaixPy机器视觉与Color识别的几个测试
 测试之二:数字图像处理之affine 仿射变换(实时缩放)调整二


 1、实验开源代码

代码 代码
	                    					#【花雕测评】【AI】MaixPy机器视觉与Color识别的几个测试
# 测试之二:数字图像处理之affine 仿射变换(实时缩放)调整二

import image
import lcd, sensor
import time

lcd.init()
# lcd.init(type=2, freq=20000000)

sensor.reset(freq=24000000)
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)


matrix = image.get_affine_transform([(0,0), (240, 0), (240, 240)], [(40,80), (100, 60), (220, 180)])
print("matrix:")
print("[{:.02f}, {:.02f}, {:.02f}]".format(matrix[0], matrix[1], matrix[2]))
print("[{:.02f}, {:.02f}, {:.02f}]".format(matrix[3], matrix[4], matrix[5]))
print("[{:.02f}, {:.02f}, {:.02f}]".format(matrix[6], matrix[7], matrix[8]))


try:
    del img
    del img2
except Exception:
    pass

img2 = image.Image(size=(320, 240))
img2.pix_to_ai()
flag = False
while 1:
    img = sensor.snapshot()

    image.warp_affine_ai(img, img2, matrix)

    img2.ai_to_pix()
    if flag:
        lcd.display(img2)
    else:
        lcd.display(img)
    flag = not flag
    time.sleep_ms(300)
	                    				

  2、实验串口返回情况

projectImage

  3、 实验场景动态图

projectImage

点1, 2 和 3 (在图一中形成一个三角形) 与图二中三个点一一映射, 仍然形成三角形, 但形状已经大大改变. 如果我们能通过这样两组三点求出仿射变换 (你能选择自己喜欢的点), 接下来我们就能把仿射变换应用到图像中所有的点。

projectImage

 

【花雕测评】【AI】MaixPy机器视觉与Color识别的几个测试
  测试之三:数字图像处理之 Dark relief 深色浮雕


 1、实验开源代码

代码 代码
	                    					#【花雕测评】【AI】MaixPy机器视觉与Color识别的几个测试
# 测试之三:数字图像处理之 Dark relief 深色浮雕

import sensor
import image
import lcd
import time

lcd.init(freq=15000000)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
origin = (0,0,0, 0,1,0, 0,0,0)
edge = (-1,-1,-1,-1,8,-1,-1,-1,-1)
sharp = (-1,-1,-1,-1,9,-1,-1,-1,-1)
relievo = (2,0,0,0,-1,0,0,0,-1)

tim = time.time()
while True:
    img=sensor.snapshot()
    img.conv3(edge)
    lcd.display(img)
    if time.time() -tim >10:
        break
tim = time.time()
while True:
    img=sensor.snapshot()
    img.conv3(sharp)
    lcd.display(img)
    if time.time() -tim >10:
        break
tim = time.time()
while True:
    img=sensor.snapshot()
    img.conv3(relievo)
    lcd.display(img)
    if time.time() -tim >10:
        break

lcd.clear()
	                    				

 2、实验场景图 

projectImage

 3、实验串口返回情况

projectImage

4、实验场景动态图

projectImage

image deal 图像处理
读取图片(或者实时动态摄像),对像素点任意操作并生成图片,如对像素点进行ARGB的分解,或者将ARGB恢复成像素值,对每个像素点进行修改转换等等。
(Read the image, any operation on the pixels to generate the picture. If the pixel of ARGB decomposition or ARGB back into pixel values, modify the conversion, and so each pixel.)

Color识别(Color recognition)
一般而言,从彩色CCD相机中获取的图像都是RGB图像。也就是说每一个像素都由红(R)绿(G)蓝(B)三个成分组成,来表示RGB色彩空间中的一个点。问题在于这些色差不同于人眼的感觉。即使很小的噪声也会改变颜色空间中的位置。所以无论我们人眼感觉有多么的近似,在颜色空间中也不尽相同。基于上述原因,我们需要将RGB像素转换成为另一种颜色空间CIELAB。目的就是使我们人眼的感觉尽可能的与颜色空间中的色差相近。

projectImage

OpenCV
是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口。该库也有大量的Python、Java and MATLAB/OCTAVE(版本2.5)的接口。这些语言的API接口函数可以通过在线文档获得。如今也提供对于C#、Ch、Ruby,GO的支持。

OpenCV于1999年由Intel建立,如今由Willow Garage提供支持。OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。OpenCV 拥有包括 500 多个C函数的跨平台的中、高层 API。它不依赖于其它的外部库——尽管也可以使用某些外部库。OpenCV 为Intel® Integrated Performance Primitives(IPP)提供了透明接口。这意味着如果有为特定处理器优化的 IPP 库,OpenCV 将在运行时自动加载这些库。 (注:OpenCV 2.0版的代码已显著优化,无需IPP来提升性能,故2.0版不再提供IPP接口)

projectImage

OpenCV概述
其全称是Open source Computer Vision Library,开放源代码计算机视觉库。也就是说,它是一套关于计算机视觉的开放源代码的API函数库。这也就意味着:
(1)不管是科学研究,还是商业应用,都可以利用它来作开发;
(2)所有API函数的源代码都是公开的,你可以看到其内部实现的程序步骤;
(3)你可以修改OpenCV的源代码,编译生成你需要的特定API函数。但是,作为一个库,它所提供的,仅仅是一些常用的,经典的,大众化的算法的API。

一个典型的计算机视觉算法,应该包含以下一些步骤:
(1)数据获取(对OpenCV来说,就是图片);
(2)预处理;
(3)特征提取;
(4)特征选择;
(5)分类器设计与训练;
(6)分类判别;
而OpenCV对这六个部分,分别(记住这个词)提供了API。

projectImage

基于OpenCV的Color识别

彩色模型
数字图像处理中常用的采用模型是RGB(红,绿,蓝)模型和HSV(色调,饱和度,亮度),RGB广泛应用于彩色监视器和彩色视频摄像机,我们平时的图片一般都是RGB模型。而HSV模型更符合人描述和解释颜色的方式,HSV的彩色描述对人来说是自然且非常直观的。

HSV模型
HSV模型中颜色的参数分别是:色调(H:hue),饱和度(S:saturation),亮度(V:value)。由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。

色调(H:hue):用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;
饱和度(S:saturation):取值范围为0.0~1.0,值越大,颜色越饱和。
亮度(V:value):取值范围为0(黑色)~255(白色)。

RGB转成HSV
设 (r, g, b) 分别是一个颜色的红、绿和蓝坐标,它们的值是在 0 到 1 之间的实数。设 max 等价于 r, g 和 b 中的最大者。设 min 等于这些值中的最小者。要找到在 HSV 空间中的 (h, s, v) 值,这里的 h ∈ [0, 360)是角度的色相角,而 s, v ∈ [0,1] 是饱和度和亮度。 OpenCV下有个函数可以直接将RGB模型转换为HSV模型,OpenCV中H∈ [0, 180), S ∈ [0, 255], V ∈ [0, 255]。我们知道H分量基本能表示一个物体的颜色,但是S和V的取值也要在一定范围内,因为S代表的是H所表示的那个颜色和白色的混合程度,也就说S越小,颜色越发白,也就是越浅;V代表的是H所表示的那个颜色和黑色的混合程度,也就说V越小,颜色越发黑。大致识别蓝色的取值是 H在100到140,S和V都在90到255之间。

projectImage

OpenCV颜色识别思路
1、创建滑动条:用来调节阈值,识别出不同颜色。

2、颜色空间转换:将RGB转换为HSV模型,于是可以通过不同颜色的HSV的阈值不同来识别出该种颜色。Opencv中使用cvtcolor()可实现。一般彩色图像都是RGB颜色空间,而HSV色彩空间模型是一种在人们生活中甚至更常用的颜色系统,在电视遥控器上、在画画的调色板中、在看电视时调整亮度时都很常见,因为它更符合人们描述颜色的方式——是什么颜色、颜色有多深、颜色有多亮。需要注意的是,在opencv中,H、S、V值范围分别是[0,180),[0,255),[0,255),而非实际模型[0,360],[0,1],[0,1]。

3、直方图均衡化:由于光线的影响,手机读取的每一帧图片可能存在太亮或者太暗的问题,直方图均衡化可以将每个区间的像素点分布更均衡,使图像的层次感更强。Opencv中可以用equalizeHist()函数实现。直方图均衡化就是将原始的直方图拉伸,使之均匀分布在全部灰度范围内,从而增强图像的对比度。直方图均衡化的中心思想是把原始图像的的灰度直方图从比较集中的某个区域变成在全部灰度范围内的均匀分布

4、二值化:将图像上的像素点的灰度值设置为0或255,这样将使整个图像呈现出明显的黑白效果。对灰度图像进行二值化处理,可以突出一定范围的信息。它是将像素点颜色值在所设定区间内(如a-b)的设定为255,在范围外的设为0.但是对于ab和的不同取值,二值化的效果会有很大的不同。

5、开操作:用来去除图像中的噪点,即干扰信息。Opencv中可以使用getStructuringElement()函数来进行相应设置。开操作是基于图像的膨胀和腐蚀而言的,膨胀就是对图像高亮部分进行“领域扩张”,效果图拥有比原图更大的高亮区域;腐蚀是原图中的高亮区域被蚕食,效果图拥有比原图更小的高亮区域。而开操作是对图像先腐蚀再膨胀,用来消除小物体。其数学原理是定义一个卷积核B,将其与目标图像进行卷积,就可以达到相应效果。不同形状和大小的核会出现不同的效果。

6、闭操作 :进行开操作之后可能会有一些断开的区域,闭操作可以将这些未联通的区域进行封闭,使图像更完整。闭操作是开操作的相反,先膨胀再腐蚀,用于排除小型黑洞,其原理与开操作相同。

projectImage

手头正好有个多彩魔方,有五种颜色,就拿它当识别颜色的实验道具了。

projectImage

 

【花雕测评】【AI】MaixPy机器视觉与Color识别的几个测试
  测试之四:Color识别之 find red blob 动态识别红色块

 1、实验开源代码

代码 代码
	                    					#【花雕测评】【AI】MaixPy机器视觉与Color识别的几个测试
#  测试之四:Color识别之 find red blob 动态识别红色块

import sensor
import image
import lcd
import time

lcd.init(freq=15000000)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
red_threshold  = (55, 70, 42, 65, 52, 8)
while True:
    img=sensor.snapshot()
    blobs = img.find_blobs([red_threshold])
    if blobs:
        for b in blobs:
            tmp=img.draw_rectangle(b[0:4])
            tmp=img.draw_cross(b[5], b[6])
            c=img.get_pixel(b[5], b[6])
    lcd.display(img)
	                    				

  2、实验串口返回情况

projectImage

3、打开MaixPy IDE,选择工具——机器视觉——阕值编辑器

projectImage

4、打开源图像位置,选择帧缓冲区

projectImage

5、调整LAB阕值,主要是在二进制图像栏,白色像素是被跟踪的像素

projectImage

彻底搞懂Lab 颜色空间


名称
在开始之前,先明确一下Lab颜色空间(Lab color space)的名字:
Lab的全称是CIELAB,有时候也写成CIE Lab*
这里的CIE代表International Commission on Illumination(国际照明委员会),它是一个关于光照、颜色等的国际权威组织。
通道
Lab是由一个亮度通道(channel)和两个颜色通道组成的。在Lab颜色空间中,每个颜色用L、a、b三个数字表示,各个分量的含义是这样的:
L*代表亮度
a*代表从绿色到红色的分量
b*代表从蓝色到黄色的分量
Perceptual uniform
Lab是基于人对颜色的感觉来设计的,更具体地说,它是感知均匀(perceptual uniform)的。Perceptual uniform的意思是,如果数字(即前面提到的L、a、b这三个数)变化的幅度一样,那么它给人带来视觉上的变化幅度也差不多。Lab相较于RGB与CMYK等颜色空间更符合人类视觉,也更容易调整:想要调节亮度(不考虑Helmholtz–Kohlrausch effect,见下注)就调节L通道,想要调节只色彩平衡就分别调a和b。
注:Helmholtz–Kohlrausch effect是人眼的一种错觉——当色彩饱和度高时,颜色会看起来更亮。
设备无关
Lab有个很好的特性——设备无关(device-independent)。也就是说,在给定了颜色空间白点(white point)(下图中表示了一种颜色空间的白点)之后,这个颜色空间就能明确地确定各个颜色是如何被创建和显示的,与使用的显示介质没有关系。 需要注意的是,Lab定义的是相对于白点的颜色,只有定义完白点是什么颜色(比如定义为CIE standard illuminant D50),我们才能知道其他的颜色。
数值范围
理论上说,L、a、b*都是实数,不过实际一般限定在一个整数范围内:
L越大,亮度越高。L为0时代表黑色,为100时代表白色。
a和b为0时都代表灰色。
a*从负数变到正数,对应颜色从绿色变到红色。
b*从负数变到正数,对应颜色从蓝色变到黄色。
我们在实际应用中常常将颜色通道的范围-100~+100或-128127之间。
可视化
可以看到,Lab*一共有三个分量,因此可以在三维空间中呈现。 在二维空间中,常用chromaticity diagram来可视化它,也就是固定亮度L,看a和b的变化。注意,这些可视化不是精确的,只是能帮助人理解。

projectImage

LAB颜色模型
是根据Commission International Eclairage(CIE)在1931年所制定的一种测定颜色的国际标准建立的。于1976年被改进,并且命名的一种色彩模式。Lab颜色模型弥补了RGB和CMYK两种色彩模式的不足。它是一种设备无关的颜色模型,也是一种基于生理特征的颜色模型。 Lab颜色模型由三个要素组成,一个要素是亮度(L),a 和b是两个颜色通道。a包括的颜色是从深绿色(低亮度值)到灰色(中亮度值)再到亮粉红色(高亮度值);b是从亮蓝色(低亮度值)到灰色(中亮度值)再到黄色(高亮度值)。因此,这种颜色混合后将产生具有明亮效果的色彩。

Lab模式既不依赖光线,也不依赖于颜料,它是CIE组织确定的一个理论上包括了人眼可以看见的所有色彩的色彩模式。Lab模式弥补了RGB和CMYK两种色彩模式的不足。同RGB颜色空间相比,Lab是一种不常用的色彩空间。它是在1931年国际照明委员会(CIE)制定的颜色度量国际标准的基础上建立起来的。1976年,经修改后被正式命名为CIELab。它是一种设备无关的颜色系统,也是一种基于生理特征的颜色系统。这也就意味着,它是用数字化的方法来描述人的视觉感应。Lab颜色空间中的L分量用于表示像素的亮度,取值范围是[0,100],表示从纯黑到纯白;a表示从红色到绿色的范围,取值范围是[127,-128];b表示从黄色到蓝色的范围,取值范围是[127,-128]。下图所示为Lab颜色空间的图示;

Lab颜色空间比计算机显示器甚至比人类视觉的色域都要大  ,表示为Lab的位图比RGB或CMYK位图获得同样的精度需要要求更多的像素数据。Lab模式所定义的色彩最多,且与光线及设备无关并且处理速度与RGB模式同样快,比CMYK模式快很多。因此,可以放心大胆的在图象编辑中使用Lab模 式。而且,Lab模式在转换成CMYK模式时色彩没有丢失或被替换。因此,最佳避免色彩损失的方法是:应用Lab模式编辑图象,再转换为CMYK模式打印 输出。

projectImage

【花雕测评】【AI】MaixPy机器视觉与Color识别的几个测试
 测试之四:Color识别之 find red blob 动态识别红色块

6、尝试选择最佳的颜色跟踪阙值,通过滑动条来调节阈值,在二进制图像上红色块高亮(显示白色)。

实测得出的LAB值为:49, 92, 110, 30, 62, 24

projectImage

7、LAB阕值校正后的红色识别情况

projectImage

  8、实验场景图

projectImage

做实验的彩色魔方,有5种颜色

projectImage

运行后可看到框圈和+号,已能准确识别魔方的红色块

projectImage

构造函数

image 图像模块。导入image模块

代码 代码
	                    					import image
//色块对象是由 image.find_blobs 返回的。
image.find_blobs(thresholds, invert=False, roi, x_stride=2, y_stride=1, area_threshold=10, pixels_threshold=10, merge=False,margin=0, threshold_cb=None, merge_cb=None)
查找图像中指定的色块。返回 image.blog 对象列表;
【thresholds】 必须是元组列表。 [(lo, hi), (lo, hi), ..., (lo, hi)] 定义你想追踪的颜色范围。 对于灰度图像,每个元组需要包含两个值 - 最小灰度值和最大灰度值。 仅考虑落在这些阈值之间的像素区域。 对于 RGB565 图像,每个元组需要有六个值(l_lo,l_hi,a_lo,a_hi,b_lo,b_hi) - 分别是 LAB L,A 和 B通道的最小值和最大值。
【area_threshold】若色块的边界框区域小于此参数值,则会被过滤掉;
【pixels_threshold】若色块的像素数量小于此参数值,则会被过滤掉;
【merge】若为 True,则合并所有没有被过滤的色块;
【margin】调整合并色块的边缘。
	                    				
projectImage
projectImage

 

【花雕测评】【AI】MaixPy机器视觉与Color识别的几个测试
  测试之五:Color识别之 find green blob 动态识别绿色块

1、打开MaixPy IDE,选择工具——机器视觉——阕值编辑器
2、打开源图像位置,选择帧缓冲区
3、调整LAB阕值,主要是在二进制图像栏,白色像素是被跟踪的像素

projectImage

4、获取绿色块的LAB阙值为 (61, 72, -12, -45, -27, 13)

projectImage

5、将绿色LAB阙值导入程序

【花雕测评】【AI】MaixPy机器视觉与Color识别的几个测试
  测试之五:Color识别之 find green blob 动态识别绿色块

 6、实验开源代码

代码 代码
	                    					#【花雕测评】【AI】MaixPy机器视觉与Color识别的几个测试
# 测试之五:Color识别之 find green blob 动态识别绿色块

import sensor
import image
import lcd
import time

lcd.init(freq=15000000)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
green_threshold  = (61, 72, -12, -45, -27, 13)
while True:
    img=sensor.snapshot()
    blobs = img.find_blobs([green_threshold])
    if blobs:
        for b in blobs:
            tmp=img.draw_rectangle(b[0:4])
            tmp=img.draw_cross(b[5], b[6])
            c=img.get_pixel(b[5], b[6])
    lcd.display(img)
	                    				

7、实验串口返回情况

projectImage

  8、实验场景图

projectImage

可以很准确的检测绿色块了

projectImage

 

【花雕测评】【AI】MaixPy机器视觉与Color识别的几个测试
  测试之六:Color识别之 find blue blob 动态识别蓝色块

 

1、打开MaixPy IDE,选择工具——机器视觉——阕值编辑器
2、打开源图像位置,选择帧缓冲区
3、调整LAB阕值,主要是在二进制图像栏,白色像素是被跟踪的像素
4、获取绿蓝色块的LAB阙值为 (50, 59, 28, 0, -62, -30)

projectImage

5、将绿色LAB阙值导入程序

 

【花雕测评】【AI】MaixPy机器视觉与Color识别的几个测试
  测试之六:Color识别之 find blue blob 动态识别蓝色块
  6、实验开源代码

代码 代码
	                    					#【花雕测评】【AI】MaixPy机器视觉与Color识别的几个测试
#  测试之六:Color识别之 find blue blob 动态识别蓝色块

import sensor
import image
import lcd
import time

lcd.init(freq=15000000)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
blue_threshold  = (50, 59, 28, 0, -62, -30)
while True:
    img=sensor.snapshot()
    blobs = img.find_blobs([blue_threshold])
    if blobs:
        for b in blobs:
            tmp=img.draw_rectangle(b[0:4])
            tmp=img.draw_cross(b[5], b[6])
            c=img.get_pixel(b[5], b[6])
    lcd.display(img)
	                    				

7、实验串口返回情况

projectImage

8、准确检测到蓝色

projectImage

9、 实验场景动态图

projectImage

 

【花雕测评】【AI】MaixPy机器视觉与Color识别的几个测试
  测试之七:Color识别之 find yellow blob 动态识别黄色块

1、打开MaixPy IDE,选择工具——机器视觉——阕值编辑器
2、打开源图像位置,选择帧缓冲区
3、调整LAB阕值,主要是在二进制图像栏,白色像素是被跟踪的像素
4、获取黄色块的LAB阙值为(78, 96, -44, 10, 31, 95)

projectImage

5、将绿色LAB阙值导入程序

【花雕测评】【AI】MaixPy机器视觉与Color识别的几个测试
  测试之七:Color识别之 find yellow blob 动态识别黄色块

  6、实验开源代码

代码 代码
	                    					#【花雕测评】【AI】MaixPy机器视觉与Color识别的几个测试
# 测试之七:Color识别之 find yellow blob 动态识别黄色块

import sensor
import image
import lcd
import time

lcd.init(freq=15000000)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
yellow_threshold  = (78, 96, -44, 10, 31, 95)
while True:
    img=sensor.snapshot()
    blobs = img.find_blobs([yellow_threshold])
    if blobs:
        for b in blobs:
            tmp=img.draw_rectangle(b[0:4])
            tmp=img.draw_cross(b[5], b[6])
            c=img.get_pixel(b[5], b[6])
    lcd.display(img)
	                    				

7、实验串口返回情况

projectImage

 8、实验场景图

projectImage

 

【花雕测评】【AI】MaixPy机器视觉与Color识别的几个测试
  测试之八:Color识别之 find orange blob 动态识别橙色块

1、打开MaixPy IDE,选择工具——机器视觉——阕值编辑器
2、打开源图像位置,选择帧缓冲区
3、调整LAB阕值,主要是在二进制图像栏,白色像素是被跟踪的像素
4、获取橙色块的LAB阙值为 (60, 75, 10, 46, 9, 34)

5、将橙色LAB阙值导入程序

【花雕测评】【AI】MaixPy机器视觉与Color识别的几个测试
  测试之八:Color识别之 find orange blob 动态识别橙色块

 6、实验开源代码

代码 代码
	                    					#【花雕测评】【AI】MaixPy机器视觉与Color识别的几个测试
# 测试之八:Color识别之 find orange blob 动态识别橙色块

import sensor
import image
import lcd
import time

lcd.init(freq=15000000)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
orange_threshold  = (60, 75, 10, 46, 9, 34)
while True:
    img=sensor.snapshot()
    blobs = img.find_blobs([orange_threshold])
    if blobs:
        for b in blobs:
            tmp=img.draw_rectangle(b[0:4])
            tmp=img.draw_cross(b[5], b[6])
            c=img.get_pixel(b[5], b[6])
    lcd.display(img)
	                    				

7、实验串口返回情况

projectImage

 8、实验场景图

projectImage

因为橙色与红色比较接近,这里出现了一些检测混乱,有可能误判,所以需要重新细调橙色LAB阙值

projectImage

橙色块的LAB阙值调整为 (66, 79, 17, 39, 9, 31),导入程序

projectImage

基本上可以正确检测橙色了

projectImage

实验说明:
本案例以一只普通魔方的色彩为准(室内LED灯的光线),得出的实验数据(LAB阙值)仅供参考

红色 49, 92, 110, 30, 62, 24
绿色 61, 72, -12, -45, -27, 13
蓝色 50, 59, 28, 0, -62, -30
黄色 78, 96, -44, 10, 31, 95
橙色 66, 79, 17, 39, 9, 31

projectImage
projectImage

Arduino 系列传感器和执行器模块实验目录清单:
一块扩展板完成Arduino的10类37项实验(代码+图形+仿真)
https://mc.dfrobot.com.cn/thread-280845-1-1.html
连杆形式的腿机构十一种:盘点机器人行走背后的机械原理
https://mc.dfrobot.com.cn/thread-308097-1-1.html
【花雕动手做】超低成本,尝试五十元的麦克纳姆轮小车!
https://mc.dfrobot.com.cn/thread-307863-1-1.html
【花雕动手做】超迷你哦,用徽商香烟盒做个智能小车!
https://mc.dfrobot.com.cn/thread-307907-1-1.html
【花雕动手做】太搞笑啦,一支胶管制成二只蠕动机器人
https://mc.dfrobot.com.cn/thread-308046-1-1.html
【花雕动手做】快餐盒盖,极低成本搭建机器人实验平台 
https://mc.dfrobot.com.cn/thread-308063-1-1.html
【花雕动手做】特别苗条,使用微波传感器控制的纤细小车
https://mc.dfrobot.com.cn/thread-308866-1-1.html
【花雕动手做】脑洞大开、五花八门的简易机器人66种
https://mc.dfrobot.com.cn/thread-307900-1-1.html
【花雕动手做】看见声音,基于Arduino系列音乐可视器(1)---LED节奏灯
https://mc.dfrobot.com.cn/thread-311167-1-1.html
【花雕动手做】看见声音,基于Arduino系列音乐可视器(2)---OLED频谱灯
https://mc.dfrobot.com.cn/thread-311174-1-1.html
【花雕动手做】看见声音,基于Arduino系列音乐可视器(3)---RGB律动灯
https://mc.dfrobot.com.cn/thread-311183-1-1.html
【花雕动手做】看见声音,基于Arduino系列音乐可视器(4)---WS2812条灯
https://mc.dfrobot.com.cn/thread-311190-1-1.html
【花雕动手做】看见声音,基于Arduino系列音乐可视器(5)---WS2812柱跳灯
https://mc.dfrobot.com.cn/thread-311192-1-1.html
【花雕动手做】看见声音,基于Arduino系列音乐可视器(6)---点阵频谱灯
https://mc.dfrobot.com.cn/thread-311201-1-1.html

实验一百五十八:QMC5883L电子指南针罗盘模块 三轴磁场传感器GY-271
https://mc.dfrobot.com.cn/thread-308195-1-1.html
实验一百六十三:BMI160 6轴惯性运动传感器 16位3轴加速度+超低功耗3轴陀螺仪  I2C/SPI 14LGA
https://mc.dfrobot.com.cn/thread-310371-1-1.html
实验一百六十五:2.4 英寸 TFT LCD 触摸屏模块 XPT2046 PCB ILI9341 240x320 像素 8 位 SPI 串口显示器 300mA
https://mc.dfrobot.com.cn/thread-309803-1-1.html
实验一百七十六:6mm大尺寸8x8LED方块方格点阵模块 可级联 红绿蓝白色 可选8级亮度
https://mc.dfrobot.com.cn/thread-309845-1-1.html
实验一百七十九:0.66英寸OLED显示模块 液晶屏模块IIC/I2C接口 64*48像素 SSD1306驱动芯片
https://mc.dfrobot.com.cn/thread-311179-1-1.html
实验一百八十一:1.3寸OLED液晶屏  I2C IIC通信 4针模块 1106/1306驱动 128*64像素
https://mc.dfrobot.com.cn/thread-311123-1-1.html
实验一百八十三:GY-530 VL53L0X 激光测距 ToF测距 飞行时间测距传感器模块 IIC通信协议
https://mc.dfrobot.com.cn/thread-310273-1-1.html
实验一百八十五:MAX4466声音传感器 驻极体话筒放大器 麦克风可调功放模块 microphone
https://mc.dfrobot.com.cn/thread-310193-1-1.html
实验一百八十九:TDA1308 硅麦克风 数字咪头放大模块 拾音器放大板 楼氏SUNLEPHANT
https://mc.dfrobot.com.cn/thread-310246-1-1.html
实验一百九十三:TCS34725颜色识别传感器 RGB IIC明光感应模块 ColorSensor
https://mc.dfrobot.com.cn/thread-310209-1-1.html
实验二百:RCWL-0515微波雷达感应开关 人体感应 智能感应探测传感器 12-15米远距离2.7G微波检测模块
https://mc.dfrobot.com.cn/thread-310313-1-1.html
实验二百零一:OPT101模拟光照传感器 TEMT6000光强度模块 单片光电二极管 YourCee
https://mc.dfrobot.com.cn/thread-311164-1-1.html
实验二百零三:Air724UG合宙 Cat14G模块 DTU物联网UART串口通信数据TCP透传 核心板组合套餐
https://mc.dfrobot.com.cn/thread-310342-1-1.html
实验二百零七:I2C红色8*8LED点阵模块ht16k33驱动1088BS树莓派物联网可扩展编程
https://mc.dfrobot.com.cn/thread-310951-1-1.html
实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块 NB-IoT广域低功耗无线通信 GPS/北斗精准定位
https://mc.dfrobot.com.cn/thread-310433-1-1.html

【花雕测评】【AI】尝试搭建Maixduino几种开发环境
https://makelog.dfrobot.com.cn/article-311383.html
【花雕测评】【AI】MaixPy基本使用、显示文字及摄像机的22个小项目
https://makelog.dfrobot.com.cn/article-311389.html
【花雕测评】【AI】Mind+图片文字显示、呼吸灯和网络应用的22项小实验
https://makelog.dfrobot.com.cn/article-311386.html
【花雕测评】【AI】MaixPy机器视觉与Color识别的8个尝试
https://makelog.dfrobot.com.cn/article-311393.html
【花雕测评】【AI】Mind+机器视觉之数字图像处理和显示的22种小测试
https://makelog.dfrobot.com.cn/article-311405.html
【花雕测评】【AI】MaixPy之神经网络KPU与人脸识别的初步体验
https://makelog.dfrobot.com.cn/article-311400.html
【花雕测评】【AI】Mind+机器视觉之颜色、维码与形状识别的8个小实验
https://makelog.dfrobot.com.cn/article-311417.html

Makelog作者原创文章,未经授权禁止转载。
0
0
评论
[[c.user_name]] [[c.create_time]]
[[c.parent_comment.count]]
|
[[c.comment_content]]