<LearnOpenCV(9) C++>形态学操作(二)

形态学操作(一)

简单了解二值图像的复合形态学操作(还是用二值图像吧)

API

CV_EXPORTS_W 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 输入图像
  • dst 输出图像
  • op 操作类型 MORPH_OPEN、 MORPH_CLOSE、 MORPH_TOPHAT等
  • kernel 遍历结构 (由前述getStructuringElement()获取)
  • anchor 核心
  • iterations 遍历次数等

开操作

先腐蚀后膨胀,应用得看前景和背景的具体情况,在前景白后景黑的时候可以用于去除小的影响。
在这里插入图片描述
但是反过来就是可以补漏洞
在这里插入图片描述

闭操作

先膨胀后腐蚀。同上,看具体情况
在这里插入图片描述

形态学梯度

膨胀减去腐蚀,就是基本梯度。

弱梯度位置(邻域低频,像素值变化不大)扩散高值与扩散低值差距不大,结果图像值偏小(黑色)。强梯度位置(邻域高频,像素值变化大),扩散高值与扩散低值差距大,结果图像偏大。

在这里插入图片描述

顶帽 tophat

原图减开操作

在这里插入图片描述

黑帽 blackhat

闭操作减原图

在这里插入图片描述

代码

#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
#define kernelSize 12
int main() {
	Mat src, dst_open, dst_close, dst_gradient, dst_tophat, dst_blackhat,dst_dilate,dst_erode;
	src = imread("3.jpg");

	if (!src.data)
	{
		printf("can not loading data!\n");
		return -1;
	}
	Mat kernel = getStructuringElement(MORPH_RECT, Size(kernelSize, kernelSize), Point(-1, -1));
	morphologyEx(src, dst_open, MORPH_OPEN, kernel);//开操作 MORPH_OPEN
	morphologyEx(src, dst_close, MORPH_CLOSE, kernel);
	dilate(src, dst_dilate, kernel);
	erode(src, dst_erode, kernel);
	dst_gradient = dst_dilate - dst_erode;//形态学梯度等于膨胀-腐蚀
	morphologyEx(src, dst_tophat, MORPH_TOPHAT, kernel);
	morphologyEx(src, dst_blackhat, MORPH_BLACKHAT, kernel);

	imshow("dst_open", dst_open);
	imshow("dst_close", dst_close);

	imshow("src", src);
	imshow("dst_gradient", dst_gradient);
	imshow("dst_blackhat", dst_blackhat);
	imshow("dst_tophat", dst_tophat);


	waitKey(0);
	return 1;
}

玩起来了

在这里插入图片描述
其实开操作可以去除rgb图像中高值细节,闭操作可以去除低值细节,所以对比两个图像的话可以看到它们部分地方互补。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wdmcs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值