真的!只需 “六步” 实现图像特定物体识别!!!

目录
目录
一、概况
二、整体思路
1、读取原始图片
2、转化图片的色彩空间
【真的!只需 “六步” 实现图像特定物体识别!!!】3、获取二值化图片
4、对图片进行形态学处理
5、获取组件串轮廓区域
6、切割并保存区域图片
三、总结
一、概况
在一个 "大数据智能太阳能光伏" 项目中,有这么一个需求:
通过无人机(大疆)对整片光伏区域进行航拍(包括红外图像与可见光图像),再航拍的图片通过4G/5G实时传输到应用程序,应用程序基于计算机视觉技术,自动识别出图片中光伏组件可能存在的故障,并结合其他实时监控与分析数据,从而判断光伏组件是否存在故障并给出报警,下图是该需要的整体业务路程 。
整体技术流程
这是一个人工智能在计算机视觉领域的典型应用,要实现这些功能涉及到技术非常多如:无人机图像传输,图像识别,光伏组件实时数据监测与分析等,本文从“怎样分离出原始图片中的特定区域(光伏组件串)“这个很小的片段入手,来阐述计算机视觉分析究竟个什么样子 。文中不涉及到任何算法的原理与细节,我们先梳理实现的整体步骤,并先让代码能跑起来可以看到实际的运行结果 。
二、整体思路
通过上面的描述,我们的目标非常清晰,就是要从一张带光伏组件的照片中,分离出来一块块的光伏组件串,下图为原始图片与结果输出后的图片 。
原始图像

真的!只需 “六步” 实现图像特定物体识别!!!

文章插图
识别后的图片集合
那应该如何实现这个功能呢?
整体实现流程大概可分为如6个步骤
1 读取原始图片-->2 转化图片的色彩空间-->3 获取二值化图片 -->4 对图片进行形态学处理-> 5 获取图片轮廓- > 6 切割并保存区域图片
下面对每一个步骤进行说明并提供相应的代码
代码实现使用,是一个开源的计算机视觉库,它轻量,功能强大,实现了图像处理和计算机视觉方面的诸多算法,可以运行在Linux、、和Mac OS操作系统上 。同时提供了、Ruby、等语言的接口 。
1、读取原始图片
整个功能实现的过程,就是对图片不断变化的过程 。所有,首先需要将磁盘上的图片文件读取到内存并转化为能处理的数据,该数据是一个三维数组(300,400,3),每个维度分别表示高、宽、通道数,数组中的值表示每个像素点不同通道的取值0-255之间,同时由于原始文件的尺寸比较大(3000*4000)为了方便查看,将原始文件等比例缩小 。下面是函数实现,传入图片路径与图片缩小比例(默认为1不缩小)返回缩小后的原始图片数组 。
def read_resize_image(path, size=1.0):"""读取原始图片文件并从新设置大小1) 使用imread读取文件2)使用resize从新设置文件大小3) 函数返回的是图片的原始数据,可理解为一个三维数组,每个维度分别表示长、宽、通道数,数组中的值表示图片每个像素点不同通道的取值"""original_image = cv2.imread(path)if size != 1.0:height, width = original_image.shape[:2]size = (int(width * size), int(height * size))original_image = cv2.resize(original_image, size, interpolation=cv2.INTER_AREA)print(original_image)print(original_image.shape)return original_image
2、转化图片的色彩空间
彩色的图片默认的是RGB色彩空间,RGB分别代表三个基色(R-红色、G-绿色、B-蓝色),具体的色彩值由三个基色叠加而成,一张彩色图片就是由三个基色取不同的值叠加而成 。
那为什么还要转化到HSV色彩空间呢?因为RGB通道并不能很好地反映出物体具体的颜色信息,而相比RGB,HSV通过,色调、饱和度、能够非常直观的表达色彩的色调,明亮、与鲜艳程度,方便进行颜色之间的对比 。比如红色在HSV空间中H取值的范围为0~10和160~180,不同的色彩可以通过不同的H、S、V的不同取值范围进行区分,在下面转化二值化图片处理中就会使用HSV的取值范围 。