12-形态学操作

图像形态学的操作

OpenCV的形态学操作,多数是基于膨胀(dilate)与腐蚀(erode)形成的,在二值图像处理和灰度图像处理中有很多运用;彩色图像直接进行图像形态学操作效果不好;图像形态学操作主要针对二值图像
1、开操作-open;
2、闭操作-close;
3、形态学梯度- Morphological Gradient;
4、顶帽-top hat;
5、黑帽-black hat;

开操作(open)

1、开操作:指先腐蚀后膨胀;
2、可以去除小的对象;假设对象是前景色,背景是黑色;
在这里插入图片描述

闭操作(close)

1、闭操作:指先膨胀后腐蚀;
2、可以填充小的洞(fill hole),假设对象是前景色,背景是黑色;
在这里插入图片描述

形态学梯度(Morphological Gradient)

1、膨胀减去腐蚀;
2、又称为基本梯度,每个像素的值不同成梯度(其他还包括内部梯度(原图-腐蚀图),方向梯度(在x,y方向进行梯度计算))
在这里插入图片描述

顶帽(Tophat)

1、顶帽:指原图像与开操作之间的差值图像;
在这里插入图片描述

黑帽(Blackhat)

1、黑帽:指闭操作图像与原图像的差值图像;
在这里插入图片描述

相关API

1、形态学操作API:morphologyEx(src, dest, CV_MOP_BLACKHAT , kernel);(形态学扩展 )

//参数说明:
morphologyEx(src, dest, CV_MOP_BLACKHAT , kernel);
src : 输入图像
dest : 输出图像
int OPT : 形态学操作类型,可以传入的宏参数有:CV_MOP_OPEN/CV_MOP_CLOSE/CV_MOP_GRADIENT/CV_MOP_TOPHAT/CV_MOP_BLACKHAT;
Mat kernel : 结构元素
int iteration : 迭代次数,默认是1

Code

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
	Mat src = imread("C:\\Users\\hello\\Desktop\\9.jpg");
	if (!src.data)
	{
		cout << "could not load the image..." << endl;
		return -1;
	}
	namedWindow("input image", CV_WINDOW_AUTOSIZE);
	imshow("input image", src);

	char output_title[] = "morphology demo";
	namedWindow(output_title, CV_WINDOW_AUTOSIZE);

	Mat dest;
	//结构元素大小的选取和要去除的对象有关系,必须能够部分覆盖要去除的对象;
	Mat kernel = getStructuringElement(MORPH_RECT,Size(11,11),Point(-1,-1));
	//开操作
	//morphologyEx(src, dest, CV_MOP_OPEN, kernel);
	//闭操作
	//morphologyEx(src, dest, CV_MOP_CLOSE, kernel);
	//形态学梯度
	morphologyEx(src, dest, CV_MOP_GRADIENT, kernel);
	//Tophat
	//morphologyEx(src, dest, CV_MOP_TOPHAT, kernel);
	//Blackhat
	morphologyEx(src, dest, CV_MOP_BLACKHAT, kernel);

	imshow(output_title, dest);

	waitKey(0);
	return 0;
}

效果

形态学腐蚀:
在这里插入图片描述

顶帽:
在这里插入图片描述黑帽:(闭操作的特性是填洞)(实际运用中可以用来寻找坏点
在这里插入图片描述

MATLAB中使用形态学处理可以实现基于形状的目标识别。以下是一些基本步骤: 1. 加载图像并进行二值化处理,以便更好的进行形态学处理。可以使用imread()和imbinarize()函数来实现。 2. 对图像进行形态学处理,包括腐蚀、膨胀、开运算和闭运算等操作。这些操作可以通过imerode()、imdilate()、imopen()和imclose()函数来实现。 3. 对处理后的图像进行连通区域分析,以便检测目标物体。可以使用bwconncomp()和regionprops()函数来获取目标物体的位置和形状信息。 4. 根据目标物体的位置和形状信息,对其进行分类或识别。可以使用传统的分类器(如SVM、KNN等)或深度学习模型(如CNN、ResNet等)进行训练和分类。 下面是一个简单的示例代码,演示如何使用形态学处理实现目标识别: ```matlab % 加载图像并进行二值化处理 img = imread('test.jpg'); bw = imbinarize(img); % 对图像进行形态学处理 se = strel('disk', 5); bw = imopen(bw, se); bw = imclose(bw, se); % 连通区域分析 cc = bwconncomp(bw); props = regionprops(cc, 'Area', 'BoundingBox', 'Centroid'); % 显示结果 imshow(img); hold on; for i = 1:length(props) if props(i).Area > 1000 % 根据面积判定目标物体 rectangle('Position', props(i).BoundingBox, 'EdgeColor', 'r', 'LineWidth', 2); text(props(i).Centroid(1), props(i).Centroid(2), 'Target', 'Color', 'r', 'FontSize', 12); end end hold off; ``` 在这个例子中,我们首先加载了一张图像并将其进行二值化处理。然后,我们使用开运算和闭运算操作对图像进行形态学处理,以便更好地检测目标物体。接下来,我们使用bwconncomp()函数进行连通区域分析,获取目标物体的位置和形状信息。最后,我们根据目标物体的面积判断其是否为目标,如果是,则在图像上显示其位置和名称。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值