??机器视觉是人工智能正在快速发展的一个分支。简单说来,机器视觉就是用机器代替人眼来做测量和判断。它是一项综合技术,包括图像处理、机械工程技术、控制、电光源照明、光学成像、传感器、模拟与数字视频技术、计算机软硬件技术(图像增强和分析算法、图像卡、 I/O卡等)。
??下面介绍一些机器视觉的基础方法,用到的技术是python+opencv。python是一种很方便的高级编程语言,代码量少,而OpenCV是一个基于BSD许可发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
一:边缘提取
??在机器视觉中,一个非常基础的操作就是图像处理,而在图像处理中有一个十分重要的知识就是边缘提取。边缘提取,指数字图像处理中,对于图片轮廓的一个处理。对于边界处,灰度值变化比较剧烈的地方,就定义为边缘。也就是拐点,拐点是指函数发生凹凸性变化的点。和高数的导数有联系,将某个指定的物体的边缘进行提取出来。而用python+opencv可以很方便地进行边缘提取操作。
??步骤如下:
1.对图像进行阈值分割并反色
??首先需要新建一个python文件,导入cv2的库(OpenCV2的python库),并显示一张图片,代码为:
import cv2
# 读取本相对路径下的initial.bmp文件
image = cv2.imread ("initial.bmp")
# 将image对应图像在图像窗口显示出来
cv2.imshow(‘initial‘,image)
# waitKey使窗口保持静态直到用户按下一个键
cv2.waitKey(0)
??对图像进行阈值分割,阈值设定为80,得到二值化灰度图,代码为:
# 对图像进行阈值分割,阈值设定为80,得到二值化灰度图
ret,image1 = cv2.threshold(image,80,255,cv2.THRESH_BINARY)
cv2.imshow(‘grayscale‘,image1)
??将图像进行反色,代码如下:
image2 = image1.copy()# 复制图片
for i in range(0,image1.shape[0]):#image.shape表示图像的尺寸和通道信息(高,宽,通道)
for j in range(0,image1.shape[1]):
image2[i,j]= 255 - image1[i,j]
cv2.imshow(‘colorReverse‘,image2)
2.边缘提取
??下面就是边缘提取了,用findContours差影法或者Canny方法检测边缘,用原图像减去腐蚀后的收缩图像,提取边缘。代码如下:
# 边缘提取
img = cv2.cvtColor(image2,cv2.COLOR_BGR2GRAY)
canny_img_one = cv2.Canny(img,300,150)
canny_img_two = canny_img_one.copy()# 复制图片
for i in range(0,canny_img_one.shape[0]):#image.shape表示图像的尺寸和通道信息(高,宽,通道)
for j in range(0,canny_img_one.shape[1]):
canny_img_two[i,j]= 255 - canny_img_one[i,j]
cv2.imshow(‘edge‘,canny_img_two)
??最终我们就可以得到一个边缘提取后的图形,如下:
二:图像滤波
??图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。
??噪声就是由于成像系统、传输介质和记录设备等的不完善,数字图像在其形成、传输记录过程中或者在图像处理的某些环节当输入的像对象并不如预想时受到的污染。
??而图像滤波有很多种滤波方式,本次实验采用的滤波方式是均值滤波,中值滤波和高斯滤波,以及高斯边缘检测。
??均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标像素为中心的周围8个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。
??中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,