zoukankan      html  css  js  c++  java
  • opencv::形态学操作应用-提取水平与垂直线

    原理方法
        -图像形态学操作时候,可以通过自定义的结构元素实现结构元素对输入图像一些对象敏感、另外一些对象不敏感,这样就会让敏感的对象改变而不敏感的对象保留输出。
        -通过使用两个最基本的形态学操作 – 膨胀与腐蚀,使用不同的结构元素实现对输入图像的操作、得到想要的结果。
    
        - 膨胀,输出的像素值是结构元素覆盖下输入图像的最大像素值
        - 腐蚀,输出的像素值是结构元素覆盖下输入图像的最小像素值
        
    提取步骤
        输入图像彩色图像 imread
        转换为灰度图像 – cvtColor
        转换为二值图像 – adaptiveThreshold
        定义结构元素
        开操作 (腐蚀+膨胀)提取 水平与垂直线
    int main(int argc, char** argv) {
    
        Mat src, dst;
        src = imread(STRPAHT3);
        if (!src.data) {
            printf("could not load image...
    ");
            return -1;
        }
    
        char INPUT_WIN[] = "input image";
        char OUTPUT_WIN[] = "result image";
    
        Mat gray_src;
        //转灰度图
        cvtColor(src, gray_src, CV_BGR2GRAY);
        //imshow("gray image", gray_src);
    
        Mat binImg;
        //转换为二值图像 – adaptiveThreshold
        /*
            Mat src,            // 输入的灰度图像
            Mat dest,            // 二值图像
            double maxValue,    // 二值图像最大值
            int adaptiveMethod    // 自适应方法,只能其中之一   ADAPTIVE_THRESH_MEAN_C , ADAPTIVE_THRESH_GAUSSIAN_C
            int thresholdType,  // 阈值类型
            int blockSize,      // 块大小
            double C // 常量C 可以是正数,0,负数
        */
        adaptiveThreshold(~gray_src, binImg, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
        //imshow("binary image", binImg);
        
        //一个像素宽的水平线 - 水平长度 width / 30
        //一个像素宽的垂直线 – 垂直长度 height / 30
        int xsize = binImg.cols / 30;
        int ysize = binImg.rows / 30;
        
        // 水平结构元素
        Mat hline = getStructuringElement(MORPH_RECT, Size(xsize, 1), Point(-1, -1));
        // 垂直结构元素
        Mat vline = getStructuringElement(MORPH_RECT, Size(1, ysize), Point(-1, -1));
    
        //矩形
        Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
    
        //提取横线
        Mat hbin;
        erode(binImg, hbin, hline);
        dilate(hbin, dst, hline);
        //imshow("Final Result", dst);
    
        //提取竖线
        Mat vbin;
        erode(binImg, vbin, vline);
        dilate(vbin, dst, vline);
        //imshow("Final Result", dst);
    
        //矩形
        Mat Bbin;
        erode(binImg, Bbin, kernel);
        dilate(Bbin, dst, kernel);

    //像素取反操作 bitwise_not(dst, dst); imshow(
    "Final Result", dst); waitKey(0); return 0; }
  • 相关阅读:
    大端与小端编号方法的区别
    socket、listen 等函数的打电话隐喻
    windows 网络编程报错 error LNK2019
    有符号数与无符号数之间的转换
    C++ 代码命名建议
    编写启发式代码的方法
    求给定数目的前 n 个素数
    不使用 “+” 实现加法操作
    二叉搜索树中两个节点的旋转
    Python玩转硬件:TPYBoard-Micropython开发板大盘点
  • 原文地址:https://www.cnblogs.com/osbreak/p/11464946.html
Copyright © 2011-2022 走看看