Python-OpenCV中的图像处理-图像梯度

news/2024/7/21 6:39:00 标签: python, opencv, 图像处理

Python-OpenCV中的图像处理-图像梯度

  • 图像梯度
    • Sobel 算子和 Scharr 算子
    • Laplacian 算子

图像梯度

  • 图像梯度,图像边界等
  • 使用到的函数有: cv2.Sobel(), cv2.Scharr(), cv2.Laplacian() 等
  • 原理:梯度简单来说就是求导。OpenCV 提供了三种不同的梯度滤波器,或者说高通滤波器: Sobel,Scharr 和 Laplacian。Sobel, Scharr 其实就是求一阶或二阶导数。 Scharr 是对 Sobel(使用小的卷积核求解求解梯度角度时)的优化。 Laplacian 是求二阶导数。

Sobel 算子和 Scharr 算子

Sobel 算子是高斯平滑与微分操作的结合体,所以它的抗噪声能力很好。你可以设定求导的方向( xorder 或 yorder)。还可以设定使用的卷积核的大小( ksize)。如果 ksize=-1,会使用 3x3 的 Scharr 滤波器,它的的效果要比 3x3 的 Sobel 滤波器好(而且速度相同,所以在使用 3x3 滤波器时应该尽量使用 Scharr 滤波器)。 3x3 的 Scharr 滤波器卷积核如下:
X 方向 = [ − 3 0 3 − 10 0 10 − 3 0 3 ] , Y 方向 = [ − 3 − 10 − 3 0 0 0 3 10 3 ] X方向=\left[ \begin{matrix} -3&0&3\\-10&0&10\\-3&0&3 \end{matrix}\right],Y方向=\left[ \begin{matrix} -3&-10&-3\\0&0&0\\3&10&3\end{matrix}\right] X方向= 31030003103 ,Y方向= 30310010303

Laplacian 算子

拉普拉斯算子可以使用二阶导数的形式定义,可假设其离散实现类似于二阶 Sobel 导数,事实上, OpenCV 在计算拉普拉斯算子时直接调用 Sobel 算子。
拉普拉斯滤波器使用的卷积核:
k e r n e l = [ 0 1 0 1 − 4 1 0 1 0 ] kernel=\left[ \begin{matrix} 0&1&0\\1&-4&1\\0&1&0\end{matrix}\right] kernel= 010141010

python">import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('./resource/opencv/image/sudoku.png', cv2.IMREAD_GRAYSCALE)

# 拉普拉斯 cv2.CV_64F 输出图像的深度(数据类型),可以使用-1, 与原图像保持一致 np.uint8
laplacian = cv2.Laplacian(img, cv2.CV_64F, ksize=3)
laplacian = cv2.convertScaleAbs(laplacian)  

# 索贝尔 X方向, 参数 1,0 为只在 x 方向求一阶导数,最大可以求 2 阶导数
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5)
sobelx = cv2.convertScaleAbs(sobelx)

# 索贝尔 Y方向, 参数 0,1 为只在 y 方向求一阶导数,最大可以求 2 阶导数
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=5) 
sobely = cv2.convertScaleAbs(sobely)

# Scharr X方向,
scharrx = cv2.Scharr(img, cv2.CV_64F, 1, 0)
scharrx = cv2.convertScaleAbs(scharrx)

# Scharr Y方向,
scharry = cv2.Scharr(img, cv2.CV_64F, 0, 1)
scharry = cv2.convertScaleAbs(scharry)

plt.subplot(321), plt.imshow(img, cmap='gray'), plt.title('Origin'), plt.xticks([]), plt.yticks([])
plt.subplot(322), plt.imshow(laplacian, cmap='gray'), plt.title('Laplacian'), plt.xticks([]), plt.yticks([])
plt.subplot(323), plt.imshow(sobelx, cmap='gray'), plt.title('Sobel X'), plt.xticks([]), plt.yticks([])
plt.subplot(324), plt.imshow(sobely, cmap='gray'), plt.title('Sobel Y'), plt.xticks([]), plt.yticks([])
plt.subplot(325), plt.imshow(scharrx, cmap='gray'), plt.title('Scharr X'), plt.xticks([]), plt.yticks([])
plt.subplot(326), plt.imshow(scharry, cmap='gray'), plt.title('Scharr Y'), plt.xticks([]), plt.yticks([])
plt.show()


