小白导读

学习计算机视觉最重要的能力应该就是编程了,为了帮助小伙伴尽快入门计算机视觉,小白准备了【OpenCV入门】系列。新的一年文章的内容进行了很大的完善,主要是借鉴了更多大神的文章,希望让小伙伴更加容易理解。如果小伙伴觉得有帮助,请点击一下文末的“好看”鼓励一下小白。

关于形态学的基本操作,上一篇文章已经进行了讲解,遗忘的小伙伴可以回去查看一下→形态学基本操作

提取步骤

  • 输入图像彩色图像 imread

  • 转换为灰度图像 – cvtColor

  • 转换为二值图像 – adaptiveThreshold

相关函数

adaptiveThreshold(Mat src,Mat dest,double maxValue,int adaptiveMethod,int thresholdType,int blockSize,double C)
  • src:输入的灰度图像

  • dest:二值图像

  • maxValue:二值图像最大值

  • adaptiveMethod:自适应方法( ADAPTIVE_THRESH_MEAN_C ,ADAPTIVE_THRESH_GAUSSIAN_C)

  • thresholdType:阈值类型

  • blockSize:块大小

  • C:常量C 可以是正数,0,负数

  • 定义结构元素

一个像素宽的水平线——水平长度width/30

一个像素宽的垂直线——垂直长度width/30

  • 开操作 (腐蚀+膨胀)提取 水平与垂直线

程序代码

#include#includeusing namespace cv;

int main(int argc,char** argv){  //1、加载源图像,并检查它是否加载成功,然后显示它:  Mat src = imread("E:/Experiment/OpenCV/Pictures/paint1.jpg");  if(src.empty()){    printf("Could not load Image ...");    return -1;  }  namedWindow("1.input",CV_WINDOW_AUTOSIZE);  imshow("1.input",src);  //2、如果图像不是灰度图像转换为灰度图像:  Mat gray_src;  if (src.channels() == 3)     cvtColor(src,gray_src,CV_BGR2GRAY);  else      gray_src = src;  imshow("2.Gray Image",gray_src);  //3、然后将灰度图像转换为二值化。注意~符号表明我们使用逆操作后版本(即bitwise_not):  Mat binary_src;  /*        adaptiveThreshold( // 局部自适应阈值            Mat src, // 输入的灰度图像            Mat dest, // 二值图像            double maxValue, // 二值图像最大值            int adaptiveMethod // 自适应方法,只能其中之一 –                                 // ADAPTIVE_THRESH_MEAN_C , ADAPTIVE_THRESH_GAUSSIAN_C             int thresholdType,// 阈值类型 THRESH_BINARY THRESH_BINARY_INV  阈值 T = sum(blockSize X blockSize的像素平均值) - 常量C            int blockSize, // 块大小,只能为奇数,取图像宽或高的 1/4 到 1/6 之间? 要确保足够大?            double C // 常量C 可以是正数,0,负数   ,让结果变得更亮一点 更大一点?        )    */  adaptiveThreshold(~gray_src, binary_src, 255, CV_ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);  imshow("3.binary Image", binary_src);

  //4、以提取水平和垂直线,作为从图像中分离的结果,但首先让我们初始化的输出图像:  Mat horizontal = binary_src.clone();  Mat vertical = binary_src.clone();

  //5、为了提取我们所希望的对象,我们需要创建相应的结构元素。由于这里我们要提取水平线,一个相应的结构元素有以下形状:  int horizontalsize = horizontal.cols / 30;  Mat horizontalStructure = getStructuringElement(MORPH_RECT, Size(horizontalsize,1));  erode(horizontal, horizontal, horizontalStructure, Point(-1, -1));  dilate(horizontal, horizontal, horizontalStructure, Point(-1, -1));  imshow("4.1. horizontal", horizontal);

  //6、 垂直线条的的用法也是这样,相应的结构元素如下:  int verticalsize = vertical.rows / 30;  Mat verticalStructure = getStructuringElement(MORPH_RECT, Size( 1,verticalsize));  erode(vertical, vertical, verticalStructure, Point(-1, -1));  dilate(vertical, vertical, verticalStructure, Point(-1, -1));  imshow("4.2. vertical", vertical);

  //7、图像的边缘是有点粗糙的。由于这个原因,我们需要光顺处理边缘,以获得更平滑的结果   // Inverse vertical image  bitwise_not(vertical, vertical);  imshow("5. vertical_bit", vertical);  // Extract edges and smooth image according to the logic  // 1. extract edges  // 2. dilate(edges)  // 3. src.copyTo(smooth)  // 4. blur smooth img  // 5. smooth.copyTo(src, edges)  // Step 1  Mat edges;  adaptiveThreshold(vertical, edges, 255, CV_ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 3, -2);  imshow("6.1. edges", edges);  // Step 2  Mat kernel = Mat::ones(2, 2, CV_8UC1);  dilate(edges, edges, kernel);  imshow("6.2. dilate", edges);  // Step 3  Mat smooth;  vertical.copyTo(smooth);  // Step 4  blur(smooth, smooth, Size(2, 2));  // Step 5  smooth.copyTo(vertical, edges);  // Show final result  imshow("6.3. smooth", vertical);

  waitKey(0);  return 0;}

运行结果

主要借鉴”Madcola“和”Micheal超“两位大神的文章。两位大神的博客主页是:

https://www.cnblogs.com/skyfsm/(Madcola)

https://blog.csdn.net/qq_42887760(Micheal超)

结束语

由于时间和文章篇幅有限,本次总结先到这里,下次小白会为小伙伴们带来OpenCV的角点检测,各位小伙伴敬请期待。如果小伙伴觉得本文对自己有帮助,请帮忙点击一下右下角的“好看”,鼓励一下小白。

