热门标签 | HotTags
当前位置:  开发笔记 > IOS > 正文

OpenCV识别提取图像中的水平线与垂直线

这篇文章主要为大家详细介绍了OpenCV识别提取图像中的水平线与垂直线,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了OpenCV识别提取图像中的水平线与垂直线,供大家参考,具体内容如下

1).原理

图像形态学操作时候,可以通过自定义的结构元素实现结构元素 对输入图像一些对象敏感、另外一些对象不敏感,这样就会让敏感的对象改变而不敏感的对象保留输出。通过使用两个最基本的形态学操作 – 膨胀与腐蚀,使用不同的结构元素实现对输入图像的操作、得到想要的结果。

-膨胀,输出的像素值是结构元素覆盖下输入图像的最大像素值

-腐蚀,输出的像素值是结构元素覆盖下输入图像的最小像素值

常见的形状:矩形、园、直线、磁盘形状、砖石形状等各种自定义形状。

2).步骤

1.输入图像彩色图像 imread
2.转换为灰度图像 – cvtColor
3.转换为二值图像 – adaptiveThreshold
4.定义结构元素
5.开操作 (腐蚀+膨胀)提取 水平与垂直线

3).完整代码

(本人的运行环境是:vs2017+OpenCV3.4)

#include 
#include 
#include 

using namespace std;
using namespace cv;

//灰度化图像
Mat gray_Img(Mat src)
{
 Mat dst = Mat::zeros(src.size(), src.type());
 cvtColor(src, dst, CV_BGR2GRAY);
 return dst;
}

//自适应阈值(二值化图像)
Mat threshold_Img(Mat src)
{
 Mat dst = Mat::zeros(src.size(), src.type());
 //参数:输入, 输出, 二值图像的最大值 , 在一个邻域内计算阈值所采用的算法,有两个取值分别为 ADAPTIVE_THRESH_MEAN_C 和 ADAPTIVE_THRESH_GAUSSIAN_C , 阈值类型只有两个取值,分别为 THRESH_BINARY 和THRESH_BINARY_INV,(blockSize)adaptiveThreshold的计算单位是像素的邻域块,邻域块取多大就由这个值作决定, 偏移值调整量
 adaptiveThreshold(~src, dst, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2); 
 return dst;
}

//结构元素(获取垂直算子)
Mat get_Vertical(Mat src)
{
 Mat dst = Mat::zeros(src.size(), src.type());
 return getStructuringElement(MORPH_RECT,Size(src.cols/16,1),Point(-1,-1));
}

//结构元素(获取水平算子)
Mat get_Horizontal(Mat src)
{
 Mat dst = Mat::zeros(src.size(), src.type());
 return getStructuringElement(MORPH_RECT, Size(1, src.rows / 16), Point(-1, -1));
}

//腐蚀
Mat erode_Img(Mat src,Mat kernel)
{
 Mat dst = Mat::zeros(src.size(), src.type());
 erode(src, dst, kernel);
 return dst;
}

//膨胀
Mat dilate_Img(Mat src, Mat kernel)
{
 Mat dst = Mat::zeros(src.size(), src.type());
 dilate(src, dst, kernel);
 return dst;
}


int main()
{
 Mat src = imread("001.png");
 if (src.empty())
 {
 cout <<"fail to load image" <

4).我的运行结果

1.灰度化结果

2.二值化

3.提取的垂直线

4.提取的水平线

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • ANSI最全介绍linux终端字体改变颜色等ANSI转义序列维基百科,自由的百科全书由于国内不能访问wiki而且国内关于ANSI的介绍都是简短的不能达到,不够完整所以转wiki到此 ... [详细]
  • 本文通过对OkHttp源码的详细解读,旨在帮助读者理解其核心执行流程,特别是同步与异步请求的处理方式。文中不仅涵盖了基本的使用示例,还深入探讨了OkHttp的核心功能——拦截器链的工作原理。 ... [详细]
  • 深入理解Redis集群机制
    本文旨在深入探讨Redis集群的工作原理,包括其架构设计、数据分布策略、节点通信及故障恢复机制等方面的内容。 ... [详细]
  • 本文详细解析了LeetCode第581题——最短无序连续子数组的解决方案,重点介绍了贪心算法的应用及其具体实现步骤。 ... [详细]
  • 本文探讨了归并排序算法在求解逆序数问题中的应用,并对比分析了两种实现方法。第一种方法使用指针和动态数组,存在内存管理上的风险;而第二种方法通过引入临时数组简化了实现过程,提高了代码的健壮性和可读性。 ... [详细]
  • 深入解析Hcash的PoW+PoS混合共识机制优势
    本文探讨了Hcash项目如何通过结合工作量证明(PoW)和权益证明(PoS)两种共识机制,有效解决了单一机制下的诸多问题,如资源浪费、决策集中及安全风险等,实现了更广泛的社区参与和更高的安全性。 ... [详细]
  • 大数据SQL优化:全面解析数据倾斜解决方案
    本文深入探讨了大数据SQL优化中的数据倾斜问题,提供了多种解决策略和实际案例,旨在帮助读者理解和应对这一常见挑战。 ... [详细]
  • 本文深入探讨 JavaScript 中的 String 类型及其常见操作方法,包括字符串的创建、转换以及一些常用的字符串处理函数。 ... [详细]
  • 本文探讨了Thrift作为一款支持多语言的服务开发框架,其在体积、功能、扩展性以及多协议支持等方面的显著优势。特别地,Thrift作为一种RPC(远程过程调用协议)框架,非常适合用于构建可扩展且低耦合的分布式服务系统。文章通过多种编程语言对Thrift服务进行了性能测试,并提供了详细的测试结果。 ... [详细]
  • 通过学习《Think Python》,我对Python编程有了初步了解,但在使用第三方库方面仍感到陌生。近期因百度空间即将关闭,我打算利用Evi1m0提供的Python爬虫代码备份个人网站,过程中遇到了第三方库安装的问题。 ... [详细]
  • 远程访问用户 Kindle通过电子书实现控制
    介绍自2007年以来,亚马逊已售出数千万台Kindle,令人印象深刻。但这也意味着数以千万计的人可能会因为这些Kindle中的软件漏洞而被黑客入侵。他 ... [详细]
  • 运用DDD分层架构优化微服务代码设计
    在微服务实施过程中,确定合理的代码结构至关重要。本文探讨了如何利用领域驱动设计(DDD)的分层架构来优化微服务的代码模型,确保系统的可维护性和扩展性。 ... [详细]
  • 本文详细介绍了快速排序算法的工作原理和实现步骤,包括选择基准值、分区过程以及递归调用等关键环节。通过具体的Java代码示例,帮助读者更好地理解和掌握这一高效的排序算法。 ... [详细]
  • 本文总结了几个常用的Android开发技巧,包括检测设备上是否安装特定应用、获取应用的版本名称、设置状态栏透明以及如何从一个应用跳转至另一个应用的方法。 ... [详细]
  • 本文详细介绍了MySQL表分区的概念、类型及其在实际应用中的实施方法,特别是针对Zabbix数据库的优化策略。 ... [详细]
author-avatar
从妖妖
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有