欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

opencv边缘检测算子

程序员文章站 2022-07-14 09:47:31
...

实验三 边缘检测算子

一、 实验目的
利用opencv或其他工具编写实现下图的sobel算子和robert算子边缘检测
opencv边缘检测算子

二、 实验过程
利用opencv python实现sobel算子和robert算子边缘检测
(1)在python安装opencv库
这个步骤我在第二个实验,图像滤波里写过了,就不再重复了。
(2)编写代码
代码如下:

import cv2 
import numpy as np

img = cv2.imread('E:\\dip_switch_02.bmp')
#反色
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
img1 = inverse_color(img)
cv2.imshow('image',img1)

#Sobel边缘检测算子
sobelx = cv2.Sobel(img1,cv2.CV_16S,1,0)
sobely = cv2.Sobel(img1,cv2.CV_16S,0,1)
sobelx = cv2.convertScaleAbs(sobelx)
sobely = cv2.convertScaleAbs(sobely)
sobelXY = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv2.imshow('sobel',inverse_color(sobelXY))

#Robert边缘检测算子
kernelx = np.array([[-1,0],[0,1]], dtype=int)
kernely = np.array([[0,-1],[1,0]], dtype=int)
x = cv2.filter2D(img1, cv2.CV_16S, kernelx)
y = cv2.filter2D(img1, cv2.CV_16S, kernely)
absX = cv2.convertScaleAbs(x)     
absY = cv2.convertScaleAbs(y)   
Roberts = cv2.addWeighted(absX,0.5,absY,0.5,0)
cv2.imshow('robert',inverse_color(Roberts))
cv2.waitKey(0)
cv2.destroyAllWindows()

三、 运行结果
opencv边缘检测算子

opencv边缘检测算子
opencv边缘检测算子

四、 问题及解决方法

(1)反色函数出现错误
opencv边缘检测算子
解决方法:
实现图像反色有两种方法:一种是对于灰度图,另一种是对于彩色图,我之前用的函数是实现灰度图的反色,这次的图片是彩色图,就不适用了。
实现图像反色:读取每个像素值P,再将255-P写入新的图片中;
对于灰度图,只有一个通道,所以 img2[i,j] = (255-image[i,j]) ;
对于彩色图片,则要RGB值分别做处理,255-image[i,j][0],255-image[i,j][1],255-image[i,j][2];

(2)在显示多个图片时,要注意窗口名称不能一致,否则只能显示一个窗口,后面的图像会取代前面的图像。

五、 实验总结

这次实验主要是利用opencv实现sobel算子和robert算子边缘检测,在做实验的过程中,我的收获如下:

  1. Sobel算子 Sobel算子是滤波算子的形式来提取边缘,X,Y方向各用一个模板,两个模板组合起来构成一个梯度算子。X方向模板对垂直边缘影响最大,Y方向模板对水平边缘影响最大。
  2. Robert算子 Robert算子是一种梯度算子,它用交叉的查分表示梯度,是一种利用局部差分算子寻找边缘的算子,对具有陡峭的低噪声的图像效果最好。在Python中,Roberts算子主要通过
    Numpy 定义模板,再调用 OpenCV的 filter2D() 函数实现边缘提取。该函数主要是利用内核实现对图像的卷积运算。
    通过实验,掌握了图像反色,sobel算子、robert算子边缘检测的方法。
相关标签: 机器视觉