当前位置:   article > 正文

【形态学操作】OpenCV实现形态学操作,图像腐蚀、膨胀、开运算、闭运算、顶帽、黑帽等_头歌使用opencv进行腐蚀与膨胀

头歌使用opencv进行腐蚀与膨胀

在OpenCV中,图像形态学操作主要包括腐蚀(erode)、膨胀(dilate)、开运算(open)、闭运算(close)等,它们是基于结构元素(structural element)的大小和形状对图像进行处理的方法,常用于图像的噪声去除、边缘检测、图像分割和形状分析等。

腐蚀操作:腐蚀是一种侵蚀图像像素的操作,它使用一个结构元素覆盖在图像上,只有当结构元素完全覆盖在前景像素上时,对应的中心像素才会被保留,否则被设置为背景像素。腐蚀操作可以去除小的对象和图像中的细线,但同时也会使对象变小。

膨胀操作:膨胀是一种扩张图像像素的操作,与腐蚀相反,只要结构元素与前景像素至少有一个交点,对应的中心像素就会被设置为前景像素。膨胀操作可以填补小的洞和连接邻近的对象,但同时也会使对象变大。

开运算:开运算是先腐蚀后膨胀的组合操作,它可以去除小的对象和细节,平滑对象的边界。

闭运算:闭运算是先膨胀后腐蚀的组合操作,它可以填充小的洞,连接邻近的对象,同时保持对象的基本形状。

以下是使用OpenCV进行图像形态学操作的示例代码:

  1. import cv2
  2. import numpy as np
  3. # 读取图像
  4. image = cv2.imread('image.jpg', 0)
  5. # 创建结构元素,这里使用3x3的矩形核
  6. kernel = np.ones((3, 3), np.uint8)
  7. # 腐蚀操作
  8. eroded = cv2.erode(image, kernel, iterations=1)
  9. # 膨胀操作
  10. dilated = cv2.dilate(image, kernel, iterations=1)
  11. # 开运算
  12. opening = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)
  13. # 闭运算
  14. closing = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)
  15. # 显示结果
  16. cv2.imshow('Original Image', image)
  17. cv2.imshow('Eroded Image', eroded)
  18. cv2.imshow('Dilated Image', dilated)
  19. cv2.imshow('Opening Image', opening)
  20. cv2.imshow('Closing Image', closing)
  21. # 等待按键后关闭窗口
  22. cv2.waitKey(0)
  23. cv2.destroyAllWindows()

在上述代码中,iterations参数控制了形态学操作的迭代次数,可以根据需要调整以获得不同程度的效果。结构元素可以是不同形状和大小的核,例如圆形、十字形状等,通过调整核的大小和形状,可以得到不同的图像处理效果。

在C++中,您可以使用OpenCV库来实现上述的图像形态学操作。首先,确保您已经安装了OpenCV库。以下是一个使用OpenCV的C++代码示例,演示了如何执行腐蚀、膨胀、开运算和闭运算:

  1. #include <opencv2/opencv.hpp>
  2. #include <iostream>
  3. int main() {
  4. // 读取图像
  5. cv::Mat src = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);
  6. if (src.empty()) {
  7. std::cout << "Error loading image!" << std::endl;
  8. return -1;
  9. }
  10. // 创建结构元素,这里使用3x3的矩形核
  11. cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3));
  12. // 腐蚀操作
  13. cv::Mat eroded;
  14. cv::erode(src, eroded, kernel);
  15. // 膨胀操作
  16. cv::Mat dilated;
  17. cv::dilate(src, dilated, kernel);
  18. // 开运算
  19. cv::Mat opened;
  20. cv::morphologyEx(src, opened, cv::MORPH_OPEN, kernel);
  21. // 闭运算
  22. cv::Mat closed;
  23. cv::morphologyEx(src, closed, cv::MORPH_CLOSE, kernel);
  24. // 显示结果
  25. cv::imshow("Original Image", src);
  26. cv::imshow("Eroded Image", eroded);
  27. cv::imshow("Dilated Image", dilated);
  28. cv::imshow("Opened Image", opened);
  29. cv::imshow("Closed Image", closed);
  30. // 等待按键后关闭窗口
  31. cv::waitKey(0);
  32. cv::destroyAllWindows();
  33. return 0;
  34. }

在这段代码中,我们首先加载了一张灰度图像,然后创建了一个3x3的方形结构元素。接下来,我们使用cv::erode函数对图像进行腐蚀,使用cv::dilate函数进行膨胀,使用cv::morphologyEx函数进行开运算和闭运算。cv::morphologyEx函数的第三个参数指定了操作类型,这里分别使用了cv::MORPH_OPENcv::MORPH_CLOSE

