python 机器视觉测量_python+opencv实现机器视觉基础技术(2)(宽度测量,缺陷检测,医学处理)...

本篇博客接着讲解机器视觉的有关技术和知识。包括宽度测量,缺陷检测,医学处理。python

一:宽度测量

在传统的自动化生产中,对于尺寸的测量,典型的方法就是千分尺、游标卡尺、塞尺等。而这些测量手段测量精度低、速度慢,没法知足大规模的自动化生产需求。基于机器视觉的尺寸测量属于非接触式的测量,具备检测精度高、速度快、成本低、安装简便等优势。能够检测零件的各类尺寸,如长度、圆、角度、线弧等测量。

利用python+opencv方法能够进行宽度的测量。步骤是先选取出一个矩形,而后进行阈值分割,再进行反色,边缘提取以后进行点的选择,输出坐标作出两条线段,根据线段进行矩形绘制,这样以后就能够计算两条直线之间的距离,也就是咱们须要求得的宽度。

OpenCV是一个c++库,用于实时处理计算机视觉方面的问题,涵盖了不少计算机视觉领域的模块。配合python调用c++库,能够很方便地进行宽度测量,实现要求。

步骤以下:

c++

1.导入须要的库

import cv2

import cv2 as cv

import numpy as np

import imutils

2.读取原图像查看

img = cv2.imread("1.jpg")

3.截取部分图像

手动地进行选取咱们感兴趣的部分,而后截取出来。算法

img = imutils.resize(img, width=500)

roi = cv2.selectROI(windowName="image1", img=img, showCrosshair=True, fromCenter=False)

x, y, w, h = roi

cv2.rectangle(img=img, pt1=(x, y), pt2=(x + w, y + h), color=(0, 0, 255), thickness=2)

s = img[y:y+h,x:x+w]

4.反色

截取后会出现空白区域不少黑色的状况,须要进行反色,用到的方法是255去除值。ssh

# 反色

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 = cv2.convertScaleAbs(x) # 转回uint8

