优秀的编程知识分享平台

网站首页 > 技术文章 正文

机器视觉技术(一)边缘提取(机器视觉边缘检测)

nanyue 2024-09-11 05:21:19 技术文章 5 ℃

1.题目描述

机器视觉是人工智能正在快速发展的一个分支。简单说来,机器视觉就是用机器代替人眼来做测量和判断。它是一项综合技术,包括图像处理、机械工程技术、控制、电光源照明、光学成像、传感器、模拟与数字视频技术、计算机软硬件技术(图像增强和分析算法、图像卡、 I/O卡等)。

而在机器视觉中,一个非常基础的操作就是图像处理,而在图像处理中有一个十分重要的知识就是边缘提取。边缘提取,指数字图像处理中,对于图片轮廓的一个处理。对于边界处,灰度值变化比较剧烈的地方,就定义为边缘。也就是拐点,拐点是指函数发生凹凸性变化的点。和高数的导数有联系,将某个指定的物体的边缘进行提取出来。

本次实验中要用到的边缘提取技术是python+opencv,python是一种很方便的高级编程语言,代码量少,而OpenCV是一个基于BSD许可发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。用python+opencv可以很方便地进行边缘提取操作。从而感受机器视觉技术在现实中的实际应用。


2.实现过程

(1)下载python以及Anaconda开源包,并购配置好环境变量,配置好后在命令台检测python已经安装成功了。


(2)下载opencv_python

opencv_python是open配合python运行的工具,在网站

https://www.lfd.uci.edu/~gohlke/pythonlibs/

上可以选择下载:

这里选择下载opencv_python-4.0.0.21-cp37-cp37m-win_amd64.whl,然后在cmd输入pip install opencv_python-4.0.0.21-cp37-cp37m-win_amd64.whl即可完成opencv和opencv的python环境的安装。

安装成功后如下:


(3) 在sublime配置python

python的编辑器和编译器有很多,这里选择的是用十分简单的sublime,配置好sublime中的python后,先新建一个文件夹,并把需要边缘提取的图片放进去:

(4) 对图像进行阈值分割并反色

首先需要新建一个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)


(5) 边缘提取

下面就是边缘提取了,用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)

3.运行结果(效果)

图3-1 sublime中opencv显示图片

图3-2 转为灰度图


图3-3 反色显示图片

图3-4 边缘提取图片


4.问题及解决方法

由于python之前很熟练,且安装比较繁琐,因此这里只研究有关进行机器视觉的问题。

(1)安装python-opencv问题

问题一:no module named cv2

在安装的时候,代码中有anaconda,但导入的时候,还会有no module named cv2问题。我的解决办法是在windows中,直接找到对应的cv2.pyd,拷贝到python路径中。这样就成功了:

图4-1 正确安装cv2

问题二:在安装的时候遇到:

图4-2 未找到opencv_python问题

在搜索问题的时候发现是pip没有更新,这个时候输入pip install –upgrade pip成功了。

(2)代码问题

问题三:

图4-3 未能阈值切割问题


这个是之前的阈值分割函数:

cv2.threshold(image,80,255,cv2.THRESH_BINARY)

应该有两个返回值,其中的ret是获得一些相关信息进行设置的,也需要带上。

问题四:

图4-4 未能找到图片问题

这个问题是因为直接获得读取信息的参数,是一个读取结果,需要先转化为灰度图才行,加上下面的第一行代码即可。

img_gray = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)

# 对图像进行阈值分割,阈值设定为80,得到二值化灰度图

ret,image1 = cv2.threshold(img_gray,80,255,cv2.THRESH_BINARY)

# cv2.imshow('grayscale',image1)

Tags:

最近发表
标签列表