zoukankan      html  css  js  c++  java
  • 图像变化之Laplacian()函数 and Schaar()滤波及综合例子

    先来  Laplacian()函数

    #include<math.h>
    #include<opencv2/opencv.hpp>
    #include<string.h>
    #include<vector>
    using namespace cv;
    using namespace std;
    //
    int main()
    {
        Mat picture, img, cammera, BGm;
        VideoCapture capture(0);
        while (10)
        {
            capture >> cammera;
            //GaussianBlur(cammera, cammera, Size(2, 3), 0, 0);
            Laplacian(cammera, img, -1, 3/*此数字越大,边缘越密集*/);
            cvtColor(cammera, BGm, COLOR_RGB2GRAY);
            imshow("Original", cammera);
            imshow("dealed", img);
            imshow("1213", BGm);
            waitKey(1);
        }
        return 0;
    }

    之后是Schaar()滤波

        int main()
        {
            Mat picture, img, cammera, BGm;
            VideoCapture capture(0);
            Mat src;
            while (1)
            {
                //【0】创建 grad_x 和 grad_y 图片
                Mat grad_x, grad_y;
                Mat abs_grad_x, abs_grad_y, dst;
    
                //【1】载入原始图  
            
                capture >> src;
                //【2】显示原始图 
                imshow("【原始图】Scharr滤波器", src);
    
                //【3】求 X方向梯度
                Scharr(src, grad_x, CV_16S, 1, 0, 1, 0, BORDER_DEFAULT);
                convertScaleAbs(grad_x, abs_grad_x);//图像增强
                imshow("【效果图】 X方向Scharr", abs_grad_x);
    
                //【4】求Y方向梯度
                Scharr(src, grad_y, CV_16S, 0, 1, 1, 0, BORDER_DEFAULT);
                convertScaleAbs(grad_y, abs_grad_y);//图像增强
                imshow("【效果图】Y方向Scharr", abs_grad_y);
    
                //【5】合并梯度(近似)
                addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, dst);
    
                //【6】显示效果图
                imshow("【效果图】合并梯度后Scharr", dst);
    
                waitKey(1);
            }
            return 0;
        }

    接着是综合的例子

    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
        using namespace cv;
    
    
        Mat g_srcImage, g_srcGrayImage, g_dstImage;
    
        //Canny边缘检测相关变量
        Mat g_cannyDetectedEdges;
        int g_cannyLowThreshold = 1;//TrackBar位置参数  
    
        //Sobel边缘检测相关变量
        Mat g_sobelGradient_X, g_sobelGradient_Y;
        Mat g_sobelAbsGradient_X, g_sobelAbsGradient_Y;
        int g_sobelKernelSize = 1;//TrackBar位置参数  
    
        //Scharr滤波器相关变量
        Mat g_scharrGradient_X, g_scharrGradient_Y;
        Mat g_scharrAbsGradient_X, g_scharrAbsGradient_Y;
    
    
        static void ShowHelpText();
        static void on_Canny(int, void*);//Canny边缘检测窗口滚动条的回调函数
        static void on_Sobel(int, void*);//Sobel边缘检测窗口滚动条的回调函数
        void Scharr();//封装了Scharr边缘检测相关代码的函数
    
    
        int main(int argc, char** argv)
        {
            //改变console字体颜色
            system("color 2F");
    
            //显示欢迎语
            ShowHelpText();
    
            //载入原图
            g_srcImage = imread("1.jpg");
            if (!g_srcImage.data) { printf("Oh,no,读取srcImage错误~! 
    "); return false; }
    
            //显示原始图
            namedWindow("【原始图】");
            imshow("【原始图】", g_srcImage);
    
            // 创建与src同类型和大小的矩阵(dst)
            g_dstImage.create(g_srcImage.size(), g_srcImage.type());
    
            // 将原图像转换为灰度图像
            cvtColor(g_srcImage, g_srcGrayImage, COLOR_BGR2GRAY);
    
            // 创建显示窗口
            namedWindow("【效果图】Canny边缘检测", WINDOW_AUTOSIZE);
            namedWindow("【效果图】Sobel边缘检测", WINDOW_AUTOSIZE);
    
            // 创建trackbar
            createTrackbar("参数值:", "【效果图】Canny边缘检测", &g_cannyLowThreshold, 120, on_Canny);
            createTrackbar("参数值:", "【效果图】Sobel边缘检测", &g_sobelKernelSize, 3, on_Sobel);
    
            // 调用回调函数
            on_Canny(0, 0);
            on_Sobel(0, 0);
    
            //调用封装了Scharr边缘检测代码的函数
            Scharr();
    
            //轮询获取按键信息,若按下Q,程序退出
            while ((char(waitKey(1)) != 'q')) {}
    
            return 0;
        }
    
    
        static void ShowHelpText()
        {
            //输出一些帮助信息
            printf("
    
    	运行成功,请调整滚动条观察图像效果~
    
    "
                "	按下“q”键时,程序退出。
    ");
        }
        void on_Canny(int, void*)
        {
            // 先使用 3x3内核来降噪
            blur(g_srcGrayImage, g_cannyDetectedEdges, Size(3, 3));
    
            // 运行我们的Canny算子
            Canny(g_cannyDetectedEdges, g_cannyDetectedEdges, g_cannyLowThreshold, g_cannyLowThreshold * 3, 3);
    
            //先将g_dstImage内的所有元素设置为0 
            g_dstImage = Scalar::all(0);
    
            //使用Canny算子输出的边缘图g_cannyDetectedEdges作为掩码,来将原图g_srcImage拷到目标图g_dstImage中
            g_srcImage.copyTo(g_dstImage, g_cannyDetectedEdges);
    
            //显示效果图
            imshow("【效果图】Canny边缘检测", g_dstImage);
        }
        void on_Sobel(int, void*)
        {
            // 求 X方向梯度
            Sobel(g_srcImage, g_sobelGradient_X, CV_16S, 1, 0, (2 * g_sobelKernelSize + 1), 1, 1, BORDER_DEFAULT);
            convertScaleAbs(g_sobelGradient_X, g_sobelAbsGradient_X);//计算绝对值,并将结果转换成8位
    
            // 求Y方向梯度
            Sobel(g_srcImage, g_sobelGradient_Y, CV_16S, 0, 1, (2 * g_sobelKernelSize + 1), 1, 1, BORDER_DEFAULT);
            convertScaleAbs(g_sobelGradient_Y, g_sobelAbsGradient_Y);//计算绝对值,并将结果转换成8位
    
            // 合并梯度
            addWeighted(g_sobelAbsGradient_X, 0.5, g_sobelAbsGradient_Y, 0.5, 0, g_dstImage);
    
            //显示效果图
            imshow("【效果图】Sobel边缘检测", g_dstImage);
    
        }
    
        void Scharr()
        {
            // 求 X方向梯度
            Scharr(g_srcImage, g_scharrGradient_X, CV_16S, 1, 0, 1, 0, BORDER_DEFAULT);
            convertScaleAbs(g_scharrGradient_X, g_scharrAbsGradient_X);//计算绝对值,并将结果转换成8位
    
            // 求Y方向梯度
            Scharr(g_srcImage, g_scharrGradient_Y, CV_16S, 0, 1, 1, 0, BORDER_DEFAULT);
            convertScaleAbs(g_scharrGradient_Y, g_scharrAbsGradient_Y);//计算绝对值,并将结果转换成8位
    
            // 合并梯度
            addWeighted(g_scharrAbsGradient_X, 0.5, g_scharrAbsGradient_Y, 0.5, 0, g_dstImage);
    
            //显示效果图
            imshow("【效果图】Scharr滤波器", g_dstImage);
        }
  • 相关阅读:
    ivew-admin 导入excel
    ivew Upload 上传时附带的额外参数
    工厂方法模式
    简单工厂模式
    webpack (1)
    商品格子
    合同签名
    展示图片数组
    使用egg.js和egg-sequelize连接mysql
    egg 连接mysql 在mysql 插入数据
  • 原文地址:https://www.cnblogs.com/Loving-Q/p/11945210.html
Copyright © 2011-2022 走看看