请确保您的项目配置正确,链接了OpenCV库,以便编译并运行这段代码。如果您遇到任何问题,请检查OpenCV安装和配置是否正确。

除了腐蚀、膨胀、开运算和闭运算之外,图像形态学还包含其他一些常用操作,包括:

  1. 顶帽操作(Top-hat):顶帽操作是开运算后减去原图的结果,通常用来增强图像中的小的细节和纹理。

  2. 黑帽操作(Black-hat):黑帽操作是原图减去闭运算的结果,它通常用来强调图像中的小的空洞或者轮廓。

  3. 击中-击中变换(Hit-or-Miss Transform):这种变换用于检测特定形状的结构元素在图像中的存在。

  4. 形态学梯度(Morphological Gradient):形态学梯度是膨胀结果与腐蚀结果的差,它可以突出图像的边缘。

  5. 形态学开闭变换(Opening-Closing and Closing-Opening Transform):这种变换首先执行开运算然后执行闭运算,或者相反,用于去除小的对象和填充对象内部的小洞。

  6. 形态学梯度变换(Gradient of Opening and Closing):这种变换是先执行开运算再执行闭运算,或者先执行闭运算再执行开运算,用以增强图像中的细节。

这些操作通常用于图像预处理、特征提取、噪声去除和图像分割等任务。通过选择合适的结构元素和操作类型,可以针对特定的图像处理需求定制形态学操作。

 

以下是使用C++和OpenCV库实现上述提到的几种常用形态学操作的代码示例:

  1. #include <opencv2/opencv.hpp>
  2. #include <iostream>
  3. int main() {
  4. // 读取图像
  5. cv::Mat src = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);
  6. if (src.empty()) {
  7. std::cout << "Error loading image!" << std::endl;
  8. return -1;
  9. }
  10. // 创建3x3的方形结构元素
  11. cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3));
  12. // 顶帽操作
  13. cv::Mat topHat;
  14. cv::morphologyEx(src, topHat, cv::MORPH_TOPHAT, kernel);
  15. // 黑帽操作
  16. cv::Mat blackHat;
  17. cv::morphologyEx(src, blackHat, cv::MORPH_BLACKHAT, kernel);
  18. // 击中-击中变换
  19. cv::Mat hitOrMiss;
  20. cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3));
  21. cv::morphologyEx(src, hitOrMiss, cv::MORPH_HITMISS, element);
  22. // 形态学梯度
  23. cv::Mat morphGradient;
  24. cv::morphologyEx(src, morphGradient, cv::MORPH_GRADIENT, kernel);
  25. // 形态学开闭变换
  26. cv::Mat openClose;
  27. cv::morphologyEx(src, openClose, cv::MORPH_OPEN, kernel);
  28. cv::morphologyEx(openClose, openClose, cv::MORPH_CLOSE, kernel);
  29. // 形态学闭开变换
  30. cv::Mat closeOpen;
  31. cv::morphologyEx(src, closeOpen, cv::MORPH_CLOSE, kernel);
  32. cv::morphologyEx(closeOpen, closeOpen, cv::MORPH_OPEN, kernel);
  33. // 显示结果
  34. std::vector<std::string> windowNames;
  35. windowNames.push_back("Original Image");
  36. windowNames.push_back("Top-hat");
  37. windowNames.push_back("Black-hat");
  38. windowNames.push_back("Hit-or-Miss");
  39. windowNames.push_back("Morphological Gradient");
  40. windowNames.push_back("Open-Close");
  41. windowNames.push_back("Close-Open");
  42. for (size_t i = 0; i < windowNames.size(); ++i) {
  43. cv::imshow(windowNames[i], static_cast<cv::Mat>(i == 0 ? src : i == 1 ? topHat : i == 2 ? blackHat : i == 3 ? hitOrMiss : i == 4 ? morphGradient : i == 5 ? openClose : closeOpen));
  44. }
  45. // 等待按键后关闭窗口
  46. cv::waitKey(0);
  47. cv::destroyAllWindows();
  48. return 0;
  49. }

在这段代码中,我们使用cv::morphologyEx函数来执行各种形态学操作。对于顶帽和黑帽操作,我们分别使用cv::MORPH_TOPHATcv::MORPH_BLACKHAT作为操作类型。击中-击中变换使用cv::MORPH_HITMISS,而形态学梯度使用cv::MORPH_GRADIENT。最后,形态学开闭变换和闭开变换分别通过连续执行开运算和闭运算实现。

请确保在编译此代码之前已正确安装OpenCV库,并且在编译时链接了相应的库文件。此外,替换"image.jpg"为您要处理的图像文件路径。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号