python+opencv实现机器视觉基础技术(2)(宽度测量,缺陷检测,医学处
理)
  本篇博客接着讲解机器视觉的有关技术和知识。包括宽度测量,缺陷检测,医学处理。
⼀:宽度测量
  在传统的⾃动化⽣产中,对于尺⼨的测量,典型的⽅法就是千分尺、游标卡尺、塞尺等。⽽这些测量⼿段测量精度低、速度慢,⽆法满⾜⼤规模的⾃动化⽣产需求。基于机器视觉的尺⼨测量属于⾮接触式的测量,具有检测精度⾼、速度快、成本低、安装简便等优点。可以检测零件的各种尺⼨,如长度、圆、⾓度、线弧等测量。
  利⽤python+opencv⽅法可以进⾏宽度的测量。步骤是先选取出⼀个矩形,然后进⾏阈值分割,再进⾏反⾊,边缘提取之后进⾏点的选择,输出坐标做出两条线段,根据线段进⾏矩形绘制,这样之后就可以计算两条直线之间的距离,也就是我们需要求得的宽度。
  OpenCV是⼀个c++库,⽤于实时处理计算机视觉⽅⾯的问题,涵盖了很多计算机视觉领域的模块。配合python调⽤c++库,可以很⽅便地进⾏宽度测量,实现要求。
  步骤如下:
1.导⼊需要的库
import cv2
import cv2 as cv
import numpy as np
import imutils
2.读取原图像查看
img = cv2.imread("1.jpg")
3.截取部分图像
  ⼿动地进⾏选取我们感兴趣的部分,然后截取出来。
img = size(img, width=500)
roi = cv2.selectROI(windowName="image1", img=img, showCrosshair=True, fromCenter=False)
x, y, w, h = roi
s = img[y:y+h,x:x+w]
4.反⾊
  截取后会出现空⽩区域很多⿊⾊的情况,需要进⾏反⾊,⽤到的⽅法是255去除值。
# 反⾊
def colorReverse(src):
height, width, channels = src.shape
for row in range(height):
for list in range(width):
for c in range(channels):
pv = src[row,list, c]
src[row,list, c]=255- pv
return src
src = colorReverse(s)
5.边缘检测去噪
x = cv2.Sobel(src,cv2.CV_16S,1,0)
y = cv2.Sobel(src,cv2.CV_16S,0,1)
absX = vertScaleAbs(x)# 转回uint8
absY = vertScaleAbs(y)
dst = cv2.addWeighted(absX,0.5,absY,0.5,0)
result = colorReverse(dst)
6.输出⿏标选择点的坐标
  之后进⾏的操作是利⽤⿏标选择点,并显⽰坐标,可以判断时候⽤⿏标进⾏点击操作,如果是的话,就可以输出点的坐标在输出框或者图⽚上标记,把点击函数作为参数,就可以在不点击退出键的时候进⾏循环递归操作,知道最直到获得想要点的坐标。
