介绍
形态学操作(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;
}