今天正式开始学习 opencv ,每日做一些笔记,方便以后学习,同时也希望能够帮到大家。
好了,话不多说。
开始
原图:
1.处理流程
读取图片 -> 灰度化 -> 二值图 -> 开运算。
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/core/core.hpp>
using namespace cv;
int main()
{
Mat dst, out, out2;
Mat img = imread("1.png", 0); //读取图片 转灰度图
threshold(img, dst, 200, 240, THRESH_BINARY_INV); //二值图
Mat hkernel = getStructuringElement(MORPH_RECT, Size(1, 40)); //定义指定形状的窗口卷积
Mat vkernel = getStructuringElement(MORPH_RECT, Size(40, 1));//定义指定形状的窗口卷积
morphologyEx(dst, out, MORPH_OPEN, hkernel); //开运算
morphologyEx(dst, out2, MORPH_OPEN, vkernel); //开运算
imshow("q", out);
waitKey(0);
imshow("q", out2);
waitKey(0);
}
运行图:
垂直线:
水平线
看这样子就提取出来了。
2.如何提取子母A?
垂直线做差 -> 水平线做差 -> 开运算 -> 膨胀。
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/core/core.hpp>
using namespace cv;
int main()
{
Mat dst, out, out2;
Mat img = imread("1.png", 0); //读取图片 转灰度图
threshold(img, dst, 200, 240, THRESH_BINARY_INV); //二值图
Mat hkernel = getStructuringElement(MORPH_RECT, Size(1, 40)); //定义指定形状的窗口卷积
Mat vkernel = getStructuringElement(MORPH_RECT, Size(40, 1));//定义指定形状的窗口卷积
morphologyEx(dst, out, MORPH_OPEN, hkernel); //开运算
morphologyEx(dst, out2, MORPH_OPEN, vkernel); //开运算
subtract(dst, out, dst); //做差
subtract(dst, out2, dst); //做差
Mat open_ones = Mat::ones(Size(3, 3), CV_8UC1);
morphologyEx(dst, dst, MORPH_OPEN, open_ones, Point(-1, -1), 1); //开运算
dilate(dst, dst, open_ones); //膨胀
imshow("1", dst);
waitKey(0);
}
第一次做差 去除垂直线
第二次做差 去除水平线
开运算 去除噪点
在来个膨胀
OK ~