没有合适的资源?快使用搜索试试~ 我知道了~
首页OpenCV:详解图像中水平线与垂直线的识别与提取
OpenCV:详解图像中水平线与垂直线的识别与提取
15 下载量 50 浏览量
更新于2023-03-03
1
收藏 288KB PDF 举报
本文详细介绍了如何在OpenCV中利用图像处理技术来识别并提取图像中的水平线和垂直线。首先,我们回顾了图像形态学的基本原理,这是OpenCV实现这一功能的关键。形态学操作,如膨胀和腐蚀,允许我们根据自定义结构元素对图像进行处理,以突出或抑制特定的对象。膨胀操作会保留输入图像中结构元素覆盖区域内最大像素值,而腐蚀则会选择最小像素值,这对于区分水平线和平行于图像边缘的线条非常有效。 在实际操作步骤中,文章建议以下顺序: 1. 首先,从彩色图像开始,使用`imread`函数读取图片。 2. 接着,将彩色图像转换为灰度图像,这有助于减少颜色干扰,使用`cvtColor`函数执行`CV_BGR2GRAY`转换。 3. 然后,通过`adaptiveThreshold`函数进行二值化,该函数可以根据指定的邻域算法和阈值类型将图像转换为二值,有助于区分前景和背景。 4. 定义结构元素,常见的包括矩形、圆形、直线等,这些将在后续操作中作为模板用于检测线条。 5. 最后,应用开运算(腐蚀+膨胀),这个操作可以帮助去除噪声,同时保持水平线和垂直线的完整性,因为水平线和垂直线对腐蚀和膨胀的影响较小。 作者提供了完整的C++代码片段,展示了如何在VS2017环境中使用OpenCV 3.4版本实现这些步骤。这段代码首先定义了灰度化和二值化的辅助函数,然后在主函数中调用它们,并应用开运算来提取线条。通过阅读和理解这部分代码,读者能够掌握在实际项目中如何运用OpenCV来自动检测图像中的水平线和垂直线。 这篇文章提供了一个实用且详尽的方法,不仅涵盖了理论基础,还有实际操作的代码示例,对于希望在计算机视觉领域中处理图像的开发者来说,是一个很好的参考资料。
资源详情
资源推荐
OpenCV识别提取图像中的水平线与垂直线识别提取图像中的水平线与垂直线
主要为大家详细介绍了OpenCV识别提取图像中的水平线与垂直线,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了OpenCV识别提取图像中的水平线与垂直线,供大家参考,具体内容如下
1)).原理原理
图像形态学操作时候,可以通过自定义的结构元素实现结构元素 对输入图像一些对象敏感、另外一些对象不敏感,这样就会让敏感的对象改变而不敏感的对象保留输出。通过使用两个最基本的形态学操
作 – 膨胀与腐蚀,使用不同的结构元素实现对输入图像的操作、得到想要的结果。
-膨胀,输出的像素值是结构元素覆盖下输入图像的最大像素值
-腐蚀,输出的像素值是结构元素覆盖下输入图像的最小像素值
常见的形状:矩形、园、直线、磁盘形状、砖石形状等各种自定义形状。
2)).步骤步骤
1.输入图像彩色图像 imread
2.转换为灰度图像 – cvtColor
3.转换为二值图像 – adaptiveThreshold
4.定义结构元素
5.开操作 (腐蚀+膨胀)提取 水平与垂直线
3)).完整代码完整代码
(本人的运行环境是:vs2017+OpenCV3.4)
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
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)
{
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功