设为首页收藏本站 |天气与日历| 2025-08-23 星期六 01:16:00 乙巳(蛇)年 七月初一 丑时 处暑
     
切换到窄版

私人站点

 找回密码
 立即注册
搜索
查看: 182|回复: 0

形态学操作

[复制链接]

954

主题

954

帖子

3879

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3879
发表于 2022-2-25 13:42:45 | 显示全部楼层 |阅读模式
开操作- open
闭操作- close
形态学梯度- Morphological Gradient
顶帽 – top hat
黑帽 – black hat



开操作- open

先腐蚀后膨胀
可以去掉小的对象,假设对象是前景色,背景是黑色
[C++] 纯文本查看 复制代码
/*
注意:
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:源图像Mat对象
○dst:目标图像Mat对象
○op:操作的类型,通过源码我们得知总共有以下几种类型:
○kernel:用于膨胀操作的结构元素,如果取值为Mat(),那么默认使用一个3 x 3 的方形结构元素,可以使用getStructuringElement()来创建结构元素
○anchor:参考点,其默认值为(-1,-1)说明位于kernel的中心位置。
○borderType :边缘类型,默认为BORDER_CONSTANT。
○borderValue :边缘值,用它的默认值即可。

enum MorphTypes{
        MORPH_ERODE    = 0, //腐蚀
        MORPH_DILATE   = 1, //膨胀
        MORPH_OPEN     = 2, //开操作
        MORPH_CLOSE    = 3, //闭操作
        MORPH_GRADIENT = 4, //梯度操作
        MORPH_TOPHAT   = 5, //顶帽操作
        MORPH_BLACKHAT = 6, //黑帽操作
        MORPH_HITMISS  = 7
};

●MORPH_ERODE(腐蚀)
跟erode(腐蚀)函数效果一样
●MORPH_DILATE(膨胀)
跟dilate(膨胀)函数效果一样
●MORPH_OPEN(开)
其实内部就是进行了先腐蚀后膨胀的操作。
●MORPH_CLOSE(闭)
其实内部就是进行了先膨胀后腐蚀的操作。
*/
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;

int main(int argc, char** argv) {
        Mat src, dst;
        src = imread("111.png");
        if (!src.data) {
                printf("加载图片异常\n");
                return -1;
        }
        namedWindow("input", CV_WINDOW_AUTOSIZE);
        imshow("input", src);
        char outputimg[] = "输出窗口";
        namedWindow(outputimg, CV_WINDOW_AUTOSIZE);
        Mat kernel = getStructuringElement(MORPH_RECT, Size(15, 15), Point(-1, -1));
        //getStructuringElement返回指定形状和尺寸的结构元素
        morphologyEx(src,dst,CV_MOP_OPEN,kernel);
        //开操作
        imshow(outputimg, dst);
        waitKey(0);
        return 0;
}

9.jpg

闭操作-close:
先膨胀后腐蚀(bin2)
可以填充小的洞(fill hole),假设对象是前景色,背景是黑色

[C++] 纯文本查看 复制代码
/*
注意:
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:源图像Mat对象
○dst:目标图像Mat对象
○op:操作的类型,通过源码我们得知总共有以下几种类型:
○kernel:用于膨胀操作的结构元素,如果取值为Mat(),那么默认使用一个3 x 3 的方形结构元素,可以使用getStructuringElement()来创建结构元素
○anchor:参考点,其默认值为(-1,-1)说明位于kernel的中心位置。
○borderType :边缘类型,默认为BORDER_CONSTANT。
○borderValue :边缘值,用它的默认值即可。

enum MorphTypes{
        MORPH_ERODE    = 0, //腐蚀
        MORPH_DILATE   = 1, //膨胀
        MORPH_OPEN     = 2, //开操作
        MORPH_CLOSE    = 3, //闭操作
        MORPH_GRADIENT = 4, //梯度操作
        MORPH_TOPHAT   = 5, //顶帽操作
        MORPH_BLACKHAT = 6, //黑帽操作
        MORPH_HITMISS  = 7
};

●MORPH_ERODE(腐蚀)
跟erode(腐蚀)函数效果一样
●MORPH_DILATE(膨胀)
跟dilate(膨胀)函数效果一样
●MORPH_OPEN(开)
其实内部就是进行了先腐蚀后膨胀的操作。
●MORPH_CLOSE(闭)
其实内部就是进行了先膨胀后腐蚀的操作。
*/
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;

