实验三 边缘检测算子
一、 实验目的
利用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算子边缘检测,在做实验的过程中,我的收获如下:
- Sobel算子 Sobel算子是滤波算子的形式来提取边缘,X,Y方向各用一个模板,两个模板组合起来构成一个梯度算子。X方向模板对垂直边缘影响最大,Y方向模板对水平边缘影响最大。
- Robert算子 Robert算子是一种梯度算子,它用交叉的查分表示梯度,是一种利用局部差分算子寻找边缘的算子,对具有陡峭的低噪声的图像效果最好。在Python中,Roberts算子主要通过
Numpy 定义模板,再调用 OpenCV的 filter2D() 函数实现边缘提取。该函数主要是利用内核实现对图像的卷积运算。
通过实验,掌握了图像反色,sobel算子、robert算子边缘检测的方法。