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

 更新时间:2020年07月21日 08:54:23   作者:MnisRain  
这篇文章主要为大家详细介绍了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)
{
 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" << endl;
 return -1;
 }

 namedWindow("input_Img", 0);
 imshow("input_Img", src);
 //输入图像转灰度
 Mat grayImg = gray_Img(src);
 namedWindow("input_Img_gray", 0);
 imshow("input_Img_gray", grayImg);
 //二值化图像
 Mat thresholdImg = threshold_Img(grayImg);
 namedWindow("input_Img_threshold", 0);
 imshow("input_Img_threshold", thresholdImg);

 Mat verticalLine = get_Vertical(src);
 Mat horizontalLine = get_Horizontal(src);
 //先腐蚀再膨胀
 Mat vertical_Line_erode = erode_Img(thresholdImg, verticalLine);
 Mat vertical_Line_dilate = dilate_Img(vertical_Line_erode, verticalLine);
 //显示图像中的垂直线
 namedWindow("verticalLine", 0);
 imshow("verticalLine", vertical_Line_dilate);

 Mat horizontal_Line_erode = erode_Img(thresholdImg, horizontalLine);
 Mat horizontal_Line_dilate = dilate_Img(horizontal_Line_erode, horizontalLine);
 //显示图像中的垂直线
 namedWindow("horizontalLine", 0);
 imshow("horizontalLine", horizontal_Line_dilate);

 waitKey();
 return 0;
}

4).我的运行结果

1.灰度化结果

2.二值化

3.提取的垂直线

4.提取的水平线

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

相关文章

  • C语言详细分析讲解关键字goto与void的作用

    C语言详细分析讲解关键字goto与void的作用

    我们在C语言中经常会见到void,也会偶尔见到goto,那么C语言中既然有goto,为什么我们在代码中见的很少呢?在以前很多的项目经验中,我们得到这样一条潜规则:一般项目都是禁用goto的,程序质量与goto的出现次数成反比。自后也就造成了我们一般不会使用goto
    2022-04-04
  • C ++迭代器iterator在string中使用方法介绍

    C ++迭代器iterator在string中使用方法介绍

    迭代器是一种检查容器内元素并遍历元素的数据类型。迭代器是一个变量,提供对一个容器中的对象的(间接)访问方法,并且定义了容器中对象的范围。迭代器可以指向容器中的某个元素,通过迭代器就可以对非数组(存储空间不连续)的数据结构进行遍历
    2022-10-10
  • C++调用C函数实例详解

    C++调用C函数实例详解

    这篇文章主要介绍了C++调用C函数实例详解的相关资料,需要的朋友可以参考下
    2017-07-07
  • C/C++中CJSON的使用(创建与解析JSON数据)

    C/C++中CJSON的使用(创建与解析JSON数据)

    cJSON是一个超轻巧的JSON解析器,本文主要介绍了C/C++中CJSON的使用(创建与解析JSON数据),具有一定的参考价值,感兴趣的可以了解一下
    2021-09-09
  • C++实例讲解四种类型转换的使用

    C++实例讲解四种类型转换的使用

    在C++语言中新增了四个关键字static_cast、const_cast、reinterpret_cast和dynamic_cast。这四个关键字都是用于类型转换的,类型转换(type cast),是高级语言的一个基本语法。它被实现为一个特殊的运算符,以小括号内加上类型名来表示,接下来让我们一起来详细了解
    2022-06-06
  • 纯C语言:递归组合数源码分享

    纯C语言:递归组合数源码分享

    这篇文章主要介绍了纯C语言:递归组合数源码,有需要的朋友可以参考一下
    2014-01-01
  • C++获取任务栏打开程序窗口示例

    C++获取任务栏打开程序窗口示例

    这篇文章主要介绍了C++获取任务栏打开程序窗口,大家可以参考使用
    2013-11-11
  • C++实现扫雷、排雷小游戏

    C++实现扫雷、排雷小游戏

    这篇文章主要为大家详细介绍了C++实现扫雷、排雷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • c++中比较好用的“黑科技”

    c++中比较好用的“黑科技”

    这篇文章主要介绍了c++中比较好用的“黑科技”,一些常用小编没有给大家罗列出,主要给大家介绍了sort函数,需要的朋友可以参考下
    2020-02-02
  • C语言实现学生管理系统

    C语言实现学生管理系统

    这篇文章主要为大家详细介绍了C语言实现学生管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02

最新评论