本系列代码托管于:https://github.com/chintsan-code/opencv4-tutorials

本篇使用的项目为:open_close、morph_gradient、top_bottom_hat、hit_miss

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

using namespace cv;
using namespace std;

int main(int argc, const char** argv) {
	Mat src1 = imread("../sample/morph02.png");
	Mat src2 = imread("../sample/morph3.png");
	if (src1.empty() || src2.empty()) {
		cout << "could not load image..." << endl;
		return -1;
	}
	
	Mat gray, binary, dst;
	// open demo
	cvtColor(src1, gray, COLOR_BGR2GRAY);
	threshold(gray, binary, 0, 255, THRESH_BINARY_INV | THRESH_OTSU);
	imshow("binary1", binary);

	Mat kernel1 = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
	morphologyEx(binary, dst, MORPH_OPEN, kernel1, Point(-1, -1), 1);
	imshow("open-demo", dst);

	// close demo
	cvtColor(src2, gray, COLOR_BGR2GRAY);
	threshold(gray, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);
	imshow("binary2", binary);

	Mat kernel2 = getStructuringElement(MORPH_ELLIPSE, Size(23, 23), Point(-1, -1));
	morphologyEx(binary, dst, MORPH_CLOSE, kernel2, Point(-1, -1), 1);
	imshow("close-demo", dst);

	waitKey(0);
	destroyAllWindows();
	return 0;
}

开操作 = 腐蚀 + 膨胀

可以删除小的干扰块

opencv4入门笔记(36):图像形态学操作——开闭操作、梯度运算、顶帽底帽运算、击中击不中运算-萤火

闭操作 = 膨胀 + 腐蚀

可以填充闭合区域

opencv4入门笔记(36):图像形态学操作——开闭操作、梯度运算、顶帽底帽运算、击中击不中运算-萤火

morphologyEx:使用腐蚀(erode)和膨胀(dilate)作为基本操作来处理高级的形态学操作

void morphologyEx( InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor = Point(-1,-1), int iterations = 1, int borderType = BORDER_CONSTANT, const Scalar& borderValue = morphologyDefaultBorderValue() );
  • src:输入图像,通道数可以任意,但是图像深度应该为CV_8U, CV_16U, CV_16S, CV_32F or CV_64F中的一种
  • dst:输出图像,与src具有相同的尺寸和类型
  • op:形态学操作
    • MORPH_ERODE:腐蚀,相当于erode函数
    • MORPH_DILATE:膨胀,相当于dilate函数
    • MORPH_OPEN:开运算
    • MORPH_CLOSE:闭运算
    • MORPH_GRADIENT:形态学基本梯度运算。膨胀 – 腐蚀
    • MORPH_TOPHAT:顶帽运算,也叫白帽。顶帽 = 原图 – 开运算
    • MORPH_BLACKHAT:黑帽运算,也叫底帽运算。黑帽 = 闭运算 – 原图
    • MORPH_HITMISS:击中击不中变换。
  • kernel:结构元素,可以通过getStructuringElement函数生成
  • anchor:锚点。默认(-1,-1),为结构元素中心
  • iterations:做多少次腐蚀操作
  • borderType:图像边缘处理方式
  • borderValue:当borderType为BORDER_CONSTANT时,边缘填充值

形态学梯度运算除了基本梯度运算(膨胀 – 腐蚀),还包括内梯度(原图 – 腐蚀)、外梯度(膨胀 – 原图)

击中击不中变换:

opencv4入门笔记(36):图像形态学操作——开闭操作、梯度运算、顶帽底帽运算、击中击不中运算-萤火