OpenCV 08(图像滤波器 算子)

news2024/11/29 1:39:10

一、 索贝尔(sobel)算子

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

人眼如何识别图像边缘?

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

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

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

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

- 水平方向

- 垂直方向

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

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

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

# 索贝尔算子.
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()

二、沙尔(Scharr)算子

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

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

- 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()

三、拉普拉斯算子

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

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

可以发现"边缘处"的二阶导数=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)) $

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

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

 

- 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()

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

四、边缘检测Canny

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

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

- Canny边缘检测的一般步骤

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

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

  • 非极大值抑制

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

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

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

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

    - 更形象的例子:

 

  • 滞后阈值

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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/992156.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Spring面试】Spring事务(图文详解)

概念 一个事务包含两个及两个以上的步骤 Spring是没法提供事务的,Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。真正的数据库层的事务提交和回滚是通过binlog或者redo log实现的。 事务…

Vuex仓库的创建

vuex 的使用 - 创建仓库 文章目录 vuex 的使用 - 创建仓库1.安装 vuex2.新建 store/index.js 专门存放 vuex3.创建仓库 store/index.js4 在 main.js 中导入挂载到 Vue 实例上5.测试打印Vuex 1.安装 vuex 安装vuex与vue-router类似,vuex是一个独立存在的插件&#x…

容器编排学习(三)端口映射与Harber镜像仓库介绍

一 对外发布服务(端口映射) 1 概述 新创建容器的IP 地址是随机的 容器在重启后每次 IP 都会发生变化 容器服务只有宿主机才能访问 如何才能使用容器对外提供稳定的服务? 容器端口可以与宿主机的端口进行映射绑定 从而把宿主机变成对应的服务&a…

Revit 几何体的三种上层应用:特征造型、体量和纯粹几何

排除掉墙梁板柱这些和建筑各专业相关的构件,Revit 的上层应用中,有三类和几何相关的应用,特征造型、体量和纯粹几何。这也是通常三维建模软件的几种基础建模组织形式。 特征造型 几何特征造型是一种设计方法,它强调使用几何学原理…

电子产品CE认证申请,CE-RED认证

CE认证,即只限于产品不危及人类、动物和货品的安全方面的基本安全要求,而不是一般质量要求,协调指令只规定主要要求,一般指令要求是标准的任务。 构成欧洲指令核心的"主要要求",在欧共体1985年5月7日的&…

亚马逊,速卖通,国际站卖家自己做测评补单有什么价值,怎么做?

对于卖家而言,测评资源确实是一项宝贵的财富。通过自养号和广告相结合的策略,可以快速有效地提升产品销量、增加转化率以及提高Listing的权重。这是一个很好的方法来优化产品在平台上的表现 现在很多卖家都选择自己养号下单,自己做测评 1.可…

【AI】机器学习——线性模型(逻辑斯蒂回归)

文章目录 3.3 逻辑斯蒂回归3.3.1 逻辑回归介绍对数几率函数sigmod函数几率 3.3.2 逻辑回归模型3.3.3 参数求解逻辑斯蒂回归策略 3.3.4 损失函数3.3.5 应用:语句情感判断3.3.6 多角度分析逻辑回归信息论角度数学角度与朴素贝叶斯对比 3.3.7 从二分类到多分类问题多次…

深度学习实战51-基于Stable Diffusion模型的图像生成原理详解与项目实战

大家好,我是微学AI,今天给大家介绍一下深度学习实战51-基于Stable Diffusion模型的图像生成原理详解与项目实战。大家知道现在各个平台发的漂亮小姐姐,漂亮的图片是怎么生成的吗?这些生成的底层原理就是用到了Stable Diffusion模型。Stable Diffusion是一种基于深度学习的图…

《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》全文翻译

《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》- Chain-of-Thought Prompting Elicits Reasoning in Large Language Models 论文信息摘要1. 介绍2. 思维链提示3. 算术推理3.1 实验设置3.2 结果3.3 消融研究3.4 思想链的稳健性 4. 常识推理5. 符号…

花见Live Wallpaper Themes 4K Pro for mac(4k视频壁纸)