在这里插入图片描述

python">import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('./resource/opencv/image/box2.png')


# output dtype = cv2.CV_8U
sobelx8u = cv2.Sobel(img, cv2.CV_8U, 1,0, ksize=5)

# 也可以将参数设置为-1
sobelx8u_n = cv2.Sobel(img, -1, 1, 0, ksize=5)

# output dtype = cv2.CV64F,
sobelx64f = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5)
abs_sobel64f = np.absolute(sobelx64f)
sobel_8u = np.uint8(abs_sobel64f)

# Scharr X方向
scharrx = cv2.Scharr(img,cv2.CV_64F,1,0)

# Scharr Y方向
scharry = cv2.Scharr(img,cv2.CV_64F,0,1)


plt.subplot(2,3,1), plt.imshow(img, cmap='gray'), plt.title('original'), plt.xticks([]), plt.yticks([])
plt.subplot(2,3,2), plt.imshow(sobelx8u, cmap='gray'), plt.title('Sobel CV_8U'), plt.xticks([]), plt.yticks([])
plt.subplot(2,3,3), plt.imshow(sobel_8u, cmap='gray'), plt.title('Sobel abs(CV_64F)'), plt.xticks([]), plt.yticks([])
plt.subplot(2,3,4), plt.imshow(scharrx, cmap='gray'), plt.title('Scharr X'), plt.xticks([]), plt.yticks([])
plt.subplot(2,3,5), plt.imshow(scharry, cmap='gray'), plt.title('Scharr Y'), plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述


http://www.niftyadmin.cn/n/4924610.html

相关文章

P1765 手机

题目描述 一般的手机的键盘是这样的: 要按出英文字母就必须要按数字键多下。例如要按出 x \tt x x 就得按 9 9 9 两下,第一下会出 w \tt w w,而第二下会把 w \tt w w 变成 x \tt x x。 0 0 0 键按一下会出一个空格。 你的任务是读取若…

NAT及其实验(eNSP,细致易懂)

目录 NAT产生背景 NAT概述NAT(Network Address Translation),网络地址转换 NAT工作规则 标准NAT技术 NAPT[网络地址端口转换[Port-->传输层-端口编号]] Easy IP——最简单的PAT NAT Server 静态NAT实验 动态NAT实验 NAPT实验 N…

Roslyn动态编译DLL和缺少Private.CoreLib的问题

CoreLib问题 最近学习Roslyn,看如何编译一个Dll来使用,网上有很多Roslyn的文章,但是都有点问题,我编译的DLL加入到别的项目使用,就会提示: 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 CS0012 类型“Object”在未引用的程序集中定义。必须添加对程序集“System.P…

【前端 | CSS】flex布局

基本概念 Flexible模型,通常被称为 flexbox,是一种一维的布局模型。它给 flexbox 的子元素之间提供了强大的空间分布和对齐能力 我们说 flexbox 是一种一维的布局,是因为一个 flexbox 一次只能处理一个维度上的元素布局,一行或者…

ThreadingTest移动白盒测试工具

1、测试方法论 黑盒功能测试法 黑盒功能测试法, 是把要测试的软件看成一个 “黑盒子”, 不管其内部结构如何以及以什么算法实现所要求提供的功能,而是按照需求的功能化要求, 设计相应的测试用例(包括测试的输入数据与条件设置和所预期的软件运行输出结果), 通过软件…

亚马逊买家账号多久可以评论

根据亚马逊的政策,买家账号在购买商品后通常需要等待一段时间才能发布评论。 1、实物商品: 买家需要等待购买商品后的48小时,然后才能发布评论。 2、数字商品: 买家需要等待购买数字商品后的24小时,然后才能发布评论…

德国注册公司 德国商标申请 德国公司年审

德国公司注册优势 1、法律透明度:在企业经营过程中为投资者提供了很高的法律保障。 2、市场稳定性:稳定的政-治局势和成熟的金融体系,为企业提供良好的市场环境。 3、地理位置优势:毗邻欧洲其他重要国家,便于企业开…

算法训练Day42|1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

背包类别 01背包:有n种物品,每种物品只有一个. 完全背包:有n种物品,每种物品有无限个. 多重背包:有n种物品,每种物品个数各不相同. 区别:仅仅体现在物品个数上的不同而已。 确定dp[i][j]数组的…