作者信息:彭贯军,图像算法工程师,研究方向:机器视觉、图形图像分析等

编者按:

编者最近学习了自动光学识别设备整机采集彩色图的算法,了解了彩色图的图像分割算法。彩色图提供了更多的颜色信息,这些信息对图像分割识别提供了更多可能的处理方法。集成电路行业最近有了国家集成电路产业投资基金二期的消息,这对芯片封装测试行业是一个风口,写下这篇文章,以期给大家一点启示。

1  行业介绍

芯片封装测试行业“大基金”利好消息介绍:

什么是大基金?国内芯片产业的大金主。

“大基金”是国家集成电路产业投资基金股份有限公司的简称,是在2014年9月由工信部、财政部的指导下设立,其成立目的是为了扶持中国本土芯片产业,减少对海外的依赖。说白了,大基金就是国内芯片产业的大金主。大基金资本带动作用很强,一期总规模1387亿,最终带动超5000社会投资。

大基金二期落地在即,将撬动上w亿投资。

9月21日,国家大基金二期总裁出席2019世界制造业大会集成电路产业高峰论坛,并发表讲话。大基金二期已经募集一年多,从时间进度来看也应该差不多了,所以大基金二期很可能就在近期落地。此次2000亿,如果也按1:5的杠杆计算,将带动上w亿社会投资,一旦落地,必将掀起芯片产业新一轮建设高潮。

2  彩色图数据量化工具

为了识别特定颜色的物体,获取到颜色所对应的HSV值很重要,这里说一下获取步骤:

1、在线取色器 传图识色,可以在这里上传特定颜色的图片,获取这些颜色对应的RGB值。

2、假设获取到的是这样的数据:#869C90,#899F92,#8A9E92,#8A9F8E,下面将其进行转换得到HSV各通道的数值范围:

rgb = '#869C90,#899F92,#8A9E92,#8A9F8E'rgb = rgb.split(',')# 转换为BGR格式,并将16进制转换为10进制
bgr = [[int(r[5:7], 16), int(r[3:5], 16), int(r[1:3], 16)] for r in rgb]# 转换为HSV格式
hsv = [list(cv2.cvtColor(np.uint8([[b]]), cv2.COLOR_BGR2HSV)[0][0]) for b in bgr]hsv = np.array(hsv)
print('H:', min(hsv[:, 0]), max(hsv[:, 0]))
print('S:', min(hsv[:, 1]), max(hsv[:, 1]))
print('V:', min(hsv[:, 2]), max(hsv[:, 2]))

尝试了这两个颜色空间转换的工具:

一个是网页制作里面的好工具传图识色:

另一个是在线取色器:

这两个工具可以在这片知乎文章中查看:

https://zhuanlan.zhihu.com/p/67930839  作者:z.defying

这里更正这篇文章的下图框选的一个小错误:

饱和度的正确理论介绍如下:饱和度是指色彩的鲜艳程度,也称色彩的纯度。饱和度取决于该色中含色成分和消色成分(灰色)的比例。含色成分越大,饱和度越大;消色成分越大,饱和度越小。纯的颜色都是高度饱和的,如鲜红,鲜绿。混杂上白色,灰色或其他色调的颜色,是不饱和的颜色,如绛紫,粉红,黄褐等。完全不饱和的颜色根本没有色调,如黑白之间的各种灰色。

从下图可以看出,饱和度为0不表示白色。

这里推出这个测试RGB到HSV颜色空间数值对应数值关系的小工具:HSV_RGB转换工具,来选择正确的hsv范围即可解决彩色图分割问题。(文末大礼包含源码)

3  具体案例学习彩色图分割算法

Correct HSV InRange Values for 'Red' Objects

opencvansw论坛的帖子介绍:

我使用OpenCV 2.4.6来检测图像中主要是绿灰色的白色物体。(见下图)。

我已经把这张图片转换成HSV格式,这些白色的物体(房子)被转换成红橙色的等效物。我一直试图找到这些红橘色覆盖的值,这样我就可以检测对象。

然而,试图通过实验来找到范围并没有起作用——到目前为止,它在190到255范围内已经产生了一些结果。

我发现有网上说阈值可为0到10,或者110到140,但是其他消息说OpenCV中的HSV取值范围仅为0到180。