int main(int argc, char** argv) {
        Mat src, dst;
        src = imread("2222.png");
        if (!src.data) {
                printf("加载图片异常\n");
                return -1;
        }
        namedWindow("input", CV_WINDOW_AUTOSIZE);
        imshow("input", src);
        char outputimg[] = "输出窗口";
        namedWindow(outputimg, CV_WINDOW_AUTOSIZE);
        Mat kernel = getStructuringElement(MORPH_RECT, Size(15, 15), Point(-1, -1));
        //getStructuringElement返回指定形状和尺寸的结构元素
        morphologyEx(src,dst,CV_MOP_CLOSE,kernel);
        //闭操作
        imshow(outputimg, dst);
        waitKey(0);
        return 0;
}

333666.jpg


形态学梯度- Morphological Gradient
膨胀减去腐蚀
又称为基本梯度(其它还包括-内部梯度、方向梯度)

[C++] 纯文本查看 复制代码
/*
注意:
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:源图像Mat对象
○dst:目标图像Mat对象
○op:操作的类型,通过源码我们得知总共有以下几种类型:
○kernel:用于膨胀操作的结构元素,如果取值为Mat(),那么默认使用一个3 x 3 的方形结构元素,可以使用getStructuringElement()来创建结构元素
○anchor:参考点,其默认值为(-1,-1)说明位于kernel的中心位置。
○borderType :边缘类型,默认为BORDER_CONSTANT。
○borderValue :边缘值,用它的默认值即可。

enum MorphTypes{
        MORPH_ERODE    = 0, //腐蚀
        MORPH_DILATE   = 1, //膨胀
        MORPH_OPEN     = 2, //开操作
        MORPH_CLOSE    = 3, //闭操作
        MORPH_GRADIENT = 4, //梯度操作
        MORPH_TOPHAT   = 5, //顶帽操作
        MORPH_BLACKHAT = 6, //黑帽操作
        MORPH_HITMISS  = 7
};

●MORPH_ERODE(腐蚀)
跟erode(腐蚀)函数效果一样
●MORPH_DILATE(膨胀)
跟dilate(膨胀)函数效果一样
●MORPH_OPEN(开)
其实内部就是进行了先腐蚀后膨胀的操作。
●MORPH_CLOSE(闭)
其实内部就是进行了先膨胀后腐蚀的操作。
*/
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;

int main(int argc, char** argv) {
        Mat src, dst;
        src = imread("ccc.jpg");
        if (!src.data) {
                printf("加载图片异常\n");
                return -1;
        }
        namedWindow("input", CV_WINDOW_AUTOSIZE);
        imshow("input", src);
        char outputimg[] = "输出窗口";
        namedWindow(outputimg, CV_WINDOW_AUTOSIZE);
        Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
        //getStructuringElement返回指定形状和尺寸的结构元素
        morphologyEx(src,dst,CV_MOP_GRADIENT,kernel);

        //梯度操作
        imshow(outputimg, dst);
        waitKey(0);
        return 0;
}

8.jpg


顶帽 – top hat
顶帽 是原图像与开操作之间的差值图像

