opencv边缘检测算子

实验三 边缘检测算子

一、 实验目的
利用opencv或其他工具编写实现下图的sobel算子和robert算子边缘检测
在这里插入图片描述

二、 实验过程
利用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()

三、 运行结果
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

四、 问题及解决方法

(1)反色函数出现错误
在这里插入图片描述
解决方法:
实现图像反色有两种方法:一种是对于灰度图,另一种是对于彩色图,我之前用的函数是实现灰度图的反色,这次的图片是彩色图,就不适用了。
实现图像反色:读取每个像素值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算子边缘检测的方法。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值