初学opencv/边缘检测

来源:互联网 发布:java api中文版 编辑:程序博客网 时间:2024/06/08 14:41

Sobel算子:是一种过滤器,只是其是带有方向的。
第一个参数是需要处理的图像;
第二个参数是图像的深度,-1表示采用的是与原图像相同的深度。目标图像的深度必须大于等于原图像的深度;
dx和dy表示的是求导的阶数,0表示这个方向上没有求导,一般为0、1、2。
ksize是Sobel算子的大小,必须为1、3、5、7。

Laplacian算子:
第一个参数是需要处理的图像;
第二个参数是图像的深度,-1表示采用的是与原图像相同的深度。目标图像的深度必须大于等于原图像的深度;
ksize是算子的大小,必须为1、3、5、7。默认为1。

Canny:
第一个参数是需要处理的原图像,该图像必须为单通道的灰度图;
第二个参数是阈值1;
第三个参数是阈值2。

#coding:utf-8"""opencv边缘检测"""import cv2import numpy as npimport matplotlib.pyplot as pltimg = cv2.imread('images/white.jpg',0)#sobel算子使用16位有符号的数据类型,防止截断,dx,dy求导阶数x = cv2.Sobel(img,cv2.CV_16S,1,0)y = cv2.Sobel(img,cv2.CV_16S,0,1)#用convertScaleAbs()函数将其转回原来的uint8形式uint8_x = cv2.convertScaleAbs(x)uint8_y = cv2.convertScaleAbs(y)#sobel算子在两个方向上加权,gamma表示加到最后结果上的值sobel_img = cv2.addWeighted(uint8_x,0.5,uint8_y,0.5,0)cv2.imshow('original img',img)cv2.imshow('sobel img',sobel_img)#laplacian算子,ksize是算子的大小,必须为1、3、5、7。默认为1lap = cv2.Laplacian(img,cv2.CV_16S,ksize = 3)#用convertScaleAbs()函数将其转回原来的uint8形式laplacian = cv2.convertScaleAbs(lap)cv2.imshow('laplacian img',laplacian)#高斯滤波器对图像降噪,横向和纵向滤波系数为0gaussianblur = cv2.GaussianBlur(img,(3,3),0)#canny边缘检测,阈值1,2检测图像中明显的边缘canny = cv2.Canny(gaussianblur,50,150)cv2.imshow('canny img',canny)cv2.waitKey(0)cv2.destroyAllWindows()

结果:

这里写图片描述

Sobel:
这里写图片描述

Laplacian:
这里写图片描述

Canny:
这里写图片描述