OpenCV 08(图像滤波器 算子)

这篇具有很好参考价值的文章主要介绍了OpenCV 08(图像滤波器 算子)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、 索贝尔(sobel)算子

边缘是像素值发生跃迁的位置,是图像的显著特征之一,在图像特征提取,对象检测,模式识别等方面都有重要的作用。

人眼如何识别图像边缘?

比如有一幅图,图里面有一条线,左边很亮,右边很暗,那人眼就很容易识别这条线作为边缘.也就是**像素的灰度值快速变化的地方**.

sobel算子对图像求一阶导数。一阶导数越大,说明像素在该方向的变化越大,边缘信号越强。

因为图像的灰度值都是离散的数字, sobel算子采用离散差分算子计算图像像素点亮度值的近似梯度.

图像是二维的,即沿着宽度/高度两个方向.
我们使用两个卷积核对原图像进行处理:

- 水平方向

OpenCV 08(图像滤波器 算子),opencv,人工智能,计算机视觉

- 垂直方向

OpenCV 08(图像滤波器 算子),opencv,人工智能,计算机视觉

这样的话,我们就得到了两个新的矩阵,分别反映了每一点像素在水平方向上的亮度变化情况和在垂直方向上的亮度变换情况.

**综合考虑这两个方向的变化**,我们使用以下公式反映某个像素的梯度变化情况.

OpenCV 08(图像滤波器 算子),opencv,人工智能,计算机视觉

有时候为了简单起见,也直接用绝对值相加替代

OpenCV 08(图像滤波器 算子),opencv,人工智能,计算机视觉

# 索贝尔算子.
import cv2
import numpy as np


#导入图片
img = cv2.imread('./chess.png')#
# x轴方向, 获取的是垂直边缘
dx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5)
dy = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=5)

# 可利用numpy的加法, 直接整合两张图片
# dst = dx + dy
# 也可利用opencv的加法
dst = cv2.add(dx, dy)
cv2.imshow('dx', np.hstack((dx, dy, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()

OpenCV 08(图像滤波器 算子),opencv,人工智能,计算机视觉

二、沙尔(Scharr)算子

- Scharr(src, ddepth, dx, dy[, dst[, scale[, delta[, borderType]]]])
- 当内核大小为 3 时, 以上Sobel内核可能产生比较明显的误差(Sobel算子只是求取了导数的近似值)。 为解决这一问题,OpenCV提供了 Scharr函数,但该函数仅作用于大小为3的内核。该函数的运算与Sobel函数一样快,但结果却更加精确.

- Scharr算子和Sobel很类似, 只不过使用不同的kernel值, 放大了像素变换的情况:

OpenCV 08(图像滤波器 算子),opencv,人工智能,计算机视觉

- Scharr算子只支持3 * 3 的kernel所以没有kernel参数了.

- Scharr算子只能求x方向或y方向的边缘.

- Sobel算子的ksize设为-1就是Scharr算子. 

- Scharr擅长寻找细小的边缘, 一般用的较少.

# 索贝尔算子.
import cv2
import numpy as np


#导入图片
img = cv2.imread('./lena.png')#
# x轴方向, 获取的是垂直边缘
dx = cv2.Scharr(img, cv2.CV_64F, 1, 0)
# y轴方向, 获取的是水平边缘
dy = cv2.Scharr(img, cv2.CV_64F, 0, 1)

# 可利用numpy的加法, 直接整合两张图片
# dst = dx + dy
# 也可利用opencv的加法
dst = cv2.add(dx, dy)
cv2.imshow('dx', np.hstack((dx, dy, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()

OpenCV 08(图像滤波器 算子),opencv,人工智能,计算机视觉

三、拉普拉斯算子

索贝尔算子是模拟一阶求导,导数越大的地方说明变换越剧烈,越有可能是边缘.

OpenCV 08(图像滤波器 算子),opencv,人工智能,计算机视觉

那如果继续对f'(t)求导呢?

OpenCV 08(图像滤波器 算子),opencv,人工智能,计算机视觉

可以发现"边缘处"的二阶导数=0, 我们可以利用这一特性去寻找图像的边缘. **注意有一个问题,二阶求导为0的位置也可能是无意义的位置**.

- **拉普拉斯算子推导过程**

- 以x方向求解为例:
    一阶差分:f'(x) = f(x) - f(x - 1)
    二阶差分:f''(x) = f'(x+1) - f'(x) = (f(x + 1) - f(x)) - (f(x) - f(x - 1))
    化简后:f''(x) = f(x - 1) - 2 f(x)) + f(x + 1)

    同理可得: f''(y) = f(y - 1) - 2 f(y)) + f(y + 1)

    把x,y方向的梯度叠加在一起.

    $f''(x,y) = f''_x(x,y) + f''_y(x,y)$

    $f''(x,y) = f(x - 1, y) - 2 f(x,y)) + f(x + 1, y) + f(x, y - 1) - 2 f(x,y)) + f(x,y + 1)$

    $f''(x,y) = f(x - 1, y) + f(x + 1, y) + f(x, y - 1) + f(x,y + 1) - 4 f(x,y)) $

这个等式可以用矩阵写成:

OpenCV 08(图像滤波器 算子),opencv,人工智能,计算机视觉

这样就得到了拉普拉斯算子的卷积核即卷积模板.

 

- Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]])

