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

本文介绍如何利用图像形态学操作,如膨胀与腐蚀,结合自定义结构元素,从输入图像中有效提取水平与垂直线条。通过灰度化、二值化处理,使用OpenCV库实现对图像的垂直与水平线条的精确识别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.提取的水平线
提取的水平线

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值