栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【opencv 450 Image Processing-Transformations】Making your own linear filters制作自己的线性滤波器

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【opencv 450 Image Processing-Transformations】Making your own linear filters制作自己的线性滤波器

Goal

在本教程中,您将学习如何:

使用 OpenCV 函数 filter2D() 创建您自己的线性滤波器。

Theory

笔记

下面的解释属于 Bradski 和 Kaehler 的《Learning OpenCV》一书。

Correlation

相关性

在非常一般的意义上,相关性是图像的每个部分与运算符(内核)之间的操作。

What is a kernel?

内核本质上是一个固定大小的数值系数数组以及该数组中的一个anchor point锚点,该锚点通常位于中心。

 

How does correlation with a kernel work?

与内核的相关性如何工作?

假设您想知道图像中特定位置的结果值。 相关值的计算方式如下:

将内核锚点放置在确定的像素之上,内核的其余部分覆盖图像中相应的局部像素。

将内核系数乘以相应的图像像素值并对结果求和。

将结果放在输入图像中锚点的位置。

通过在整个图像上扫描内核来对所有像素重复该过程。

以方程的形式表达上述过程,我们将有:

 

幸运的是,OpenCV 为您提供了 filter2D() 函数,因此您不必编写所有这些操作。

What does this program do?

加载图像

执行标准化的盒式过滤器normalized box filter。 例如,对于 size=3 的内核,内核将是:

 

该程序将使用大小为 3、5、7、9 和 11 的内核执行过滤操作。

过滤器输出(每个内核)将在 500 毫秒内显示

Code

教程代码显示在下面的行中。

你也可以从这里raw.githubusercontent.com 下载


#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"

using namespace cv;


int main ( int argc, char** argv )
{
    // 声明变量
    Mat src, dst;

    Mat kernel;//内核
    Point anchor;//锚点
    double delta;
    int ddepth;
    int kernel_size;
    const char* window_name = "filter2D Demo";

    //![load]
    const char* imageName = argc >=2 ? argv[1] : "lena.jpg";

    // 加载图像
    src = imread( samples::findFile( imageName ), IMREAD_COLOR ); // Load an image

    if( src.empty() )
    {
        printf(" Error opening imagen");
        printf(" Program Arguments: [image_name -- default lena.jpg] n");
        return EXIT_FAILURE;
    }
    //![load]

    //![init_arguments]
    // 初始化过滤器的参数
    anchor = Point( -1, -1 );
    delta = 0;
    ddepth = -1;
    //![init_arguments]

    // Loop - Will filter the image with different kernel sizes each 0.5 seconds
	//循环 - 每 0.5 秒过滤一次具有不同内核大小的图像
    int ind = 0;
    for(;;)
    {
        //![update_kernel]
        // Update kernel size for a normalized box filter
		// 更新归一化box过滤器的内核大小
        kernel_size = 3 + 2*( ind%5 );//内核尺寸在 3 5 7 9 11  之间切换
        kernel = Mat::ones( kernel_size, kernel_size, CV_32F )/ (float)(kernel_size*kernel_size);//归一化
        //![update_kernel]

        //![apply_filter]
        // 应用过滤器 Apply filter
        filter2D(src, dst, ddepth , kernel, anchor, delta, BORDER_DEFAULT );
        //![apply_filter]
        imshow( window_name, dst );//显示滤波后图像

        char c = (char)waitKey(500);//等待输入 0.5秒
        // 按“ESC”退出程序
        if( c == 27 )
        { break; }

        ind++;
    }

    return EXIT_SUCCESS;
}

Explanation

Load an image 加载图像

    const char* imageName = argc >=2 ? argv[1] : "lena.jpg";
    // Loads an image
    src = imread( samples::findFile( imageName ), IMREAD_COLOR ); // Load an image
    if( src.empty() )
    {
        printf(" Error opening imagen");
        printf(" Program Arguments: [image_name -- default lena.jpg] n");
        return EXIT_FAILURE;
    }

Initialize the arguments

// 初始化过滤器的参数
anchor = Point( -1, -1 );
delta = 0;
ddepth = -1;

Loop

执行无限循环更新内核大小并将我们的线性滤波器应用于输入图像。 让我们更详细地分析一下:

  1. 首先我们定义我们的过滤器将使用的内核。 这里是:
// 更新归一化盒过滤器的内核大小
kernel_size = 3 + 2*( ind%5 );
kernel = Mat::ones( kernel_size, kernel_size, CV_32F )/ (float)(kernel_size*kernel_size);

第一行是将 kernel_size 更新为范围内的奇数值:[3,11]。 第二行实际上是通过将其值设置为一个填充有 1 的矩阵并通过将其除以元素数量来对其进行归一化来构建内核。

  1. 设置内核后,我们可以使用函数 filter2D() 生成过滤器:
       // Apply filter
        filter2D(src, dst, ddepth , kernel, anchor, delta, BORDER_DEFAULT );
  1. 参数表示:

src:源图像

dst:目标图像

ddepth:dst 的深度。 负值(例如 -1)表示深度与源相同。

kernel:要通过镜像扫描的内核

anchor:锚点相对于其内核的位置。 位置 Point(-1, -1) 默认表示中心。

delta:在相关过程中要添加到每个像素的值。 默认为 0

BORDER_DEFAULT:我们默认设置这个值(更多细节在后面的教程中)

  1. 我们的程序将执行一个 while 循环,每 500 毫秒,我们的过滤器的内核大小将在指定的范围内更新。

Results
  1. 编译上面的代码后,您可以执行它,将图像的路径作为参数。 结果应该是一个窗口,显示被归一化过滤器模糊的图像。 每 0.5 秒内核大小应该改变一次,如下面的一系列快照所示:

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/780262.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号