OpenCV学习:形态学操作

第九课 形态学操作(最好先变成二值图像)
//输入、输出、形态学操作类型、结构元素

API:morphologyEx(src,dst,CV_MOP_BLACKHAT,kernel)

1.开操作 open
先腐蚀后膨胀,可以去掉小的对象,假设对象是前景色,背景是黑色

	Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
	morphologyEx(src, dst, CV_MOP_OPEN, kernel);

2.闭操作 close
先膨胀后腐蚀,可以填充小的洞,假设对象是前景色,背景是黑色

	kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
	morphologyEx(src, dst, CV_MOP_CLOSE, kernel);

3.形态学梯度 gradient
膨胀减去腐蚀,也称基本梯度(其它还包含内部梯度,方向梯度)

	Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
	morphologyEx(src, dst, CV_MOP_GRADIENT, kernel;

4.顶帽 top hat
原图像与开操作图像的差值图像

	Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
	morphologyEx(src, dst, CV_MOP_TOPHAT, kernel;

5.黑帽 black hat
闭操作图像与原图像的差值图像:可以对瑕疵的小点测量做准备

	Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
	morphologyEx(src, dst, CV_MOP_BLACKHATHAT, kernel;

第十课 提取水平与垂直线
1.原理方法
图像形态学操作的时候,可以通过自定义结构元素实现结构元素输入图像的一些对象敏感
另外一些对象不敏感,这样就可以让敏感对象改变而不敏感对象保留输出。通过两个最基
本的形态学操作——膨胀与腐蚀,使用不同的结构元素实现对输入图像的操作,得到想要的
结果
膨胀——输出的像素值是结构元素覆盖下输入图像的最大像素值
腐蚀——输出的像素值是结构元素覆盖下输入图像的最小像素值
2.实现步骤
输入彩色图像——imread
转化为灰度图像——cvtColor
转化为二值图像——adaptiveThreadhold
//输入,输出,二值图像最大值,自适应方法(ADAPTIVE_THRESH_MEAN_C,ADAPTIVE_THRESH_GAUSSIAN_C)
//阈值类型,块大小,常量c可以为正负和0

		adaptiveThreadhold(Mat src,Mat dst,double maxValue,int adaptiveMethod
		,int threshType,int blockSize,double c);

定义结构元素
开操作(腐蚀加膨胀)提取水平与垂直线

3.源代码

#include <opencv2/opencv.hpp>
	#include <iostream>

	using namespace cv;
	int main(int argc, char** argv) {
		Mat src, dst;
		src = imread("D:/vcprojects/images/chars.png");
		if (!src.data) {
			printf("could not load image...\n");
			return -1;
		}

		char INPUT_WIN[] = "input image";
		char OUTPUT_WIN[] = "result image";
		namedWindow(INPUT_WIN, CV_WINDOW_AUTOSIZE);
		imshow(INPUT_WIN, src);

		Mat gray_src;
		cvtColor(src, gray_src, CV_BGR2GRAY);
		imshow("gray image", gray_src);
		
		Mat binImg;
		adaptiveThreshold(~gray_src, binImg, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
		imshow("binary image", binImg);

		// 水平结构元素
		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));
		// 矩形结构
		Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));

		Mat temp;
		erode(binImg, temp, kernel);
		dilate(temp, dst, kernel);
		// morphologyEx(binImg, dst, CV_MOP_OPEN, vline);
		bitwise_not(dst, dst);
		//blur(dst, dst, Size(3, 3), Point(-1, -1));
		imshow("Final Result", dst);

		waitKey(0);
		return 0;
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值