我如何仍然得到适合的参数?如何检测HSV平面上的红色?

有背景噪音,如道路等,这不是很重要,我只是想找出'正确'范围内值。

以下是我目前的代码片段:

Imgproc.cvtColor(src, dest, Imgproc.COLOR_RGB2HSV);
Highgui.imwrite(outputFilename + "HSV.png", dest);
List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Core.inRange(dest, new Scalar(190, 0, 0), new Scalar(256, 256, 256), dest);
Highgui.imwrite(outputFilename + "Filter.png", dest);

核心解答:

HSV-是柱状坐标系统,这就是为什么红色有不同的分界点,因为对于红色你可以看到两个色调范围,像165-179和0-10。因此,为了分割红色,只需应用inrange()在这两个具有不同目标图像的范围,并将结果相加,得到完整的红色范围。

从上面可以看出他使用的是:inRange()函数,并且使用的仍然是BGR的取值范围。

而在 OpenCV 中 HSV 三个分量的范围为:

H = [0,179]

S = [0,255]

V = [0,255]

inRange()函数作用:可实现二值化功能(这点类似threshold()函数),对于单通道数组,如果一幅灰度图像的某个像素的灰度值在指定的高、低阈值范围之内,则在dst图像中令该像素值为255,否则令其为0,这样就生成了一幅二值化的输出图像。三通道及多通道以此类推。

下面来看看inRange()函数的定义:

void inRange(InputArray src, InputArray lowerb,

InputArray upperb, OutputArray dst);

参数解释:

参数1:输入要处理的图像,可以为单通道或多通道。

参数2:包含下边界的数组或标量。

参数3:包含上边界数组或标量。

参数4:输出图像,与输入图像src 尺寸相同且为CV_8U 类型。

请注意:该函数输出的dst是一幅二值化之后的图像。

原文链接:https://blog.csdn.net/sinat_36264666/article/details/78057256

HSV_RGB转换工具的源码解读

#define HUEMAX 179

什么是define:宏定义,简单的理解就是替换,其实这也是本质。如果熟悉g++编译过程的话,会了解到一个概念叫做预处理,就是在编译之前做个处理。这个过程并不像编译那么复杂,就是简单的递归替换和删除。替换的就是宏定义和include文件,删除注释。

在 OpenCV 中 HSV 三个分量的范围为:

  • H = [0,179]

  • S = [0,255]

  • V = [0,255]

参考文章链接:c++define的用法 - 枫影竹韵 - 博客园

HSV.create(390, 640, CV_8UC3);

cv::Mat::create()函数的作用就很清楚了,创建一个指定大小(Size),指定类型 type(CV_8UC1,CV_16SC1,CV_32FC3)的图像矩阵的矩阵体。

详细说明:

1)关于cv::Mat。我们都知道它有两大特点:

a)不必在手动为其开辟空间

b)不必再不需要时立即将空间释放

2)但是,我们还是必须清楚的知道,cv::Mat是一个矩阵图像类,它的确有两部分组成:

a)矩阵头:包含矩阵的尺寸、存储方法、存储地址等信息和一个指向存储图像中所有像素的矩阵体

b)矩阵体

3)请看下面的代码:

cv::Mat srcImg;
cv::Mat dstImg;

我们在写代码的时候,需要清楚的知道,上面这两句代码仅仅创建了图像矩阵的信息头部分,并没有创建矩阵体!

参考文章链接:https://blog.csdn.net/CYJ2014go/article/details/78428281

HSV.setTo(Scalar(200, 0, 200));

一个Mat src,想将他的值全部设置成0,则可以src.setTo(0);

src.setTo(0,src < 10);这句话的意思是,当src中的某个像素值小于10的时候,就将该值设置成0;

src.setTo(dst,src < 10);这里的意思是,对于src中的像素值,当其值小于10的时候,就将该值用dst中相应位置的值进行替换。

参考文章链接:opencv setTo() - 任重道远-HSY - 博客园

createTrackbar("Hue", window_name, &H, HUEMAX, onTrackbar_changed);

createTrackbar是Opencv中的API,其可在显示图像的窗口中快速创建一个滑动控件,用于手动调节阈值,具有非常直观的效果。具体定义如下:

