【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);
}
效果如下:能够提取出水平与垂直线。
利用形态学开操作也能够提取图片中的文字:
```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);
}