OpenCV-形态学处理-morphologyEx

本文介绍了一个使用OpenCV进行图像形态学处理的实例。通过调整结构元素的半径、处理类型及迭代次数来实现不同的图像处理效果。代码中包含了创建滑动条以实时展示不同参数设置下图像变化的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OpenCV提供的形态学处理函数,主要有三个参数:

1:结构元:影响结构元的除了形状就是结构元的半径

2:形态学处理类型

3:迭代次数

基于这三个点我们通过导航条调节这三个参数,代码如下:

#include<opencv2/core.hpp>
#include<opencv2/imgproc.hpp>
#include<opencv2/highgui.hpp>
using namespace cv;
#include<string>
using namespace std;
Mat img;//输入图像
Mat dst;//输出图像
Mat element;//结构元
//结构元的半径
int r = 1;
int MAX_r = 20;
//形态学处理的次数
int iter = 1;
int MAX_ITER = 30;
//形态学处理类型
/*
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 
};
*/
int morphType = 0;
int MAX_MORPHTYPE = 6;
//窗口
string windowName = "形态学处理";
//回调函数
void callback(int, void*);
int main(int argc, char*argv[])
{
	//输入图像
	img = imread(argv[1], IMREAD_ANYCOLOR);
	if (!img.data)
		return -1;
	//窗口
	namedWindow(windowName, 1);
	createTrackbar("半径:", windowName, &r, MAX_r, callback);
	createTrackbar("次数:", windowName, &iter, MAX_ITER, callback);
	createTrackbar("类型:", windowName, &morphType, MAX_MORPHTYPE, callback);
	callback(0, 0);
	waitKey(0);
	return 0;
}
//回调函数
void callback(int, void*)
{
	//结构元
	element = getStructuringElement(MORPH_ELLIPSE, Size(2 * r + 1, 2 * r + 1), Point(-1, -1));
	//形态学处理 
	morphologyEx(img, dst, morphType, element, Point(-1, -1), iter);
	//保存形态处理的结果
	//imwrite("mor.jpg", dst);
	imshow(windowName, dst);
}


### OpenCV Python 形态学处理教程 #### 形态学基本概念 形态学操作主要用于提取图像中的有用特征,如边界检测、噪声去除等。这些操作基于形状和结构来分析并处理图像[^1]。 #### 常见的形态学操作及其应用 - **腐蚀 (Erosion)** 和 **膨胀 (Dilation)** 是最基本的两种形态变换方法。 - **开运算 (Opening)** 可以用来消除小物体,在平滑较大对象边缘的同时也能断开狭窄部分。 - **闭运算 (Closing)** 则相反,它能填补前景物体内部的小洞或移除小黑点。 - 还有一些高级的操作像顶帽(Top Hat)以及黑帽(Black Hat),它们分别用于增强较亮区域对比度或是突出暗背景上的明亮细节[^4]。 #### 实际案例展示 下面给出一段完整的Python代码片段,展示了如何利用OpenCV执行上述提到的各种形态学转换: ```python import numpy as np import cv2 from matplotlib import pyplot as plt def show_images(images, titles=None): """显示多张图片""" n_ims = len(images) fig, axs = plt.subplots(1, n_ims, figsize=(n_ims * 5, 5)) for i in range(n_ims): ax = axs[i] if isinstance(axs, np.ndarray) else axs ax.imshow(cv2.cvtColor(images[i], cv2.COLOR_BGR2RGB)) if titles is not None and i < len(titles): ax.set_title(titles[i]) ax.axis('off') plt.show() # 加载原始图像 image_path = "path_to_your_image" original_img = cv2.imread(image_path) # 定义一个简单的正方形核 square_kernel = np.ones((5, 5), dtype=np.uint8) # 执行不同的形态学操作 erosion_result = cv2.erode(original_img, square_kernel, iterations=1) dilation_result = cv2.dilate(original_img, square_kernel, iterations=1) opening_result = cv2.morphologyEx(original_img, cv2.MORPH_OPEN, square_kernel) closing_result = cv2.morphologyEx(original_img, cv2.MORPH_CLOSE, square_kernel) black_hat_result = cv2.morphologyEx(original_img, cv2.MORPH_BLACKHAT, square_kernel) show_images([original_img, erosion_result, dilation_result, opening_result, closing_result, black_hat_result], ["Original Image", "Eroded", "Dilated", "Opened", "Closed", "Black Hat"]) ``` 这段脚本不仅实现了基础的功能演示,还通过`matplotlib`库提供了直观的结果可视化功能[^2][^3].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值