CV_EXPORTS int createTrackbar(const string& trackbarname, const string& winname,int* value, int count,TrackbarCallback onChange = 0,void* userdata = 0);

形式参数一、trackbarname:滑动空间的名称;

形式参数二、winname:滑动空间用于依附的图像窗口的名称;

形式参数三、value:初始化阈值;

形式参数四、count:滑动控件的刻度范围;

形式参数五、TrackbarCallback是回调函数,其定义如下:

typedef void (CV_CDECL *TrackbarCallback)(int pos, void* userdata);

参考文章链接:https://blog.csdn.net/mysee1989/article/details/41379817

c = waitKey(20);

waitKey函数用于显示的延迟。例如,waitKey(0)将无限显示窗口,直到按下任意按键退出延迟事件(适用于显示图像)。如果delay大于0,例如,waitKey(25)将每隔至少25ms显示视频的一帧图像(适用于显示视频帧),如果要按键退出,则需要将waitKey(25)与一个按键值(ASCII码)比较。

参考文章链接:https://blog.csdn.net/mars_xiaolei/article/details/91362997

if ((char)c == 27)

(char)是强制转换成字符类型。即把变量i强制转换成字符类型char。还有个自动类型转换,具体的内容要看你用什么语言。比如你用的是java,c,c++等,低精度的类型可以自动转换成高精度的,反之不行,就要用到强制转换了。

Char(“27”) : Pause break

参考文章链接:https://blog.csdn.net/qq_30054961/article/details/82463748

line(roi1, p1, p2, Scalar(255, 255, 255), 1, LINE_AA, 0);

void line(Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness=1, int lineType=8, int shift=0)

参数:

img: 要绘制线段的图像。

pt1: 线段的起点。

pt2: 线段的终点。

color: 线段的颜色,通过一个Scalar对象定义。

thickness: 线条的宽度。

lineType: 线段的类型。可以取值8, 4, 和CV_AA, 分别代表8邻接连接线,4邻接连接线和反锯齿连接线。默认值为8邻接。为了获得更好地效果可以选用CV_AA(采用了高斯滤波)。

shift: 坐标点小数点位数。

参考文章链接:https://blog.csdn.net/weixin_36340947/article/details/77095924

putText(HSV, name, Point(460, 155), FONT_HERSHEY_SIMPLEX, .7, Scalar(5, 255, 255), 2, 8, false);

