个十百千万亿兆 2019-03-21 17:21 采纳率: 0%
浏览 289

请教一个问题,关于opencv的自定义算子

图片说明

前面的结果除以蓝色方框里的东西是什么呢?为什么要进行这样处理?看的视频,老师没有讲解,个人认为是因为类似于图下图个操作
图片说明
小白一枚,刚刚接触opencv,请多多指教,十分感谢!

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-08 11:13
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在OpenCV中,filter2D函数是用于计算图像上的二维滤波器。这个函数接受几个参数:

    1. src: 输入图像。
    2. dst: 输出图像。
    3. kernel: 滤波器的大小和形状。
    4. dty: 对于Y方向的滤波器,如果为负数,则输出图像中的值将被乘以-1。

    在这个例子中,我们使用了ones函数来创建一个与输入图像相同尺寸的、全为1的矩阵。然后我们将这个矩阵作为滤波器的系数传递给filter2D函数,并将其应用到输入图像上。这相当于对输入图像进行了高斯模糊或边缘检测等操作。

    至于你提到的"自定义算子",通常情况下,OpenCV提供了一系列预定义的算子,如高斯滤波、中值滤波、均值滤波、梯度算子等。如果你想要实现一个自定义的算子,你可以通过编写一个函数来实现所需的运算,并将其传递给filter2D函数。例如,你可以实现一个简单的高斯滤波函数,如下所示:

    void gaussianBlur(Mat &src, Mat &dst, int kernelSize)
    {
        float sigmaX = 1 / sqrt((double)kernelSize * 2.0);
        float sigmaY = 1 / sqrt((double)kernelSize * 2.0);
    
        for(int i = 0; i < src.rows; i++)
            for(int j = 0; j < src.cols; j++)
                dst.at<uchar>(i,j) = src.at<uchar>(i,j) + sigmaX*(rand()/(float)RAND_MAX)*sigmaY*(rand()/(float)RAND_MAX);
    }
    

    在这个函数中,我们首先计算了高斯核的宽度和高度(半径),然后生成了一个随机的高斯噪声。最后,我们用这个噪声填充输入图像的一部分区域。

    请注意,上述代码是一个非常基础的例子,实际的应用可能会更复杂。你可能还需要考虑其他因素,如噪声抑制、边缘检测、颜色空间转换等。

    评论

报告相同问题?