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

初学opencv/边缘检测

程序员文章站 2024-01-28 09:43:28
...

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 cv2
import numpy as np
import matplotlib.pyplot as plt

img = 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。默认为1
lap = cv2.Laplacian(img,cv2.CV_16S,ksize = 3)
#用convertScaleAbs()函数将其转回原来的uint8形式
laplacian = cv2.convertScaleAbs(lap)
cv2.imshow('laplacian img',laplacian)

#高斯滤波器对图像降噪,横向和纵向滤波系数为0
gaussianblur = 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()

结果:

初学opencv/边缘检测

Sobel:
初学opencv/边缘检测

Laplacian:
初学opencv/边缘检测

Canny:
初学opencv/边缘检测