void cv::putText(cv::Mat& img, // 待绘制的图像const string& text, // 待绘制的文字cv::Point origin, // 文本框的左下角int fontFace, // 字体 (如cv::FONT_HERSHEY_PLAIN)double fontScale, // 尺寸因子,值越大文字越大cv::Scalar color, // 线条的颜色(RGB)int thickness = 1, // 线条宽度int lineType = 8, // 线型(4邻域或8邻域,默认8邻域)bool bottomLeftOrigin = false // true='origin at lower left');

opencv支持的文字字体有以下几种:

另外,我们在实际绘制文字之前,还可以使用cv::getTextSize()接口先获取待绘制文本框的大小,以方便放置文本框。

参考文章链接:https://blog.csdn.net/zqx951102/article/details/86499777

回复‘颜色空间 可以得到如下源码大礼包,还有猫狗大战的4千张图像数据。

参考资料:

https://zhuanlan.zhihu.com/p/93255329

Correct HSV InRange Values for 'Red' Objects

https://zhuanlan.zhihu.com/p/67930839

土盐AI,致力于建设AIers在前进路上的茶馆驿站,提供个性化的带刺鱼汤。

可以在 本公众号后台 回复关键词“ 颜色空间 ”获得本文的示例代码与文件。

颜色空间的小数据大天地相关推荐

  1. 小数据大用场:银行大数据挖掘的五个切入点

    大数据实际是从多如繁星的信息中抽取出对客户需求.态度和行为的洞见,从而帮助制定高度聚焦的精准销售和市场营销活动.这样的做法其实并不新鲜,早些年市场营销人员就已经开始借助对已有数据的分析来支撑营销项目. ...

  2. 小数据 vs. 大数据

    2019年1月-2019年12月 文 | 潘爱民 来自 iSyscore Radio 的报道 第一讲 随着互联网技术的发展,电脑.智能手机和其他各种智能设备产生了大量的数据,我们从信息时代进入了大数据 ...

  3. 大数据、小数据与数字社会

    大数据技术的出现带给人们的思维方式.行为方式.媒体传播方式及社会治理方式等都诸多方面带来了革命性的变革.<大数据时代>一书中认为:"在大数据时代,我们正经历着一场生活.工作与思维 ...

  4. 大数据时代的小数据会消亡吗(非原创)

    大数据时代的小数据会消亡吗 苏令银 上海师范大学马克思主义学院 上海师范大学经济伦理研究中心 摘 要: 在过去的几个世纪,学术知识的构建普遍使用小数据并取得了巨大进步,其特征是为回答特定问题而生成的抽 ...

  5. 《大数据、小数据、无数据:网络世界的数据学术》一 导读

    前 言| 在"大数据"风靡的当代,学术研究中的"小数据"依旧不容小觑.随着绝对数据量的增加,学者们进行个体研究的能力却不断退化.因为他们从未距离研究对象如此遥远 ...

  6. 吴恩达:告别大数据,AI需要高质量小数据!

    来源:AI科技评论 本文约5000字,建议阅读10分钟 本文向大家谈下吴恩达对基础模型.大数据.小数据以及数据工程的一些感悟. 吴恩达是人工智能(AI)和机器学习领域国际最权威的学者之一,最近一年里, ...

  7. 玩不转大数据就别勉强了,或许“小数据”才是真正的终南捷径

    如今大多数人会经常听到"大数据",如果选择一个词来代替"大",大部分人的脑海里会出现"海量"."巨量"的字眼,但是,数据 ...

  8. 吴恩达:AI是时候从大数据转向「小数据」了

    丰色 编译整理 量子位 | 公众号 QbitAI AI大牛吴恩达不久前刚被检测出新冠阳性,许多网友都向他表达了早日康复的祝愿. 如今,他的工作重心放在了他的Landing AI公司上. 这是一家专门面 ...

  9. 高密自智,体小量大,希捷Exos Corvault存储系统为数据洞察赋能

    2022年2月24日--全球领先的海量数据存储基础设施解决方案提供商希捷科技(NASDAQ:STX)在线上举办了主题为"高密自智,体小量大"的新一代PB级自修复存储系统--Exos ...

最新文章

  1. P2216 理想的正方形 单调队列 (二维)
  2. (C++)异常退出情况合集(持续更新中)
  3. 连华为都在研究的计算机视觉,到底有多牛?
  4. IBM公司扩展云平台 计划推出SmartCloud
  5. 生物医学图片处理——怎样才算不当操作?
  6. c++调用gcd函数_c++函数库中一些实用的函数
  7. Linux上安装Python3和pip3
  8. flask mysql 配置文件_flask配置文件的几种方法
  9. Python使用nmap进行端口扫描
  10. CherryPy上传文件
  11. Android studio 菜单栏搞不见了
  12. 关于使用Cobalt Strike制作宏病毒
  13. 《开源安全运维平台OSSIM最佳实践》媒体推荐
  14. 声音和音频设备属性无法设置
  15. 记录,在公网云服务器,装入redis服务后,未设置密码直接被pnscan病毒攻击,变成wakuang机器。
  16. 计算机调查应用表格,大学计算机实验课_调查报告_表格模板_应用文书.doc
  17. java祖玛_Canvas小练习_祖玛游戏01
  18. 微信小程序全面实战,架构设计与躲坑攻略大全
  19. mysql san 存储配置_如何搭建小型FC SAN环境
  20. 已解决:联想G480安装win10反复出现rtsuvc.sys蓝屏(亲测有效)

热门文章

  1. PHP 页面跳转到另一个页面的多种方法方法总结
  2. 计量经济学复习笔记(1)
  3. C语言递归实现数组求和
  4. mysql 数据库分表三种方法
  5. 移动端H5页面,上下滑动翻页
  6. ArcGIS地形分析
  7. STM32F103移植STEMWIN并驱动0.96寸OLED实现弹球界面效果
  8. vue3.0中报错文件 .tsis not a module
  9. String类的切割功能
  10. vue项目引入高德地图(定位、搜索、经纬度解析地址)