草庐IT

python - 对于大于 3 x 3 的尺寸,OpenCV 的 Sobel 滤波器的核系数是多少?

coder 2024-02-13 原文

我正在使用 OpenCV 的大小为 5x5 和 7x7 的 Sobel 滤波器来计算图像导数。

有人可以告诉我 OpenCV 中大小为 5x5 和 7x7 的 Sobel 过滤器的内核值吗?在进行 Google 搜索时,它向我展示了很多不同的内核。

以下是 5 x 5 的一些示例:

1。可分离的

2   1   0   -1  -2
4   8   0   -4  -8
6  12   0   -12 -6
4   8   0   -4  -8
2   1   0   -1  -2

2 。不可分离的

2   1   0   -1  -2
4  10   0   -4  -10
7  17   0   -17 -7
4  10   0   -4  -10
2   1   0   -1  -2

3。奇怪的不可分离

2   1   0   -1  -2
3   2   0   -2  -3
4   3   0   -3  -4
3   2   0   -2  -3
2   1   0   -1  -2

最佳答案

您可以使用 getDerivKernels如果你真的想看看 OpenCV 使用什么,可以确定 Sobel 滤波器的内核系数。你需要做的是指定你想要的方向和你想要的面具的大小。因此,每个内核大小有两个方向,因此我们需要调用四次。

但是,返回的是水平 x 和垂直 y,表示 Sobel 滤波器的一维内核,您可以使用它来执行可分离的二维滤波sepFilter2D .如果你真的想看到内核本身,你只需使用 outer product在从 getDerivKernels 返回的 xy 内核之间。

这是使用 Python 的 OpenCV 接口(interface)快速显示 5 x 5 xy 和 7 x 7 xy 的东西 内核:

In [1]: import numpy as np

In [2]: import cv2

In [3]: sobel5x = cv2.getDerivKernels(1, 0, 5)

In [4]: np.outer(sobel5x[0], sobel5x[1])
Out[4]: 
array([[ -1.,  -4.,  -6.,  -4.,  -1.],
       [ -2.,  -8., -12.,  -8.,  -2.],
       [  0.,   0.,   0.,   0.,   0.],
       [  2.,   8.,  12.,   8.,   2.],
       [  1.,   4.,   6.,   4.,   1.]], dtype=float32)

In [5]: sobel5y = cv2.getDerivKernels(0, 1, 5)

In [6]: np.outer(sobel5y[0], sobel5y[1])
Out[6]: 
array([[ -1.,  -2.,   0.,   2.,   1.],
       [ -4.,  -8.,   0.,   8.,   4.],
       [ -6., -12.,   0.,  12.,   6.],
       [ -4.,  -8.,   0.,   8.,   4.],
       [ -1.,  -2.,   0.,   2.,   1.]], dtype=float32)

In [7]: sobel7x = cv2.getDerivKernels(1, 0, 7)

In [8]: np.outer(sobel7x[0], sobel7x[1])
Out[8]: 
array([[  -1.,   -6.,  -15.,  -20.,  -15.,   -6.,   -1.],
       [  -4.,  -24.,  -60.,  -80.,  -60.,  -24.,   -4.],
       [  -5.,  -30.,  -75., -100.,  -75.,  -30.,   -5.],
       [   0.,    0.,    0.,    0.,    0.,    0.,    0.],
       [   5.,   30.,   75.,  100.,   75.,   30.,    5.],
       [   4.,   24.,   60.,   80.,   60.,   24.,    4.],
       [   1.,    6.,   15.,   20.,   15.,    6.,    1.]], dtype=float32)

In [9]: sobel7y = cv2.getDerivKernels(0, 1, 7)

In [10]: np.outer(sobel7y[0], sobel7y[1])
Out[10]: 
array([[  -1.,   -4.,   -5.,    0.,    5.,    4.,    1.],
       [  -6.,  -24.,  -30.,    0.,   30.,   24.,    6.],
       [ -15.,  -60.,  -75.,    0.,   75.,   60.,   15.],
       [ -20.,  -80., -100.,    0.,  100.,   80.,   20.],
       [ -15.,  -60.,  -75.,    0.,   75.,   60.,   15.],
       [  -6.,  -24.,  -30.,    0.,   30.,   24.,    6.],
       [  -1.,   -4.,   -5.,    0.,    5.,    4.,    1.]], dtype=float32)

请注意,内核未标准化。如果你想使用这些进行过滤,你应该规范化内核。 getDerivKernels 中有一个标志,可让您规范化掩码。

另请注意,给定尺寸的一个掩码是另一个掩码的转置,如果您想检测特定方向的边缘,这是有意义的。


为了完整起见,这里是上述 Python 代码的 C++ 版本。要编译代码,将其放入文件中...将其命名为 test.cpp,然后在终端中执行此操作:

g++ -Wall -g -o test test.cpp `pkg-config --cflags --libs opencv`

编译后,使用./test运行程序。


#include <cv.h>

using namespace std;
using namespace cv;

int main() {

    // For the kernels
    Mat sobelX, sobelY;

    // 5 x 5 - x direction
    getDerivKernels(sobelX, sobelY, 1, 0, 5, false, CV_32F);
    cout << "sobel5x = " << endl << " " << sobelX*sobelY.t() << endl << endl;

    // 5 x 5 - y direction
    getDerivKernels(sobelX, sobelY, 0, 1, 5, false, CV_32F);
    cout << "sobel5y = " << endl << " " << sobelX*sobelY.t() << endl << endl;

    // 7 x 7 - x direction
    getDerivKernels(sobelX, sobelY, 1, 0, 7, false, CV_32F);
    cout << "sobel7x = " << endl << " " << sobelX*sobelY.t() << endl << endl;

    // 7 x 7 - y direction
    getDerivKernels(sobelX, sobelY, 0, 1, 7, false, CV_32F);
    cout << "sobel7y = " << endl << " " << sobelX*sobelY.t() << endl << endl;

    return 0;
}

请注意,xy 内核都是列 vector ,因此您需要转置y vector ,使其成为行 vector 计算外积。

关于python - 对于大于 3 x 3 的尺寸,OpenCV 的 Sobel 滤波器的核系数是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31728948/

有关python - 对于大于 3 x 3 的尺寸,OpenCV 的 Sobel 滤波器的核系数是多少?的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby - 可以通过多少种方法将方法添加到 ruby​​ 对象? - 2

    当谈到运行时自省(introspection)和动态代码生成时,我认为ruby​​没有任何竞争对手,可能除了一些lisp方言。前几天,我正在做一些代码练习来探索ruby​​的动态功能,我开始想知道如何向现有对象添加方法。以下是我能想到的3种方法:obj=Object.new#addamethoddirectlydefobj.new_method...end#addamethodindirectlywiththesingletonclassclass这只是冰山一角,因为我还没有探索instance_eval、module_eval和define_method的各种组合。是否有在线/离线资

  3. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  4. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  5. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  6. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  7. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

  8. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  9. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  10. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

随机推荐