- 可以同时求两个方向的边缘
- 对噪音敏感, 一般需要先进行去噪再调用拉普拉斯

# 拉普拉斯
import cv2
import numpy as np


#导入图片
img = cv2.imread('./chess.png')#
dst = cv2.Laplacian(img, -1, ksize=3)

cv2.imshow('dx', np.hstack((img, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()

OpenCV 08(图像滤波器 算子),opencv,人工智能,计算机视觉

OpenCV 08(图像滤波器 算子),opencv,人工智能,计算机视觉

一般变为灰度图,然后找边缘

四、边缘检测Canny

*Canny 边缘检测算法* 是 John F. Canny 于 1986年开发出来的一个多级边缘检测算法,也被很多人认为是边缘检测的 *最优算法*, 最优边缘检测的三个主要评价标准是:

> - **低错误率:** 标识出尽可能多的实际边缘,同时尽可能的减少噪声产生的误报。
> - **高定位性:** 标识出的边缘要与图像中的实际边缘尽可能接近。
> - **最小响应:** 图像中的边缘只能标识一次。

- Canny边缘检测的一般步骤

  •  去噪. 边缘检测容易受到噪声影响, 在进行边缘检测前通常需要先进行去噪, 一般用高斯滤波去除噪声.
  •  计算梯度: 对平滑后的图像采用sobel算子计算梯度和方向.

OpenCV 08(图像滤波器 算子),opencv,人工智能,计算机视觉

OpenCV 08(图像滤波器 算子),opencv,人工智能,计算机视觉

  •   梯度的方向被归为四类: 垂直, 水平和两个对角线.
  •   计算出来的梯度和方向大概如下图:

OpenCV 08(图像滤波器 算子),opencv,人工智能,计算机视觉

  • 非极大值抑制

    - 在获取了梯度和方向后, 遍历图像, 去除所有不是边界的点.

    - 实现方法: 逐个遍历像素点, 判断当前像素点是否是周围像素点中具有相同方向梯度的最大值.

    - 下图中, 点A,B,C具有相同的方向, 梯度方向垂直于边缘.

    - 判断点A是否为A,B,C中的局部最大值, 如果是, 保留该点;否则,它被抑制(归零)

OpenCV 08(图像滤波器 算子),opencv,人工智能,计算机视觉

    - 更形象的例子:

 

OpenCV 08(图像滤波器 算子),opencv,人工智能,计算机视觉

  • 滞后阈值

OpenCV 08(图像滤波器 算子),opencv,人工智能,计算机视觉

Canny(img, minVal, maxVal, ...)

# Canny
import cv2
import numpy as np


#导入图片
img = cv2.imread('./lena.png')#
# 阈值越小, 细节越丰富
lena1 = cv2.Canny(img, 100, 200)
lena2 = cv2.Canny(img, 64, 128)

cv2.imshow('lena', np.hstack((lena1, lena2)))
cv2.waitKey(0)
cv2.destroyAllWindows()

OpenCV 08(图像滤波器 算子),opencv,人工智能,计算机视觉文章来源地址https://www.toymoban.com/news/detail-708568.html

到了这里,关于OpenCV 08(图像滤波器 算子)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • opencv011 滤波器03 高斯滤波

    今天来学习一下高斯滤波!高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。  高斯函数是符合高斯

    2024年01月24日
    浏览(40)
  • OpenCv之滤波器

    目录 一、卷积  二、方盒滤波与均值滤波 三、高斯滤波 四、中值滤波 五、双边滤波 图像卷积就是卷积核在图像上按行华东遍历像素时不断的相乘求和的过程  相关知识点: 步长:就是卷积核在图像上移动的步幅.(为充分扫描图片,步长一般为1) padding:指在图片周围填充的0的圈

    2024年02月16日
    浏览(34)
  • 【C++】【图像处理】均值滤波 and 高斯滤波 and 中值滤波 (低通滤波器)and Sobel算子边缘提取算法解析(以.raw格式的图像为基础进行图像处理、gray levels:256)

     中值滤波: 中值滤波中的MidValueFind函数的实现就是冒泡排序,最后去中间值返回:  Soble算子边缘提取:     总结: 1、均值、高斯滤波和Sobel算子边缘提取的核心,创建卷积核并确定各个点上的权重,然后将边缘灰度级归零(是否边缘归零按业务需求决定),提取非边缘像

    2024年02月05日
    浏览(56)
  • Opencv中的滤波器

    一副图像通过滤波器得到另一张图像,其中滤波器又称为卷积核,滤波的过程称之为卷积。 这就是一个卷积的过程,通过一个卷积核得到另一张图片,明显发现新的到的图片边缘部分更加清晰了(锐化)。  上图就是一个卷积的过程,下面的是原始图像,上面的是卷积核。卷

    2024年01月22日
    浏览(38)
  • opencv009 滤波器01(卷积)

    图像卷积操作(convolution),或称为核操作(kernel),是进行图像处理的一种常用手段, 图像卷积操作的目的是利用像素点和其邻域像素之前的空间关系,通过加权求和的操作,实现模糊(blurring),锐化(sharpening),边缘检测(edge detection)等功能。 期末考试结束!又开始

    2024年01月22日
    浏览(47)
  • Halcon滤波器 laplace 算子

    使用laplace 算子对图像进行二次求导,会在边缘产生零点,因此该算子常常与zero_crossing算子配合使用。求出这些零点,也就得到了图像的边缘。同时,由于laplace算子对孤立像素的响应要比对边缘或线的响应更强烈,因此在检测之前应先进行去噪处理。 该算子的原型如下: 其

    2024年02月01日
    浏览(41)
  • Halcon边缘滤波器edges_image 算子

    基于Sobel滤波器的边缘滤波方法是比较经典的边缘检测方法。除此之外,Halcon也提供了一些新式的边缘滤波器,如edges_image算子。它使用递归实现的滤波器(如Deriche、Lanser和Shen)检测边缘,也可以使用高斯导数滤波器检测边缘。此外,edges_image算子也提供了非极大值抑制和滞

    2024年01月21日
    浏览(39)
  • 【图像处理:频率域平滑与锐化】理想滤波器,巴特沃思滤波器,高斯滤波器

    本文主要介绍频率域滤波器,此处的频率域是基于傅立叶变换得出。 在一幅图像中, 低频对应图像变化缓慢的部分 ,即图像大致外观和轮廓。 高频部分对应图像变化剧烈的部分即图像细节 。低通滤波器的功能是让低频率通过而滤掉或衰减高频,其作用是过滤掉包含在高频

    2024年02月04日
    浏览(55)
  • 图像处理之高通滤波器与低通滤波器

    目录 高频与低频区分: 高通滤波器: 1.傅里叶变换: 低通滤波器: 总结:         在了解图像滤波器之前,先谈一下如何区分图像的高频信息和低频信息,所谓高频就是该像素点与周围像素差异较大,常见于一副图像的边缘细节和噪声等;而低频就是该像素点与周围像素

    2023年04月09日
    浏览(49)
  • 图像处理之理想高通滤波器、巴特沃斯高通滤波器和高斯高通滤波器的matlab简单实现

    一、前言 高通滤波器的功能是让高频率通过而滤掉或衰减低频,其作用是 使图像得到锐化处理,突出图像的边界 。经理想高频滤波后的图像把信息丰富的低频去掉了,丢失了许多必要的信息**。一般情况下,高通滤波对噪声没有任何抑制作用**,若简单的使用高通滤波,图像质

    2023年04月25日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包