如果你希望让自己的Mac桌面焕发活力,那么Live Wallpaper & Themes 4K Pro正是一款值得尝试的软件。它提供了丰富的超高清4K动态壁纸和主题,可以让你轻松打造出个性化的桌面环境。 这款软件拥有众多令人惊叹的功能。其中最值得一提的是,它…

项目经验分享|openGauss 刘昱娴:对未知葆有好奇与坚持

开源之夏 项目经验分享 2023 #02 # 项目基本信息 项目名称:分页器组件封装 项目导师:王杏 项目简述与产出要求:分页器组件封装 1. 完成分页器组件封装;支持移动端和pc端 2. 适配Chrome、Safari、Firefox、Edge 等主流浏览器…

分类预测 | MATLAB实现PCA-BiLSTM(主成分双向长短期记忆神经网络)分类预测

分类预测 | MATLAB实现PCA-BiLSTM(主成分双向长短期记忆神经网络)分类预测 目录 分类预测 | MATLAB实现PCA-BiLSTM(主成分双向长短期记忆神经网络)分类预测预测效果基本介绍程序设计参考资料致谢 预测效果 基本介绍 分类预测 | MATLAB实现PCA-BiLSTM(主成分双向长短期记忆神经网…

系列三、Linux中安装Nginx

一、准备工作 1.1、确保gcc安装成功 如果没有安装gcc执行./configure将会报错。 # 使用如下指令安装gcc:两个都要安装 yum -y install gcc yum -y install gcc-c 1.2、下载nginx1.12.2 http://nginx.org/en/download.html 1.3、下载pcre-8.3.7.tar.gz 1.3.…

Qt应用程序连接达梦数据库-飞腾PC麒麟V10

目录 前言1 安装ODBC1.1 下载unixODBC源码1.2 编译安装1.4 测试 2 编译QODBC2.1 修改 qsqldriverbase.pri 文件2.2 修改 odbc.pro 文件2.3 编译并安装QODBC 3 Qt应用程序连接达梦数据库测试4 优化ODBC配置,方便程序部署4.1 修改pro文件,增加DESTDIR 变量…

C++ std::pair and std::list \ std::array

std::pair<第一个数据类型, 第二个数据类型> 变量名 例如&#xff1a; std::pair<int, string> myPair; myPair.first;拿到第一个int变量 myPair.second拿到第二个string变量 std::pair需要引入库#include "utility" std::make_pair() 功能制作一个…

STM32——串口通信(总结)

文章目录 串行通信概述&#xff1a;串行通信的基本原理和特点常见的串行通信标准和协议&#xff1a; 串口硬件接口&#xff1a;串口接口的特点包括&#xff1a;串口的物理接口和连接方式。串口引脚功能和作用。 串口通信参数&#xff1a;波特率&#xff08;Baud Rate&#xff0…

OJ练习第166题——课程表(拓扑排序问题)

课程表 力扣链接&#xff1a;207. 课程表 题目描述 你这个学期必须选修 numCourses 门课程&#xff0c;记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出&#xff0c;其中 prerequisites[i] [ai, bi] &#xff0c;表…

source insight keil 中文乱码

1. 乱码的根本原因就是编码的方式太多了&#xff0c;你用这种编码&#xff0c;他用那种编码&#xff0c;就变成鸡同鸭讲了&#xff0c;对牛弹琴就要用牛语&#xff0c;如果全世界只有一种编码方式&#xff0c;就肯定不会有乱码问题&#xff0c;但这是不可能的。keil 设置编码格…

PyQt5安装以及使用

PyQt5安装以及使用 1 简介2 安装方法2.1 pip install PyQt52.2 pip install PyQt5‑5.15.9‑cp37‑cp37m‑win_amd64.whl 3 Qt相关工具介绍4 安装PyQt5-tools5 设置环境变量6 测试 1 简介 开发工具为PyCharm&#xff0c;Anaconda&#xff0c;因为Python安装相关包的方便性&…

sql:SQL优化知识点记录(十五)

&#xff08;1&#xff09;MySQL主从复制 我们这里配置一Windows上的MySql做主机&#xff0c;Linux上的MySql做从机&#xff0c;搭建一主一从 测试以下是否能够拼通&#xff1a;从Linux上&#xff1a;167&#xff0c;连接Windows的165 从Windows的165 连接Linux上&#xff1a;…