【个人笔记】OpenCV4 C++ 图像处理与视频分析 13课

个人资料,仅供学习使用
修改时间——2022年2月19日 21:11:31
学习课程:OpenCV4 图像处理与视频分析实战教程
课程讲师:贾志刚

13 自定义滤波

opencv知识点:

  • 将图像与内核卷积 – filter2D
  • 缩放 取绝对值 转换为8位 – convertScaleAbs

本课所解决的问题:

  • 什么是自定义滤波?
  • 如果实现自定义滤波的均值卷积?
  • 如果实现自定义滤波的非均值卷积?

1.自定义滤波

我们知道,不同卷积核下的图像卷积意义是不同的,因此 卷积核在卷积过程中充当着十分重要的角色。

通过自定义的卷积核来卷积,这种方式的术语为: 自定义滤波(customize filter)

要注意的是:
当我们卷积核给的不一样的时候, 输出图像的类型必须有所变化,不然会出现意想不到的情况。
针对不同的卷积核, 输出图像的深度要给上 不同的数据类型,如:

  • CV_32F——32位浮点
  • CV_32S——32位有符号整数

在OpenCV中,自定义滤波要用到API

  • filter2D

具体介绍如下
filter2D

filter2D
    将图像与内核卷积
        共7个参数
            第1个参数 输入
            第2个参数 输出
            第3个参数 输出图像的深度(-1表示和输入图像一直)
            第4个参数 卷积核
            第5个参数 锚点
                    (指示内核中过滤点的相对位置;
                      锚点应位于内核中;
                      默认值Point(-1,-1),表示锚点位于内核中心)
            第6个参数 delta变量(可以调整亮度)
            第7个参数 borderType

2.自定义滤波演示

均值卷积

首先我们演示一下自定义滤波的均值卷积

#include
#include

using namespace cv;
using namespace std;

int main(int argc, char** argv) {
    Mat src = imread("D:/WorkSpace/Opencv/images/hahaha.jpg");
    if (src.empty()) {
        printf("could not find image file");
        return -1;
    }
    namedWindow("input", WINDOW_AUTOSIZE);
    imshow("input", src);

    int k = 15;
    Mat mkernel = Mat::ones(k, k, CV_32F) / (float)(k * k);

    Mat dst;
    filter2D(src, dst, -1, mkernel, Point(-1, -1), 0, BORDER_DEFAULT);
    imshow("custom mean filter", dst);

    waitKey(0);
    destroyAllWindows();
    return 0;
}

【个人笔记】OpenCV4 C++ 图像处理与视频分析 13课

非均值卷积

接下来我们演示自定义滤波的非均值卷积

#include
#include

using namespace cv;
using namespace std;

int main(int argc, char** argv) {
    Mat src = imread("D:/WorkSpace/Opencv/images/hahaha.jpg");
    if (src.empty()) {
        printf("could not find image file");
        return -1;
    }
    namedWindow("input", WINDOW_AUTOSIZE);
    imshow("input", src);

    Mat robot = (Mat_<int>(2, 2) << 1, 0, 0, -1);

    Mat result;
    filter2D(src, result, CV_32F, robot, Point(-1, -1), 127, BORDER_DEFAULT);
    convertScaleAbs(result, result);

    imshow("robot filter", result);

    waitKey(0);
    destroyAllWindows();
    return 0;
}

为什么要进行格式化的详细解释

【个人笔记】OpenCV4 C++ 图像处理与视频分析 13课
可以看到,原有的 CV_8U类型已经无法满足了,输出图像深度要进行更改为其他,如 CV_32F

但是 CV_32F的图像直接输出会很糟糕,效果如下

【个人笔记】OpenCV4 C++ 图像处理与视频分析 13课
格式化之后的图像就会好很多,效果如下
【个人笔记】OpenCV4 C++ 图像处理与视频分析 13课
图像很暗,我们把 delta = 127,效果如下
【个人笔记】OpenCV4 C++ 图像处理与视频分析 13课

本课所用API查阅

filter2D

【个人笔记】OpenCV4 C++ 图像处理与视频分析 13课
【个人笔记】OpenCV4 C++ 图像处理与视频分析 13课
【个人笔记】OpenCV4 C++ 图像处理与视频分析 13课
【个人笔记】OpenCV4 C++ 图像处理与视频分析 13课

; convertScaleAbs

【个人笔记】OpenCV4 C++ 图像处理与视频分析 13课
【个人笔记】OpenCV4 C++ 图像处理与视频分析 13课
【个人笔记】OpenCV4 C++ 图像处理与视频分析 13课
【个人笔记】OpenCV4 C++ 图像处理与视频分析 13课
Mat_<float> A(30,30);
randu(A, Scalar(-100), Scalar(100));
Mat_<float> B = A*5 + 3;
B = abs(B);

【个人笔记】OpenCV4 C++ 图像处理与视频分析 13课

Original: https://blog.csdn.net/liandanba/article/details/123024044
Author: 寒山拾不得
Title: 【个人笔记】OpenCV4 C++ 图像处理与视频分析 13课

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/644735/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球