opencv-python库 cv2 Sobel算子

news/2024/7/24 7:39:41 标签: opencv, python, 人工智能

文章目录

  • cv2.Sobel()
  • cv2.convertScaleAbs()

cv2.Sobel()

cv2.Sobel 是 OpenCV 中用于应用 Sobel 算子的函数,该算子主要用于边缘检测。Sobel 算子是一种离散微分算子,结合了高斯平滑和微分求导,能够检测图像中的水平和垂直边缘。

Sobel 算子基于图像强度的一阶或二阶导数,可以测量像素强度变化的速度。当像素强度变化快时,意味着存在边缘,因此 Sobel 算子可以用来检测这些边缘。

在 OpenCV 中使用 cv2.Sobel 时,你需要指定 dx 和 dy 参数来分别计算图像在 x 和 y 方向上的导数。dx=1 表示计算水平方向(x 方向)的导数,dy=1 表示计算垂直方向(y 方向)的导数。你也可以设置 dx=0 和 dy=0,同时使用 ksize 参数来指定 Sobel 核的大小。

cv2.Sobel 的输出通常是一个与输入图像同样大小的图像,但是数据类型和范围可能会有所不同。通常,输出图像的数据类型会是 np.int16 或 np.float32,并且边缘检测的结果可能是负值。为了显示这些结果,你可能需要将输出图像转换为 np.uint8 类型,并且可能需要对其进行缩放和转换,使其范围在 0 到 255 之间。

cv2.convertScaleAbs()

cv2.convertScaleAbs 是 OpenCV 中用于对图像数组的每个元素进行缩放、转换为绝对值,并最终转换为无符号8位类型的函数。这个函数在图像处理中特别有用,尤其是在需要显示图像或者将图像数据范围转换到特定区间时。

函数原型如下:

python">cv2.convertScaleAbs(src, alpha=1, beta=0)

参数解释:

  • src:输入数组,通常是一个图像数组。
  • alpha:缩放因子,它表示要乘以输入数组每个元素的值。默认值为1,表示不改变元素值。
  • beta:添加到缩放后的值上的偏置项。默认值为0,表示不添加任何偏置。

函数的工作流程如下:

  • 对输入数组的每个元素执行缩放操作:scaled = src * alpha
  • 将缩放后的结果转换为绝对值:abs_scaled = |scaled|
  • 将绝对值结果转换为无符号8位类型(np.uint8),这样处理后的图像就可以直接用于显示或保存。

这个函数在处理需要显示的结果时特别有用,因为许多图像处理函数(如边缘检测)的输出可能是负数或大于255的值,而标准的图像显示需要数据在0到255的范围内。cv2.convertScaleAbs 就能很好地完成这个转换工作。

以下是使用 cv2.Sobel 进行边缘检测的一个例子:

python">import cv2
import numpy as np

# 读取图像并转换为灰度图
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)

# 使用 Sobel 算子进行边缘检测
# 参数 dx=1, dy=0 表示检测水平边缘
sobelx = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=5)
# 参数 dx=0, dy=1 表示检测垂直边缘
sobely = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=5)

# 由于 Sobel 输出的可能是负值,并且范围可能很大,我们需要对其进行转换
# 以便能够显示
sobelx_abs = cv2.convertScaleAbs(sobelx)
sobely_abs = cv2.convertScaleAbs(sobely)

# 显示原图像和边缘检测结果
cv2.imshow('Original Image', image)
cv2.imshow('Sobel X Edges', sobelx_abs)
cv2.imshow('Sobel Y Edges', sobely_abs)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个例子中,cv2.CV_64F 被用作输出图像的深度,这是因为 Sobel 边缘检测的结果可能会包含负数,而 np.int16 类型无法表示负数。cv2.convertScaleAbs 函数被用来将 Sobel 输出的结果转换为 np.uint8 类型,并且只显示其绝对值,使其可以在窗口中正确显示。


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

相关文章

[StartingPoint][Tier1]Bike

Task 1 What TCP ports does nmap identify as open? Answer with a list of ports seperated by commas with no spaces, from low to high. (nmap 识别哪些 TCP 端口为开放?回答以逗号分隔的端口列表,不带空格,从低到高。) # nmap -sS …

蓝桥杯刷题-14-更小的数-区间DP⭐

蓝桥杯2023年第十四届省赛真题-更小的数 //区间DP #include <iostream> #include<bits/stdc.h> #define int long long using namespace std; const int N5e310; int f[N][N]; void solve(){string s;cin>>s;int ans0;for(int len2;len<s.size();len){for…

python基础语法--输入和输出

一、 输入 input() python使用input输入变量&#xff0c;input输入的变量为字符串形式&#xff0c;可以通过其他方式转换为整型或其他类型。 &#xff08;1&#xff09;单行读入已知个数的字符串或数字 读入字符串 # 单行读入字符串a,并给出一句输入提示 a input("请…

c++STL list 简单模拟实现

分享一份cstl库list简单模拟实现。 如果能帮到你的话请点个免费的赞吧&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; ​ #pragma once #include<assert.h>namespace my_list {template<class T>class ListNode {typedef ListNode<T> Node…

C语言数组:数据的集合艺术(续)

前言 在上一篇文章中&#xff0c;我们深入探讨了C语言数组的基本概念、操作以及多维数组的应用。今天&#xff0c;我们将继续探索数组的更多高级特性&#xff0c;包括动态内存分配、指针与数组的关系以及数组在实际编程中的应用案例。 一、动态内存分配与数组 在C语言中&…

工厂方法模式:灵活的创建对象实例

在软件开发中&#xff0c;我们经常需要创建对象&#xff0c;但直接new一个实例可能会导致代码的耦合性增加&#xff0c;降低了代码的灵活性和可维护性。工厂方法模式&#xff08;Factory Method Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供了一种创建对象的接口…

静态住宅IP代理:提升跨境电商海外收款系统的稳定性

跨境电商正是当下电子商务的热门领域&#xff0c;充斥着发展机遇。然而&#xff0c;跨境电商面临着收款系统不稳定的问题&#xff0c;这直接影响到了商家的资金流动和运营效率。而高匿住宅静态IP的运用可以有效提升跨境电商海外收款系统的稳定性&#xff0c;让我们一起来看看其…

marquee替代合集

方法一&#xff1a;向上无缝(可自行修改) <!DOCTYPE html><html><head><title>向上滚动</title></head><style>#marquee li {height: 30px;}</style><body><div style"height:180px;overflow:hidden;">…