zoukankan      html  css  js  c++  java
  • canny边沿检测,图象二值化,图象腐蚀

    一、canny边缘检测:

    前面用python写过了canny的边缘检测的算法,这次用C++写一个边缘检测的算法。

    思路:将原始图像转化为灰度图,用blur函数进行图像模糊以降噪,然后用canny函数进行边缘检测。

    #include <iostream>
    #include <opencv2opencv.hpp>
    
    using namespace cv;
    using namespace std;
    int main()
    {
        Mat SrcPic = imread("lena.jpg");
        imshow("Src Pic", SrcPic);
        Mat DstPic, edge, grayImage;
    
        //创建与src同类型和同大小的矩阵
        DstPic.create(SrcPic.size(), SrcPic.type());
        
        //将原始图转化为灰度图
        cvtColor(SrcPic, grayImage, COLOR_BGR2GRAY);
    
        //先使用3*3内核来降噪
        blur(grayImage, edge, Size(3, 3));
    
        //运行canny算子
        Canny(edge, edge, 3, 9, 3);
    
        imshow("边缘提取效果", edge);
    
        waitKey();
        return 0;
    }

    一、图像二值化操作

    两种方法,全局固定阈值二值化和局部自适应阈值二值化

    1.全局固定阈值很容易理解:就是对整幅图像都是用一个统一的阈值来进行二值化;

    2.局部自适应阈值:则是根据像素的邻域块的像素值分布来确定该像素位置上的二值化阈值。

    #include<opencv2opencv.hpp>   
    #include<opencv2highguihighgui.hpp>
    
    using namespace std;
    using namespace cv;
    
    int main(int argc, char** argv)
    {
        Mat image = imread("lol1.jpg", CV_LOAD_IMAGE_GRAYSCALE); //注意了,必须是载入灰度图
        if (image.empty())
        {
            cout << "read image failure" << endl;
            return -1;
        }
    
        // 全局二值化
        int th = 100;
        Mat global;
        threshold(image, global, th, 255, CV_THRESH_BINARY_INV);
    
        // 局部二值化
        int blockSize = 25;
        int constValue = 10;
        Mat local;
        adaptiveThreshold(image, local, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY_INV, blockSize, constValue);
    
        imshow("全局二值化", global);
        imshow("局部二值化", local);
    
        waitKey(0);
        return 0;
    }

    原图:

    全局二值化:

    小范围对比区域二值化:

    二、图像的腐蚀:

    #include <iostream>
    #include <opencv2opencv.hpp>
    
    using namespace cv;
    using namespace std;
    int main()
    {
        Mat SrcPic = imread("L:/4.jpg");
        imshow("Src Pic", SrcPic);
        Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); //getStructuringElement函数返回的是指定形状和尺寸的结构元素
        Mat DstPic;
        erode(SrcPic, DstPic, element); //腐蚀操作
        imshow("腐蚀效果图", DstPic);
        waitKey();
        return 0;
    }

    原图:

    腐蚀图像:

  • 相关阅读:
    final,finally和finalize三者的区别和联系
    Java程序开发中的简单内存分析
    Java堆、栈和常量池以及相关String的详细讲解(经典中的经典)
    java中的基本数据类型一定存储在栈中吗?
    CDN加速-内容分发网络
    大型Java web项目分布式架构演进-分布式部署
    阿里面试-2019
    jvm调优-从eclipse开始
    eclipse中导入maven项目:org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project.Maven
    图解 CMS 垃圾回收机制原理,-阿里面试题
  • 原文地址:https://www.cnblogs.com/Jack-Elvis/p/11296263.html
Copyright © 2011-2022 走看看