相关函数

getStructuringElement(int shape, Size ksize ,Point anchor);注意size还是要奇数
dilate(src, dst, kernel);膨胀
erode(src, dst, kernel);腐蚀
creatTrackbar();创建滑块,比较实用,但我搞不懂

morphologyEX();形态学操作

adaptiveThreshold();
threshold(); //大津法

实现

  • 膨胀

  • 腐蚀

  • 开操作

  • 形态学梯度

  • 提取垂直或水平的线(使用水平或竖直的结构体)

  • 二值化

  • 对图像取反(用~)

笔记

  • opencv结构元素获取(getStructuringElement)我理解是类似卷积核的东西

  • 膨胀:区域最大值覆盖中心值

  • 腐蚀:区域最小值覆盖中心值

  • 开操作:先腐蚀后膨胀,去掉小的对象

  • 闭操作:先膨胀后腐蚀,填充小的洞

  • 形态学梯度可以方便得提取边线

  • 提取垂直或水平的线思路: 使用特殊的结构体来提取特殊的结构,比如一条横线进行开操作就可以提取出横线结构(操作完以后可以blur一下)

  • 在进行阙值分割前对图像进行模糊处理(图像处理领域好像叫滤波?)再分割貌似有更好的效果

  • 挑战: 验证码识别

相关

主要是滑块的应用

// OpenCV_Template.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <string>
#include<opencv2\opencv.hpp>

using namespace std;
using namespace cv;

Mat structs;
Mat imgIn, imgOut;
const int MAXSIZE = 30;
int size_ = 0;

void Graph(int,void*);

int main(int argc, char** argv){
	/****************************************	初始化	****************************************************/
	//VideoCapture cap;
	//cap = VideoCapture(0);
	//Mat cap0;
	//VideoCapture(0) >> cap0;
	//imshow("test", cap0);

	imgIn = imread("D:/WorkSpace/Projects/OpenCV学习/ImageHub/Code1.png", IMREAD_GRAYSCALE);
	if (imgIn.empty()) {
		cout << "Can not open this IMG..." << endl;
		return -1;
	}

	//imgIn = cap0.clone();
	//cvtColor(imgIn, imgIn, COLOR_BGR2GRAY);
	//imshow("test", imgIn);

	medianBlur(imgIn, imgIn, 5);

	//threshold(~imgIn, imgIn, 0, 255, THRESH_OTSU);
	adaptiveThreshold(~imgIn, imgIn, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 33, -10);

	imgOut = imgIn.clone();

	/****************************************	初始化	****************************************************/





	/****************************************	图像操作	****************************************************/
	namedWindow("output", WINDOW_NORMAL);
	imshow("output", imgOut);
	createTrackbar("Kern Size", "output", &size_, MAXSIZE, Graph);		//这个函数调用的方法非常奇特我搞不懂为什么,前两句是为了初始化窗口↑,注意最后一个参数虽然是函数但是不用括号

	/****************************************	图像操作	****************************************************/





	/****************************************	图像输出	****************************************************/
	//namedWindow("input", WINDOW_AUTOSIZE);
	//imshow("input", imgIn);
	//namedWindow("output2", WINDOW_AUTOSIZE);
	//imshow("output2", imgOut2);
	//namedWindow("output3", WINDOW_AUTOSIZE);
	//imshow("output3", imgOut3);
	//namedWindow("output4", WINDOW_AUTOSIZE);
	//imshow("output4", imgOut4);

	//imwrite("D:/Download/Family2020_Final.jpg", imgOut);
	//cout << "Mat=" << endl << imgOut << endl;

	/****************************************	图像输出	****************************************************/



	waitKey(0);
	return 0;
}



void Graph(int, void*) {		//注意书写格式,虽然我不知道为什么

	int s = size_ * 2 + 1 ;
	structs = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));

	//erode(imgIn, imgOut, structs);
	//dilate(imgOut, imgOut, structs);

	morphologyEx(imgIn, imgOut, MORPH_GRADIENT, structs);

	imshow("output", imgOut);

	return;
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件