OpenCV 形态学转换

综述

OpenCV中的形态学转换操作有七种:腐蚀,膨胀,开运算,闭运算,形态学梯度,礼帽,黑帽。

API参照表

中文名英文名api原理个人理解
腐蚀erodeerosion = cv2.erode(src=girl_pic, kernel=kernel)在窗中,只要含有0,则窗内全变为0,可以去浅色噪点浅色成分被腐蚀
膨胀dilatedilation = cv2.dilate(src=girl_pic, kernel=kernel)在窗中,只要含有1,则窗内全变为1,可以增加浅色成分浅色成分得膨胀
开运算morphology-openopening = cv2.morphologyEx(girl_pic, cv2.MORPH_OPEN, kernel)先腐蚀,后膨胀,去白噪点先合再开,对浅色成分不利
闭运算morphology-closeclosing = cv2.morphologyEx(girl_pic, cv2.MORPH_CLOSE, kernel)先膨胀,后腐蚀,去黑噪点先开再合,浅色成分得势
形态学梯度morphology-grandientgradient = cv2.morphologyEx(girl_pic, cv2.MORPH_GRADIENT, kernel)一幅图像腐蚀与膨胀的区别,可以得到轮廓数值上解释为:膨胀减去腐蚀
礼帽tophattophat = cv2.morphologyEx(girl_pic, cv2.MORPH_TOPHAT, kernel)原图像减去开运算的差数值上解释为:原图像减去开运算
黑帽blackhatblackhat = cv2.morphologyEx(girl_pic, cv2.MORPH_BLACKHAT, kernel)闭运算减去原图像的差数值上解释为:闭运算减去原图像
# -*- coding: utf-8 -*-

import cv2
import numpy as np

girl_pic = cv2.imread('timg.jpg')

kernel = np.ones((5, 5), np.uint8)

# erode 腐蚀
erosion = cv2.erode(src=girl_pic, kernel=kernel)
cv2.imshow('erosion', erosion)
cv2.imwrite('pic/erosion.jpg', erosion)

# dilate 膨胀
dilation = cv2.dilate(src=girl_pic, kernel=kernel)
cv2.imshow('dilation', dilation)
cv2.imwrite('pic/dilation.jpg', dilation)

# open 开运算
opening = cv2.morphologyEx(girl_pic, cv2.MORPH_OPEN, kernel)
cv2.imshow('opening', opening)
cv2.imwrite('pic/opening.jpg', opening)

# close 闭运算
closing = cv2.morphologyEx(girl_pic, cv2.MORPH_CLOSE, kernel)
cv2.imshow('closing', closing)
cv2.imwrite('pic/closing.jpg', closing)

# gradient 形态学梯度
gradient = cv2.morphologyEx(girl_pic, cv2.MORPH_GRADIENT, kernel)
cv2.imshow('gradient', gradient)
cv2.imwrite('pic/gradient.jpg', gradient)

# tophat 礼帽
tophat = cv2.morphologyEx(girl_pic, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('tophat', tophat)
cv2.imwrite('pic/tophat.jpg', tophat)

# blackhat 黑帽
blackhat = cv2.morphologyEx(girl_pic, cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('blackhat', blackhat)
cv2.imwrite('pic/blackhat.jpg', blackhat)

# cv2.add(open, tophat) cv2.add(开运算, 礼帽)
open_and_tophat = cv2.add(opening, tophat)
cv2.imshow('open_and_tophat', open_and_tophat)
cv2.imwrite('pic/open_and_tophat.jpg', open_and_tophat)

# close-blackhat 闭运算-黑帽
close_subtract_blackhat = closing - blackhat
cv2.imshow('close_subtract_blackhat', close_subtract_blackhat)
cv2.imwrite('pic/close_subtract_blackhat.jpg', close_subtract_blackhat)
k = cv2.waitKey(0)

if k == 27:  # 按下ESC退出
    cv2.destroyAllWindows()

https://blog.youkuaiyun.com/jningwei/article/details/76101668

### 形态学操作简介 形态学操作是一种基于图像形状的处理方法,在计算机视觉领域广泛应用。这些操作通常用于二值图像,但也适用于灰度图像。常见的形态学操作包括腐蚀(Erosion)、膨胀(Dilation)、开运算(Opening)和闭运算(Closing)。在 OpenCV 中,可以使用 `cv::morphologyEx` 函数来执行高级形态学变换。 以下是关于如何在 C++ 和 OpenCV 中实现形态学操作的一个教程或示例: --- ### 基本概念与函数说明 #### 结构化元素 结构化元素定义了形态学操作的行为模式。常用的结构化元素有椭圆形 (`MORPH_ELLIPSE`) 和十字形 (`MORPH_CROSS`)。可以通过 `getStructuringElement` 函数创建自定义的结构化元素[^3]。 #### 主要函数 - **`erode`**: 腐蚀操作会移除对象边界上的像素。 - **`dilate`**: 膨胀操作会在对象周围增加像素。 - **`morphologyEx`**: 执行更复杂的形态学操作,如开运算、闭运算等。 --- ### 示例代码 以下是一个完整的 C++ 示例程序,展示如何使用 OpenCV 进行基本的形态学操作: ```cpp #include <opencv2/opencv.hpp> #include <iostream> int main() { // 加载输入图像(建议使用二值图像) cv::Mat src = cv::imread("input_image.png", cv::IMREAD_GRAYSCALE); if (src.empty()) { std::cerr << "Error: Could not open or find the image!" << std::endl; return -1; } // 定义结构化元素(例如:5x5 的椭圆型) cv::Mat kernel = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(5, 5)); // 创建输出矩阵 cv::Mat erosion_output, dilation_output, opening_output, closing_output; // 腐蚀操作 cv::erode(src, erosion_output, kernel); // 膨胀操作 cv::dilate(src, dilation_output, kernel); // 开运算(先腐蚀再膨胀) cv::morphologyEx(src, opening_output, cv::MORPH_OPEN, kernel); // 闭运算(先膨胀再腐蚀) cv::morphologyEx(src, closing_output, cv::MORPH_CLOSE, kernel); // 显示结果 cv::imshow("Original Image", src); cv::imshow("Erosion Output", erosion_output); cv::imshow("Dilation Output", dilation_output); cv::imshow("Opening Output", opening_output); cv::imshow("Closing Output", closing_output); cv::waitKey(0); // 等待按键关闭窗口 return 0; } ``` --- ### 关键点解析 1. **加载图像** 使用 `cv::imread` 函数读取图像,并将其转换为灰度图以便于形态学操作。 2. **定义结构化元素** 利用 `cv::getStructuringElement` 函数指定结构化元素的大小和类型。这里选择了椭圆形的结构化元素。 3. **形态学操作** - 腐蚀通过减少亮区域边缘达到细化效果。 - 膨胀则扩展亮区域边界。 - 开运算是先腐蚀后膨胀,常用于去除小噪声。 - 闭运算是先膨胀后腐蚀,适合填充物体内部的小孔洞。 4. **显示结果** 使用 `cv::imshow` 展示原始图像以及经过不同形态学操作后的结果。 --- ### 编译与运行环境配置 为了成功编译此代码,请确保已安装 OpenCV 库并正确设置开发环境。如果遇到 TIFF 支持缺失的问题,可以在构建 OpenCV 时添加 `-DBUILD_TIFF=ON` 参数以启用该功能[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值