[C++] 纯文本查看 复制代码
/*
注意:
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:源图像Mat对象
○dst:目标图像Mat对象
○op:操作的类型,通过源码我们得知总共有以下几种类型:
○kernel:用于膨胀操作的结构元素,如果取值为Mat(),那么默认使用一个3 x 3 的方形结构元素,可以使用getStructuringElement()来创建结构元素
○anchor:参考点,其默认值为(-1,-1)说明位于kernel的中心位置。
○borderType :边缘类型,默认为BORDER_CONSTANT。
○borderValue :边缘值,用它的默认值即可。

enum MorphTypes{
        MORPH_ERODE    = 0, //腐蚀
        MORPH_DILATE   = 1, //膨胀
        MORPH_OPEN     = 2, //开操作
        MORPH_CLOSE    = 3, //闭操作
        MORPH_GRADIENT = 4, //梯度操作
        MORPH_TOPHAT   = 5, //顶帽操作
        MORPH_BLACKHAT = 6, //黑帽操作
        MORPH_HITMISS  = 7
};

●MORPH_ERODE(腐蚀)
跟erode(腐蚀)函数效果一样
●MORPH_DILATE(膨胀)
跟dilate(膨胀)函数效果一样
●MORPH_OPEN(开)
其实内部就是进行了先腐蚀后膨胀的操作。
●MORPH_CLOSE(闭)
其实内部就是进行了先膨胀后腐蚀的操作。
*/
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;

int main(int argc, char** argv) {
        Mat src, dst;
        src = imread("111.png");
        if (!src.data) {
                printf("加载图片异常\n");
                return -1;
        }
        namedWindow("input", CV_WINDOW_AUTOSIZE);
        imshow("input", src);
        char outputimg[] = "输出窗口";
        namedWindow(outputimg, CV_WINDOW_AUTOSIZE);
        Mat kernel = getStructuringElement(MORPH_RECT, Size(15, 15), Point(-1, -1));
        //getStructuringElement返回指定形状和尺寸的结构元素
        morphologyEx(src,dst, MORPH_TOPHAT,kernel);

        //顶帽操作
        imshow(outputimg, dst);
        waitKey(0);
        return 0;
}

34.jpg



黑帽

黑帽是闭操作图像与源图像的差值图像
[C++] 纯文本查看 复制代码
/*
注意:
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:源图像Mat对象
○dst:目标图像Mat对象
○op:操作的类型,通过源码我们得知总共有以下几种类型:
○kernel:用于膨胀操作的结构元素,如果取值为Mat(),那么默认使用一个3 x 3 的方形结构元素,可以使用getStructuringElement()来创建结构元素
○anchor:参考点,其默认值为(-1,-1)说明位于kernel的中心位置。
○borderType :边缘类型,默认为BORDER_CONSTANT。
○borderValue :边缘值,用它的默认值即可。

enum MorphTypes{
	MORPH_ERODE    = 0, //腐蚀
	MORPH_DILATE   = 1, //膨胀
	MORPH_OPEN     = 2, //开操作
	MORPH_CLOSE    = 3, //闭操作
	MORPH_GRADIENT = 4, //梯度操作
	MORPH_TOPHAT   = 5, //顶帽操作
	MORPH_BLACKHAT = 6, //黑帽操作
	MORPH_HITMISS  = 7
};

●MORPH_ERODE(腐蚀)
跟erode(腐蚀)函数效果一样
●MORPH_DILATE(膨胀)
跟dilate(膨胀)函数效果一样
●MORPH_OPEN(开)
其实内部就是进行了先腐蚀后膨胀的操作。
●MORPH_CLOSE(闭)
其实内部就是进行了先膨胀后腐蚀的操作。
*/
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;

int main(int argc, char** argv) {
	Mat src, dst;
	src = imread("2222.png");
	if (!src.data) {
		printf("加载图片异常\n");
		return -1;
	}
	namedWindow("input", CV_WINDOW_AUTOSIZE);
	imshow("input", src);
	char outputimg[] = "输出窗口";
	namedWindow(outputimg, CV_WINDOW_AUTOSIZE);
	Mat kernel = getStructuringElement(MORPH_RECT, Size(15, 15), Point(-1, -1));
	//getStructuringElement返回指定形状和尺寸的结构元素
	morphologyEx(src,dst, MORPH_BLACKHAT,kernel);

	//黑帽操作
	imshow(outputimg, dst);
	waitKey(0);
	return 0;
}

9998.jpg




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|编程站点 ( 冀ICP备2023028127号-2 )|友链申请|

GMT+8, 2025-8-23 01:16 , Processed in 0.101486 second(s), 25 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表