OPENCV系列博客主要记录自己学习OPENCV的历程,以及存储已经实现的代码,以备后续回顾使用,代码中包含了主要的备注。
一. 原理方法
二. 代码实现
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
/***********************************
* 形态学操作例子:使用形态学操作,消除图片内部的横线和竖线
* 方法为: 使用膨胀+腐蚀处理二值化之后的图片;
* 步骤为:
* 1. 读取图片,依次将图片修改为灰度图,并将灰度图转化为二值图
* 2. 创建形态学操作子
* 3. 依次使用腐蚀 和膨胀操作,消除图片中的横线与竖线
***********************************/
int main(int argc, char** argv) {
//Step1 读取图片,并显示出来
Mat src = imread("E:/OpenCVLearning/Project/source_image/LineRemoval.jpg"); //注意斜线方向
if (!src.data) {
cout << "Could not load the image ...." << endl;
return -1;
}
char input_image[] = "Original Image"; //窗口名
namedWindow(input_image,CV_WINDOW_AUTOSIZE); //创建窗口
imshow(input_image,src); //显示
//Step2 将图片转化为灰度图,并显示
Mat gray_src;
cvtColor(src,gray_src,COLOR_BGR2GRAY);
char gray_image[] = "GrayScale Image"; //窗口名
namedWindow(gray_image, CV_WINDOW_AUTOSIZE); //创建窗口
imshow(gray_image, gray_src); //显示
//Step3 !将图片转化为二值图
Mat bin_src;
//!!重要:转化为二值图的方式
// (输入灰度图,输出二值图,!二值图最大值,!自适应方法,!阈值类型,块大小,!常量)
adaptiveThreshold(~gray_src,bin_src,255, ADAPTIVE_THRESH_MEAN_C,THRESH_BINARY, 15, -2);
char bin_image[] = "Bin Image"; //窗口名
namedWindow(bin_image, CV_WINDOW_AUTOSIZE); //创建窗口
imshow(bin_image, bin_src); //显示
//Step4 !创建形态学元素
Mat hline = getStructuringElement(MORPH_RECT, Size(src.cols/16,1),Point(-1,-1));
Mat vline = getStructuringElement(MORPH_RECT, Size(1,src.rows/16), Point(-1, -1));
//Step4 先腐蚀再膨胀
// 注意!腐蚀是:用形态学元素,覆盖图片上,仅在中心保留最小的值。 (由于二值图中,0是黑,1是白; 所以黑色被保留)
Mat temp_image;
erode(bin_src, temp_image, hline);
erode(temp_image, temp_image, hline);
imshow("Final_image", temp_image);
waitKey(0);
return 0;
}
三. 实现效果