opencv 学习笔记五 二维离散卷积

卷积的用途:

卷积主要用于降噪处理,是降噪处理的一种方式;

二维离散卷积包含高斯滤波,平滑滤波,中值滤波,以及能保证图像边缘的双边滤波和导向滤波算法等;

一、了解噪声的来源以及噪声的分类;

图像中难免会存在噪声,噪声可以简单的理解为灰度值的随机变化,即拍照过程中引入了一些不想要的噪点;

噪声可分为椒盐噪声,高斯噪声,加性噪声和乘性噪声;

若想更了解噪声的来源,可参考噪声系数系列:噪声来源、NF定义及影响 - 知乎

二、卷积又称二维离散卷积

想了解卷积究竟是什么样的概念的话,可参考:

如何通俗易懂地解释卷积? - 知乎

如何通俗易懂地解释卷积? - 知乎

学习图像平滑前,有必要了解下卷积的知识,看完上述连接,对于图像处理中卷积应该了解几个关键词:卷积核,锚点,步长,内积,卷积模式

    卷积核(kernel):用来对图像矩阵进行平滑的矩阵,也称为过滤器(filter)

    锚点:卷积核和图像矩阵重叠,进行内积运算后,锚点位置的像素点会被计算值取代。一般选取奇数卷积核,其中心点作为锚点

    步长:卷积核沿着图像矩阵每次移动的长度

    内积:卷积核和图像矩阵对应像素点相乘,然后相加得到一个总和,如下图所示。(不要和矩阵乘法混淆)


#include 
#include 
#include 
#include 
#include 

using namespace cv;
using namespace std;               


RNG rng(12345);
Scalar color[7] = {
    (Scalar(0,0,255)),//红色
    (Scalar(0,255,0)),//绿色
    (Scalar(255,0,0)),//蓝色
    (Scalar(255,255,0)),//浅蓝色
    (Scalar(255,0,255)),//紫色
    (Scalar(0,255,255)),//黄色
    (Scalar(128,128,192)),//浅粉色
};
int main()
{
    Mat image,gray_img,thread_img,resize_3d_img, resize2_img,dst_img, dst2_img, dst3_img;

    image = imread("../warpAffine_3d.jpg", 1);
    if (image.empty()) {
        cout << "无此图片" << endl;
        return 0;
    }
    cvtColor(image, gray_img,COLOR_RGB2GRAY,0);//将图像转换为灰度图

    threshold(gray_img, thread_img, 100, 255, THRESH_BINARY_INV);//将灰度图转换为二值图


    Point2f srcM[4],dstM[4];
    srcM[0] = Point2f(45, 43);//左上角绿色顶点
    srcM[1] = Point2f(219, 39);//右上角绿色顶点
    srcM[2] = Point2f(219, 209);//右下角绿色顶点
    srcM[3] = Point2f(31, 209);//左下角绿色顶点

    dstM[0] = Point2f(0, 0);
    dstM[1] = Point2f(300, 0);
    dstM[2] = Point2f(300, 300);
    dstM[3] = Point2f(0, 300);

    Mat t_mat = Mat::zeros(2, 4, CV_32FC1);
   
    while (1) 
    {
        imshow("原图", image);
        waitKey(1);
        
        flip(image, dst_img, -1);//0沿着X轴翻转,1沿着Y轴翻转,-1先沿着X轴翻转再沿着Y轴翻转
        imshow("3卷积图像", dst_img);
        waitKey(1);

        t_mat = getPerspectiveTransform(srcM, dstM, 0);
        warpPerspective(image, resize_3d_img, t_mat, Size(300, 300), 1, 0, 255);
        imshow("3d仿射变换", resize_3d_img);
        waitKey(1);

        Mat board_mat = (Mat_(3, 3) <<  -1, -1, -1,
                                            -1, 9, -1,
                                            -1, -1, -1);
        filter2D(resize_3d_img, dst2_img, image.depth(), board_mat);
        imshow("边缘突出卷积图像", dst2_img);
        waitKey(1);

        Mat blur_mat = (Mat_(3, 3) << 1.0f / 9, 1.0f / 9, 1.0f / 9,
            1.0f / 9, 1.0f / 9, 1.0f / 9,
            1.0f / 9, 1.0f / 9, 1.0f / 9);
        filter2D(resize_3d_img, dst3_img, image.depth(), blur_mat);
        imshow("平滑卷积图像", dst3_img);
        waitKey(1);

        
    }
    return 1;
}

opencv 学习笔记五 二维离散卷积_第1张图片opencv 学习笔记五 二维离散卷积_第2张图片opencv 学习笔记五 二维离散卷积_第3张图片opencv 学习笔记五 二维离散卷积_第4张图片opencv 学习笔记五 二维离散卷积_第5张图片

你可能感兴趣的:(OPENCV,opencv,计算机视觉,人工智能)