介绍

形态学操作(morphology operators)-膨胀
图像形态学操作 – 基于形状的一系列图像处理操作的合集,主要是基于集合论基础上的形态学数学
形态学有四个基本操作:腐蚀、膨胀、开、闭
膨胀与腐蚀是图像处理中最常用的形态学操作手段

膨胀

跟卷积操作类似,假设有图像A和结构元素B,结构元素B在A上面移动,其中B定义其中心为锚点,计算B覆盖下A的最大像素值用来替换锚点的像素,其中B作为结构体可以是任意形状

在这里插入图片描述
在这里插入图片描述

腐蚀

腐蚀跟膨胀操作的过程类似,唯一不同的是以最小值替换锚点重叠下图像的像素值
在这里插入图片描述
在这里插入图片描述

API介绍

获取结构元素

getStructuringElement(int shape, Size ksize, Point anchor)

  • shape 形状 (MORPH_RECT 矩形 \MORPH_CROSS 变形十字 \MORPH_ELLIPSE 变形椭圆)

  • ksize 大小,奇数

  • anchor 锚点,默认是Point(-1, -1)意思就是中心像素

膨胀

dilate(src, dst, kernel); //原图,目标图像,结构元素
在这里插入图片描述

dilate(src, dst, structureElement, Point(-1, -1), 1); //膨胀(最大值替换,变白亮),结构元素,锚点,迭代次数(不写也默认为1

腐蚀

erode(src, dst, kernel)
在这里插入图片描述

erode(src, dst, structureElement); //腐蚀(最小值替换,变暗黑),锚点前面已定义这里默认了 

创建跟踪条-动态调整结构元素大小

createTrackbar(const String & trackbarname, const String winName, int* value, int count, Trackbarcallback func, void* userdata=0); //命名,窗口名,调整的值,最大值,控制的功能函数

createTrackbar("Element Size:", OUTPUT_WIN, &element_size, max_size, CallBack_Demo);//创建跟踪条,命名,窗口名,调整的值,最大值,控制的功能函数

演示代码

//****************Cuda
#include "opencv2/cudaarithm.hpp"
#include "opencv2/cudaimgproc.hpp"
#include "opencv2/cudafeatures2d.hpp"
#include "opencv2/cudaobjdetect.hpp"
#include "opencv2/cudafilters.hpp"
//***************OpenCV

#include <fstream>
#include <string>
#include<iostream>
#include "opencv2/opencv_modules.hpp"
#include <opencv2/core/utility.hpp>
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/stitching/detail/autocalib.hpp"
#include "opencv2/stitching/detail/blenders.hpp"
#include "opencv2/stitching/detail/timelapsers.hpp"
#include "opencv2/stitching/detail/camera.hpp"
#include "opencv2/stitching/detail/exposure_compensate.hpp"
#include "opencv2/stitching/detail/matchers.hpp"
#include "opencv2/stitching/detail/motion_estimators.hpp"
#include "opencv2/stitching/detail/seam_finders.hpp"
#include "opencv2/stitching/detail/warpers.hpp"
#include "opencv2/stitching/warpers.hpp"
// #include <opencv2/nofree/nofree.hpp>
#include<opencv2/xfeatures2d.hpp>
#include "ctime"
#include <iostream>

using namespace std;
using namespace cv;
using namespace cv::detail;

bool readCamera(const string& filename, Mat& cameraMatrix, Mat& distCoeffs, float& ratio);
char filename[100];
Mat src, dst, dst2;
char OUTPUT_WIN[] = "output image dilate";
char OUTPUT_WIN2[] = "output image erode";
int element_size = 1;
int max_size = 10;
void CallBack_Demo0(int,void*) {
	int s = element_size * 2 + 1;
	Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1)); //获取结构元素,形状,大小,锚点(中心)
	dilate(src, dst, structureElement, Point(-1, -1), 1); //膨胀(最大值替换,变白亮),结构元素,锚点,迭代次数(不写也默认为1)
	//erode(src, dst2, structureElement, Point(-1, -1), 1); //腐蚀(最小值替换,变暗黑),锚点前面已定义这里默认了
	imshow(OUTPUT_WIN, dst);
	//imshow(OUTPUT_WIN2, dst2);
}
void CallBack_Demo1(int, void*) {
	int s = element_size * 2 + 1;
	Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1)); //获取结构元素,形状,大小,锚点(中心)
	//dilate(src, dst, structureElement, Point(-1, -1), 1); //膨胀(最大值替换,变白亮),结构元素,锚点,迭代次数(不写也默认为1)
	erode(src, dst2, structureElement, Point(-1, -1), 1); //腐蚀(最小值替换,变暗黑),锚点前面已定义这里默认了
	//imshow(OUTPUT_WIN, dst);
	imshow(OUTPUT_WIN2, dst2);
}

int main(int argc, char** argv) {
	src = imread("G:\\data1\\image1.jpg");
	namedWindow(OUTPUT_WIN, CV_WINDOW_AUTOSIZE);
	namedWindow(OUTPUT_WIN2, CV_WINDOW_AUTOSIZE);
	createTrackbar("Element Size:", OUTPUT_WIN, &element_size, max_size, CallBack_Demo0);//创建跟踪条,跟踪条命名,窗口名,调整的值,最大值,控制的功能函数
	createTrackbar("Element Size:", OUTPUT_WIN2, &element_size, max_size, CallBack_Demo1);
	//CallBack_Demo(0, 0);
	namedWindow("input image", CV_WINDOW_AUTOSIZE);
	imshow("input image", src);
	waitKey(0);
	return 0;
	return 0;
}
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