absY = cv2.convertScaleAbs(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

import cv2 as cv

import numpy as np

from PIL import Image, ImageDraw, ImageFont

2.比较

读入咱们0.bmp图像做为比较因子,设置为rgbimage_std变量ui

rgbimage_std = cv.imread("0.bmp")

3.转换

将24位rgbimage_std彩色图像转换为8位rgb2grayimage_std灰度图像spa

rgb2grayimage_std = cv2.cvtColor(rgbimage_std, cv2.COLOR_RGB2GRAY)

4.循环

缺陷检测算法循环六次。3d

imagename = str(i) + '.bmp'

rgbimage_defect = cv.imread(imagename)

# 将每次imagename对应图像在图像窗口显示出来

# cv.imshow(imagename, rgbimage_defect)

# 将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 = cv2.compareHist(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 = ImageFont.truetype(r'C:\Windows\Fonts\simsun.ttc', 50)

# 若是图片对比原图类似度小于7,则合格;不然不合格。

if result < 7:

draw.text((5, 10), u'合格', fill='red', font=fnt)

th_str = str(i) + '.bmp'

draw.text((5, 350), th_str, fill='red', font=fnt)

else:

draw.text((5, 10), u'不合格', fill='red', font=fnt)

th_str = str(i) + '.bmp'

draw.text((5, 350), th_str, fill='red', font=fnt)

ss.show("result" +str(i) + ".png")

5.结束代码

cv.waitKey(0)

三:医学检测

医学信息处理,即对医学信息的处理,医学信息处理过程当中借助计算机技术,具备很是高的应用价值,在提升信息处理准确度的同时,也极大地加强了信息处理的效率,为广大患者与患者家眷创造更为人性化的就医环境。

利用计算机的先进技术能够对医学图像进行处理,而后更加方便地获得图片上蕴含的信息,从而进行正快速地获得咱们想要获得的信息。

这里是用python+opencv进行医学图像识别,借助计算机技术帮助医生对医学图像进行有效地分析。

步骤以下:

1.导入库

from skimage import data,color,morphology

import cv2 as cv

import cv2

2.读入灰度图

img1 = cv.imread('vas0.bmp',0)

3.反色

img3 = img2.copy()

cv2.threshold(img2,80,255,0,img2)

for i in range(0,img2.shape[0]):

for j in range(0,img2.shape[1]):

img3[i,j] = 255-img2[i,j]

或者以下代码:

# 对img2图像图像进行反色,获得img3图像

def access_pixels(image):

height, width, channels = image.shape

for row in range(height):

for list in range(width):

for c in range(channels):

pv = image[row, list, c]

image[row, list, c] = 255 - pv

return image

img3 = access_pixels(img2)

4.扩展

img4 = cv2.copyMakeBorder(img3,50,50,50,50,cv2.BORDER_REFLECT)

5.去噪

去除噪声位置地小面积区域,能够有两种方式,一种是选择知足面积150-10000的img4图像输出,去除噪声位置元素,另外一种是使用Skimage中的形态学处理来进行孤立小区域的去除。

img5 = morphology.remove_small_holes(img4, 100)

或者以下代码:

contours,hierarchy = cv2.findContours(img4, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

#消除小面积

for i in range(len(contours)):

area = cv2.contourArea(contours[i])

if area < 150:

cv2.drawContours(img4,[contours[i]],0,0,-1)

img5 = img4

6.面积滤波

用连通区域的面积除以连通区域包络盒的面积,仅保留当这个比值小于用户所给的div的值时的连通区域。

img5=img5.copy()

contours1,hierarchy = cv2.findContours(img5, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

for j in range(len(contours1)):

area1 = cv2.contourArea(contours1[j])

print(area1)

if area1 ==157.0:

cv2.drawContours(img5,[contours1[j]],0,0,-1)

elif area1==261.5:

cv2.drawContours(img5,[contours1[j]],0,0,-1)

elif area1==568.0:

cv2.drawContours(img5,[contours1[j]],0,0,-1)

7.细化函数

输入须要细化的图片(通过二值化处理的图片)和映射矩阵array,并提取骨架。

def Thin(image, array):

h, w = image.shape

iThin = image

for i in range(h):

for j in range(w):

if image[i, j] == 0:

a = [1] * 9

for k in range(3):

for l in range(3):

# 若是3*3矩阵的点不在边界且这些值为零,也就是黑色的点

if -1 < (i - 1 + k) < h and -1 < (j - 1 + l) < w and iThin[i - 1 + k, j - 1 + l] == 0:

a[k * 3 + l] = 0

sum = a[0] * 1 + a[1] * 2 + a[2] * 4 + a[3] * 8 + a[5] * 16 + a[6] * 32 + a[7] * 64 + a[8] * 128

iThin[i, j] = array[sum] * 255

return iThin

# 映射表

array = [0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1,\

1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1,\

0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1,\

1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1,\

1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\

0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\

1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1,\

0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\

0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1,\

1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1,\

0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1,\

1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,\

1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\

1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,\

1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0,\

1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0]

src = cv2.imread(r'img5.png', 0)

Gauss_img = cv2.GaussianBlur(src, (3,3), 0)

# 自适应二值化函数,须要修改的是55那个位置的数字,越小越精细,细节越好,噪点更多,最大不超过图片大小

adap_binary = cv2.adaptiveThreshold(Gauss_img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY,3,2)

img6 = Thin(adap_binary, array)

8.边缘检测

img7 = cv2.Canny(img6,80,255)

9.图片反色

img8 = img7.copy()

cv2.threshold(img7,80,255,0,img7)

for i in range(0,img7.shape[0]):

for j in range(0,img7.shape[1]):

img8[i,j] = 255-img7[i,j]

10.结束函数

cv.waitKey(0)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422379.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html怎样调取css,css怎么调用?

CSS不仅可以静态地修饰网页&#xff0c;还可以配合各种脚本语言动态地对网页各元素进行格式化。CSS能够对网页中元素位置的排版进行像素级精确控制&#xff0c;支持几乎所有的字体字号样式&#xff0c;拥有对网页对象和模型样式编辑的能力。那么在HTML网页中css该如何调用呢&am…

架构重构改善既有代码的设计

&#xff08;本文摘自2010技术应用计划相关章节&#xff09;当架构模型进行迭代的过程中&#xff0c;必然伴随着对模型进行修改和改进。我们如何防止对模型的修改&#xff0c;又如何保证对模型进行正确的改进&#xff1f; Context 架构模型通过精化、合并等活动之后&#xff0c…

计算机专业sci二区论文难吗,通信专业二区sci难吗

我们知道sci被划分成了四个分区&#xff0c;从一区到四区的刊物投稿难度依次降低。通信专业二区sci难吗?二区所收录的通信专业期刊有很多&#xff0c;投稿难度不一&#xff0c;而且针对不同的作者和不同的情况&#xff0c;每个人都会有不同的感受&#xff0c;以下是针对通信专…

40幅五彩缤纷的秋天风景摄影作品欣赏(上篇)

秋天的美是成熟的--它不像春那么羞涩&#xff0c;夏那么坦露&#xff0c;冬那么内向&#xff1b;秋&#xff0c;收获的季节&#xff0c;金黄的季节&#xff0c;同春一样可爱&#xff0c;同夏一样热情&#xff0c;同冬一样迷人。今天这篇文章和大家分享40幅五彩缤纷的秋天风景摄…

python编程工具是什么_python编程应该用什么工具

python编程应该用什么工具发布时间&#xff1a;2020-11-05 11:16:20来源&#xff1a;亿速云阅读&#xff1a;101作者&#xff1a;小新小编给大家分享一下python编程应该用什么工具&#xff0c;相信大部分人都还不怎么了解&#xff0c;因此分享这篇文章给大家参考一下&#xff0…

计算机接口教程,运用接口实现计算机各组件信息

实现思路定义计算机组成部分定义CPU的接口CPU&#xff0c;返回CPU品牌和主频定义内存的接口EMS,返回容量定义硬盘接口HardDsik,返回容量实现计算机各组件信息编写各组件厂商分别实现CPU EMS 和HardDisk接口&#xff0c;编写计算机类&#xff0c;组装计算机并显示相关信息编写测…

[调试]Asp.Net常见问题

“/”应用程序中的服务器错误。 无法向会话状态服务器发出会话状态请求。请确保 ASP.NET State Service (ASP.NET 状态服务)已启动&#xff0c;并且客户端端口与服务器端口相同。如果服务器位于远程计算机上&#xff0c;请检查 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Se…

python调用手机蓝牙_米家生态出品,易锁宝蓝牙U型锁,让开锁更灵活

由于工作室的外门是传统老式铁艺门&#xff0c;没办法改指纹锁&#xff0c;只能一直用传统的U型锁来锁住。但是经常出现尴尬的情况就是&#xff0c;到了楼下发现忘带钥匙。再加上最近原本的U型锁出现小问题&#xff0c;开锁不那么顺畅了。所以在换U型锁的时候&#xff0c;选了一…

视频剪辑计算机配置要求,对于视频剪辑工作,需要什么样的电脑配置才满足要求...

(文章来源&#xff1a;网络整理)目前有很多的自媒体出现&#xff0c;自媒体入门要求不高&#xff0c;且能让不同层面、不同行业的人员加入进来。但是即便入门简单&#xff0c;还是要会一些简单的剪辑软件的使用的&#xff0c;一般剪辑视频软件对电脑的性能有一定要求&#xff0…

[0630]Tyvj 1063 数字串

描述给你一个长度为n的数字串&#xff0c;数字串里会包含1-m这些数字。如果连续的一段数字子串包含了1-m这些数字&#xff0c;则称这个数字字串为NUM串。你的任务是求出长度最短的NUM串是什么&#xff0c;只需要输出这个长度即可。输入输入数据有多组第一行给定n和m。 &#xf…

python 线程池回收_python实现线程池

这段时间一直在做一个爬虫系统&#xff0c;用python和django实现。其中涉及到了多线程的问题&#xff0c;在后端使用一个全局的字典用来保存和识别已经运行的线程。但是觉得这样的实现不是不太舒服。于是想找到一个更好的实现&#xff0c;这就想到了线程池这个概念。线程池的概…

武汉大学计算机学院有什么实验室,武汉大学计算机学院实验室 - 安全牛课堂 - 领先的信息安全在线教育平台...

{"i18nChapterName": "章","i18nUnitName": "节","i18nLessonName": "课时","i18nTaskName":"任务"}{"text": {"icon": "es-icon es-icon-graphic","nam…

nHibernate Mapping By Code - Introduction

nHibernate 3.2新增了一种mapping by code的映射策略&#xff0c;很有意思。你可以自定义约定&#xff0c;并且按照约定定制自动映射策略&#xff0c;面对遗留数据库时这个功能往往很有用&#xff0c;另外&#xff0c;由于mapping by code是基于代码的&#xff08;而不是xml文件…

android绘制环形进度_Android动态自定义圆形进度条

这篇文章主要介绍了Android动态自定义圆形进度条,需要的朋友可以参考下效果图&#xff1a;A.绘制圆环&#xff0c;圆弧&#xff0c;文本//1.画圆环//原点坐标float circleX width / 2;float circleY width / 2;//半径float radius width / 2 - roundWidth / 2;//设置画笔的属…