书名:计算机视觉40例从入门到深度学习:OpenCV-Python
作者:李立宗
出版社:电子工业出版社
出版时间:2022-07-01
ISBN:9787121436857
一、缺陷检测
-
工业产品的形状缺陷不仅影响产品的美观,还影响产品的性能。
例如,应该是圆形的药品,若被加工成不规则圆形不仅看起来不美观,而且会因为剂量的改变而影响药效。
因此,在工业生产中人们对形状缺陷非常重视。 -
使用视觉算法进行缺陷检测可以解决人工操作带来的判断误差、效率低等问题。
二、理论基础
1、开运算
- 开运算进行的操作是先将图像腐蚀,再对腐蚀结果进行膨胀。
开运算可以用于去噪、计数等。
- 使用函数cv2.morphologyEx()实现开运算。
2、距离变换函数distanceTransform
-
若图像内的子图没有连接在一起,则可以直接使用形态学的腐蚀操作确定前景对象;
若图像内的子图连接在一起,则很难确定前景对象。
此时,借助距离变换函数distanceTransform可以方便地将前景对象提取出来。 -
距离变换函数distanceTransform可计算二值图像内任意点到最近背景点的距离。
一般情况下,该函数计算的是图像内像素值非0的像素点到最近的像素值为0的像素点的距离,即计算二值图像中所有像素点距离其最近的像素值为0的像素点的距离。
如果该像素点本身的像素值为0,则这个距离为0。 -
距离变换函数distanceTransform的计算结果反映了各个像素点与背景(像素值为0的像素点)的距离关系。通常情况下:
- 前景对象的质心(中心)距离像素值为0的像素点较远,会得到一个较大的值。
- 前景对象的边缘距离像素值为0的像素点较近,会得到一个较小的值。
-
如果对上述计算结果进行阈值处理,就可以得到图像内子图的质心、骨架等信息。
距离变换函数distanceTransform不仅能计算对象的质心,还能细化轮廓、获取图像前景对象等。
3、确定前景实例
1)分析
- 如果一些像素点距离背景点足够远,那么就认为这些点是前景点。
据此,先找出图中各个像素点距离(最近)背景点的距离,然后将这些距离中较大值对应的像素点判定为前景点。
2)方法
- 具体实现时,使用距离变换函数distanceTransform完成距离的计算,使用阈值分割函数threshold根据距离将所有像素点划分为前景点、背景点。
3)注意事项
- 需要注意的是,在使用距离变换函数distanceTransform前,需要先对图像进行开运算,以去除图像内的噪声。
4)步骤
- Step 1:图像预处理(利用开运算去噪)。
- Step 2:使用函数distanceTransform完成距离的计算。
- Step 3:使用函数threshold分割图像,获取确定前景。判断依据是,将距离背景大于一定长度(如最远距离的70%)的像素点判定为前景点。
- Step 4:显示处理结果。
5)程序
import numpy as np
import cv2
img = cv2.imread('d:\\water_coins.jpg')
cv2.imshow("coins",img)
# ====step1 预处理
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
kernel = np.ones((3,3),np.uint8)
opening = cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel, iterations = 2)
# ====step2 完成距离的计算=====
dist_transform = cv2.distanceTransform(opening,cv2.DIST_L2,5)
# ====step3 确定前景 ====
ret, fore = cv2.threshold(dist_transform,0.7*dist_transform.max(),255,0)
# ====step4 显示处理结果 ====
cv2.imshow("fore",fore)
cv2.waitKey()
cv2.destroyAllWindows()
运行结果
网友评论