python3环境下使用opencv3实现边缘检测

2025-12-19 21:56:52

1、边缘检测有多种方法,一般步骤为:

1)高斯模糊

2)灰度变化

3)梯度检测

4)输出或得出结论进行下一步处理。

本文限于篇幅,使用最经典的索贝尔(sobel)算子实现梯度计算。

高斯模糊也不予考虑。

       Sobel算子结合高斯平滑与微分求导,抗噪声能力强,效率较高,对细纹理处理一般。用于计算图像灰度函数的近似梯度。 利用导数求解边缘,像素差别大则切点越陡峭。也符合边缘特征(阶跃,屋顶)

      它包含两组3x3的矩阵(横向及纵向模板),算子和图像作平面卷积分别得出横向及纵向的亮度差分近似值。

    

python3环境下使用opencv3实现边缘检测

2、为了简单,自己构建了一个米框图,便于观察!

import cv2 as cvimport numpy as npimport matplotlib.pyplot as plt

image = cv.imread('c:\\black_MiLine.png',0)cv.imshow('image',image)cv.waitKey(0)

python3环境下使用opencv3实现边缘检测

3、采用函数简介

Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]])进行计算。

src: 图像;

ddepth:图像的深度,-1表示与原图像相同深度。(目标图像的深度必须大于等于原图像的深度);

dx和dy表示的是求导的阶数,0表示这个方向上没有求导(一般为0、1、2);

ksize是Sobel算子的大小,必须为1、3、5、7;

scale是缩放导数的比例常数,默认无伸缩系数;

delta是可选增量,会加到最终dst,默认无额外的值加入dst;

borderType 图像边界的模式 默认值为cv.BORDER_DEFAULT。

----------------------------------------------------------------------

计算sobelx检查该方向变化

sobelx = cv.Sobel(image, cv.CV_64F, 1, 0, ksize=3)

cv.imshow('sobelx',sobelx)

Scale_absX = cv.convertScaleAbs(sobelx)  print(Scale_absX)

根据图像可看出成功检测非水平的边缘!

python3环境下使用opencv3实现边缘检测

4、计算sobely检查该方向变化

sobely = cv.Sobel(image, cv.CV_64F, 0, 1, ksize=3)

cv.imshow('sobely',sobely)

Scale_absY = cv.convertScaleAbs(sobely)

print(Scale_absY)

python3环境下使用opencv3实现边缘检测

5、同时检测XY方向

sobelxy = cv.Sobel(image, cv.CV_64F, 1, 1, ksize=3)

cv.imshow('sobelxy',sobelxy)

cv.waitKey(0)

水平垂直都没了! 有效果!

python3环境下使用opencv3实现边缘检测

6、配重后输出:这个是没有convertScaleAbs的数值:

result0 = cv.addWeighted(sobelx, 0.5, sobely, 0.5, 0)

cv.imshow('result0',result0)

python3环境下使用opencv3实现边缘检测

7、配重后输出:这个是有convertScaleAbs的数值:

result1 = cv.addWeighted(Scale_absX, 0.5, Scale_absY, 0.5, 0)

cv.imshow('result1',result1)

cv.waitKey(0)

对比两种情况结果 发现convertScaleAbs处理后的在本例效果好一些

python3环境下使用opencv3实现边缘检测

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