欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【opencv】形态学操作应用-提取水平与垂直线

程序员文章站 2022-07-14 12:54:21
...

**

原理方法:

**
图像形态学操作时候,可以通过自定义的结构元素实现结构元素对输入图像一些对象敏感、另外一些对象不敏感,这样就会让敏

感的对象改变而不敏感的对象保留输出。通过使用两个最基本的形态学操作 – 膨胀与腐蚀,使用不同的结构元素实现对输入图像

的操作、得到想要的结果。

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

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

提取步骤:

1.输入图像彩色图像 imread

2.转换为灰度图像 – cvtColor

3.转换为二值图像 – adaptiveThreshold

4.定义结构元素

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

代码如下:

#include "pch.h"
#include <iostream>
#include "opencv2/opencv.hpp"
 
using namespace std;
using namespace cv;
 
 
int main()
{
	Mat src = imread("F:\\visual studio\\Image\\line.png");
	if (src.empty())
	{
		cout << "Can't load the image" << endl;
		return -1;
	}
	imshow("src", src);
	Mat gray;
	cvtColor(src, gray, CV_BGR2GRAY);
	Mat bin;
        //二值化操作,adaptiveThreshold见书p233
	//为了接下来的腐蚀-膨胀操作,让线条为白色比较适合,因此添加一个取反操作。
	adaptiveThreshold(~gray, bin, 255, cv::ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, 0);
	imshow("bin", bin);
 
	Mat hdst;
	Mat vdst;
	//结构元素分别为一条水平线 和 一条竖直线
	Mat hline = getStructuringElement(MORPH_RECT, Size(bin.cols / 16, 1), Point(-1, -1));
	Mat vline = getStructuringElement(MORPH_RECT, Size(1, bin.rows/16), Point(-1, -1));
	//erode(bin, hdst, hline, Point(-1, -1));
	//dilate(dst, hdst, hline, Point(-1, -1));
	//与上述腐蚀、膨胀等价
	morphologyEx(bin, hdst, MORPH_OPEN, hline, Point(-1, -1));
	//让背景与原图像一样为白色
	bitwise_not(hdst, hdst);
	imshow("hresult", hdst);
	
	morphologyEx(bin, vdst, MORPH_OPEN,vline, Point(-1, -1));
	//让背景与原图像一样为白色
	bitwise_not(vdst, vdst);
	imshow("vresult", vdst);
	waitKey(0);
}

效果如下:能够提取出水平与垂直线。
【opencv】形态学操作应用-提取水平与垂直线
利用形态学开操作也能够提取图片中的文字:


```cpp
#include "pch.h"
#include <iostream>
#include "opencv2/opencv.hpp"
 
using namespace std;
using namespace cv;
 
 
int main()
{
	Mat src = imread("F:\\visual studio\\Image\\abcd.png");
	if (src.empty())
	{
		cout << "Can't load the image" << endl;
		return -1;
	}
	imshow("src", src);
	Mat gray;
	cvtColor(src, gray, CV_BGR2GRAY);
	Mat bin;
	//为了接下来的腐蚀-膨胀操作,让线条为白色比较适合,因此添加一个取反操作。
	adaptiveThreshold(~gray, bin, 255, cv::ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, 0);
	imshow("bin", bin);
 
	Mat dst;
	Mat structureElement = getStructuringElement(MORPH_RECT, Size(5,5), Point(-1, -1));
	//erode(bin, hdst, hline, Point(-1, -1));
	//dilate(dst, hdst, hline, Point(-1, -1));
	//与上述腐蚀、膨胀等价
	morphologyEx(bin, dst, MORPH_OPEN, structureElement, Point(-1, -1));
	//让背景与原图像一样为白色
	bitwise_not(dst, dst);
	imshow("result", dst);
	waitKey(0);
}

【opencv】形态学操作应用-提取水平与垂直线

相关标签: opencv