机器视觉 边缘检测算子

Posted 朱不住

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器视觉 边缘检测算子相关的知识,希望对你有一定的参考价值。

1.实验目的

利用opencv python实现对下图实现边缘检测算子。

2.实验过程

(1)在python安装opencv库, pip install opencv-python。

(2)在python安装Pillow库, pip install Pillow。同理,安装Numpy库。

(3)编写代码

代码如下:

import cv2
import numpy
import cv2 as cv
import numpy as np
from PIL import Image, ImageDraw, ImageFont
# coding=utf-8

# cv2解决绘制中文乱码
def cv2ImgAddText(img, text, left, top, textColor=(0, 255, 0), textSize=20):
    if (isinstance(img, numpy.ndarray)):  # 判断是否OpenCV图片类型
        img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
        # 创建一个可以在给定图像上绘图的对象
        draw = ImageDraw.Draw(img)
        # 字体的格式
        fontStyle = ImageFont.truetype("font/simsun.ttc", textSize, encoding="utf-8")
        # 绘制文本
        draw.text((left, top), text, textColor, font=fontStyle)
        # 转换回OpenCV格式
        return cv2.cvtColor(numpy.asarray(img), cv2.COLOR_RGB2BGR)

   
#图像反色
def inverse_color(image):
    height,width,temp = image.shape
    img2 = image.copy()
    for i in range(height):
        for j in range(width):
            img2[i,j]=(255-image[i,j][0],255-image[i,j][1],255-image[i,j][2])
    return img2 

#读取图像
src = cv2.imread("dip_switch_02.bmp")
#反色
one = inverse_color(src)
#加入文本信息
image1=cv2ImgAddText(one,"原图像",5, 5, (255, 0, 0), 20)
#显示图片
cv2.imshow("image1",image1)

#sobel算子边缘检测
sobelx = cv2.Sobel(one,cv2.CV_16S,1,0)
sobely = cv2.Sobel(one,cv2.CV_16S,0,1)
sobelx = cv2.convertScaleAbs(sobelx)
sobely = cv2.convertScaleAbs(sobely)
sobelXY = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
tow=inverse_color(sobelXY)
image2=cv2ImgAddText(tow,"sobel算子边缘检测结果",5, 5, (255, 0, 0), 20)
cv2.imshow("image2",image2)

#robert算子边缘检测
kernelx = np.array([[-1,0],[0,1]], dtype=int)
kernely = np.array([[0,-1],[1,0]], dtype=int)
x = cv2.filter2D(one, cv2.CV_16S, kernelx)
y = cv2.filter2D(one, cv2.CV_16S, kernely)
absX = cv2.convertScaleAbs(x)    
absY = cv2.convertScaleAbs(y)  
Roberts = cv2.addWeighted(absX,0.5,absY,0.5,0)
three=inverse_color(Roberts)
image3=cv2ImgAddText(three,"robert算子边缘检测结果",5, 5, (255, 0, 0), 20)
cv2.imshow("image3",image3)

#gauss算子边缘检测
gray_lap=cv2.Laplacian(one,cv2.CV_16S,ksize=5)
gauss_img=cv2.convertScaleAbs(gray_lap)
dst3=cv2.bitwise_not(gauss_img)
image4=cv2ImgAddText(dst3,"gauss算子边缘检测结果",5, 5, (255, 0, 0), 20)
cv2.imshow("image4",image4)
cv2.waitKey(0)# 等待键盘输入,不输入则无限等待
cv2.destroyAllWindows()

3.运行结果

运行结果如下图所示。


图3.1 原图像


图3.2 sobel算子边缘检测结果


图3.3 robert算子边缘检测结果


图3.4 gauss算子边缘检测结果

以上是关于机器视觉 边缘检测算子的主要内容,如果未能解决你的问题,请参考以下文章

计算机视觉图像处理面试笔试题整理——边缘检测

计算机视觉教程3-1:全面详解图像边缘检测算法(附Python实战)

基于zynq的OV5640摄像头的sobel算子边缘检测

边缘检测算子都有哪些?它们各有啥优缺点

计算机视觉——车道线(路沿)检测

高通滤波法微分算子法神经网络方法实现边缘检测