# 输出⿏标选择点的坐标
# setMouseCallback使⽤的回调函数,这个回调函数在捕获到⿏标左键点击事件时,就在图⽚上点击处绘制⼀个实⼼的圆、并显⽰出坐标。
def on_EVENT_LBUTTONDOWN(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDOWN:
xy ="%d,%d"%(x, y)
print(xy)
cv2.circle(result,(x, y),1,(255,0,0), thickness =-1)
cv2.putText(result, xy,(x, y), cv2.FONT_HERSHEY_PLAIN,
1.0,(0,0,0), thickness =1)
cv2.imshow("image2", result)
cv2.namedWindow("image2")
cv2.setMouseCallback("image2", on_EVENT_LBUTTONDOWN)
cv2.imshow("image2", result)
7.绘制线段⽤输出提⽰
  接下来就可以根据选择的四个点进⾏连接输出线段,⽤get_len()⽅法可以得到两条线之间的距离。
s = cv2.line(result,(3,30),(120,30),(0,255,0),2)
d = cv2.line(result,(3,110),(118,110),(0,255,0),2)
lens = s.get_len()- d.get_len()
# 输出图形
text ="宽为:{0}".format(lens)
cv.putText(result, text,(20,20), cv.FONT_HERSHEY_COMPLEX,2.0,(0,255,0),1)
⼆:缺陷检测
  缺陷检测通常是指对物品表⾯缺陷的检测,表⾯缺陷检测是采⽤先进的机器视觉检测技术,对⼯件表⾯的斑点、凹坑、划痕、⾊差、缺损等缺陷进⾏检测。
  ⼈⼯检测是产品表⾯缺陷的传统检测⽅法,该⽅法抽检率低、准确性不⾼、实时性差、效率低、劳动强度⼤、受⼈⼯经验和主观因素的影响⼤,⽽基于机器视觉的检测⽅法可以很⼤程度上克服上述弊端。
  缺陷检测被⼴泛使⽤于布匹瑕疵检测、⼯件表⾯质量检测、航空航天领域等。传统的算法对规则缺陷以及场景⽐较简单的场合,能够很好⼯作,但是对特征不明显的、形状多样、场景⽐较混乱的场合,则不再适⽤。近年来,基于深度学习的识别算法越来越成熟,许多公司开始尝试把深度学习算法应⽤到⼯业场合中。
  视觉表⾯缺陷检测系统基本组成主要包括图像获取模块、图像处理模块、图像分析模块、数据管理及⼈机接⼝模块。
  这⾥是⽤python+opencv进⾏津彩啤酒的图⽚缺陷检测,将0.bmp图⽚进⾏样本,和其他图⽚进⾏对⽐,检测是否合格。通过对⽐原图和要⽐较的图像的24位灰度图像进⾏检测。
  步骤如下:
1.导⼊需要的库
import cv2 as cv
import numpy as np
from PIL import Image, ImageDraw, ImageFont
2.⽐较
  读⼊我们0.bmp图像作为⽐较因⼦,设置为rgbimage_std变量rgbimage_std = cv.imread("0.bmp")
3.转换
  将24位rgbimage_std彩⾊图像转换为8位rgb2grayimage_std灰度图像rgb2grayimage_std = cv2.cvtColor(rgbimage_std, cv2.COLOR_RGB2GRAY)
4.循环
  缺陷检测算法循环六次。
imagename =str(i)+'.bmp'
rgbimage_defect = cv.imread(imagename)
# 将每次imagename对应图像在图像窗⼝显⽰出来
# cv.imshow(imagename, rgbimage_defect)
rectangle函数opencv# 将24位rgbimage_defect彩⾊图像转换8位rgb2grayimage_defect灰度图
gray = np.array(rgbimage_defect)
gray = gray[:,:,0]
rgb2grayimage_defect = np.array([gray,gray,gray])
rgb2grayimage_defect = np.transpose(rgb2grayimage_defect,(1,2,0))
name =str(i)+'_rgb2grayimage_defect.bmp'
# cv.imshow(name, rgb2grayimage_defect)
# 缺陷⽐较
# 直⽅图计算的函数,反应灰度值的分布情况
be_compare_image = cv2.calcHist([rgb2grayimage_std],[0],None,[256],[0.0,255.0])
compare_image = cv2.calcHist([rgb2grayimage_defect],[0],None,[256],[0.0,255.0])
#相关性计算,采⽤相关系数的⽅式
# result = cv2pareHist(be_compare_image,compare_image,method=cv2.HISTCMP_CORREL) result =sum(be_compare_image - compare_image)[0]
# 打开PIL创建的图像
ss = Image.open(str(i)+".bmp")
# 创建⼀个操作对象
draw = ImageDraw.Draw(ss)
# 字体对象为simsun,字⼤⼩为50号
fnt = uetype(r'C:\Windows\',50)
# 如果图⽚对⽐原图相似度⼩于7,则合格;否则不合格。
if result <7:
<((5,10), u'合格', fill='red', font=fnt)
th_str =str(i)+'.bmp'
<((5,350), th_str, fill='red', font=fnt)
else:
<((5,10), u'不合格', fill='red', font=fnt)
th_str =str(i)+'.bmp'
<((5,350), th_str, fill='red', font=fnt)
ss.show("result"+str(i)+".png")

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。