往期文章一览

1、助力2019剩余2/3时光

2、影响机器视觉的场景因素有哪些

3、SLAM实习生面试基础知识总结

4、如何让黑白相片恢复生机

5、我竟然用OpenCV实现了卡尔曼滤波

6、【走进OpenCV】滤波代码原来这么写

7、【走进OpenCV】这样腐蚀下来让我膨胀

8、小心!你看到的图像可能隐藏了重大机密

opencv入门_【OpenCV入门之十八】通过形态学操作提取水平与垂直线相关推荐

  1. OpenCV使用形态学转换提取水平和垂直线的实例(附完整代码)

    OpenCV使用形态学转换提取水平和垂直线的实例 OpenCV使用形态学转换提取水平和垂直线的实例 OpenCV使用形态学转换提取水平和垂直线的实例 #include <opencv2/core ...

  2. OpenCV通过形态学操作提取水平线和垂直线

    OpenCV通过形态学操作提取水平线和垂直线 通过形态学操作提取水平线和垂直线 目标 理论 形态学运算 结构元素 代码 说明/结果 载入图片 灰阶 灰度到二进制图像 输出图像 结构要素 优化边缘/结果 ...

  3. Oracle数据库从入门到精通系列之十八:Oracle进程

    Oracle数据库从入门到精通系列之十八:Oracle进程 一.Oracle进程 二.服务器进程server process 三.后台进程background process 四.从属进程(slave ...

  4. OpenCV 形态学操作应用——提取水平与垂直线

    文章目录 原理方法 提取步骤 输入图像彩色图像 `imread` 转换为灰度图像 – `cvtColor` 转换为二值图像 – `adaptiveThreshold` 定义结构元素: 开操作 (腐蚀+ ...

  5. OpenCV学习第十三篇:提取水平和垂直线(去除干扰线)

    1.结构元素 可以是任意形状的结构元素:矩形,圆,直线,磁盘形状,砖石形状等 2.提取步骤 输入图像彩色图像imread 转换为灰度图像cvtColor 转换为二值图像adaptiveThreshol ...

  6. 布尔教育mysql入门视频教程_布尔教育燕十八mysql入门视频教程的资源(源码课件)推荐...

    <布尔教育燕十八mysql入门视频教程>是mysql基础入门课程,随着mysql不断发展,现在使用mysql+php做网站已成为主流web开发技术,如果你想学习动态网页设计,那么建议你选择 ...

  7. 燕十八 mysql优化_布尔教育燕十八mysql优化视频资料分享

    目前数据库是大多数系统进行数据存储的基础组件,数据库的效率对系统的稳定和效率有着至关重要的影响:为了有更好的用户体验,数据库的优化显得异常重要.那么我们要从那些方面对我们的数据库进行优化呢?让我们在& ...

  8. OpenCV(八)形态学操作3--形态学梯度实现轮廓分析(基本梯度、内部梯度、外部梯度、方向梯度X(Y))

    目录 形态学梯度概述 一.基本梯度 1.原理 2.代码 3.效果 二.内部梯度 1.原理 2.代码 3.效果 三.外部梯度 1.原理 2.代码 3.效果 四.方向梯度 1.原理 2.二值化图像(黑白) ...

  9. 布尔教育mysql优化_布尔教育燕十八mysql优化视频课件源码分享

    目前数据库是大多数系统进行数据存储的基础组件,数据库的效率对系统的稳定和效率有着至关重要的影响:为了有更好的用户体验,数据库的优化显得异常重要.那么我们要从那些方面对我们的数据库进行优化呢?让我们在& ...

最新文章

  1. centos安装pg以及pg配置ssl
  2. 简单介绍vue获取token实现token登录的示例代码
  3. 计算机设备布局图,针对不同设备类型创建仪表板布局
  4. MySQL中使用LIMIT进行分页的方法
  5. 七十二、区间合并,插入求交集, 删除被覆盖区间
  6. 帆软按钮控件变查询_帆软报表(多sheet)自定义分页查询
  7. flask request类
  8. android intent 跳转配置,android 再解Intent,通过配置Action和Data跳转
  9. 当spark遇见hbase
  10. java复习【笔试可能常见】
  11. 进行 HTML、JavaScript 和 Ajax 开发和调试的必用工具
  12. 项目创建多少个线程合适
  13. ubuntu18.04系统下使用锐捷校园网两种方法:锐捷客户端登陆和Mentohust登陆方法
  14. 【Win32】只此一篇 让你清楚明细模式(DialogBoxParam)与非模式(CreateDialogParam)对话框的区别
  15. solidworks图纸模板添加_如何建立符合国标的SolidWorks工程图模板
  16. HTML关闭网页弹出窗口代码
  17. php在简历模版文件,PHP简历模板
  18. 完全免费的Windows代码签名证书(大神勿喷)
  19. PJzhang:我发现一个有两个答案的数独题
  20. 使用Feign调用时添加验证信息token到请求头

热门文章

  1. php 零宽断言,正则表达式之零宽断言实例详解【基于PHP】
  2. centos系统linux复制命令行,linux系统CentOS7中find命令使用
  3. python,pytorch:读取,保存,显示图片
  4. 统计内存使用率shell
  5. JDK源码解析之Java.util.Collections
  6. Java并发篇_乐观锁与悲观锁
  7. Flume监听端口,输出端口数据案例
  8. Android O 获取APK文件权限 Demo案例
  9. javaweb中mysql数据库的回滚操作代码
  10. zt:缓存一致性(Cache Coherency)入门 cach coherency