当前位置:   article > 正文

OpenCV(九)形态学操作4--礼帽与黑帽(顶帽与底帽)_礼帽和黑帽

礼帽和黑帽

目录

一、顶帽运算(礼帽)

二、底帽运算(黑帽)

三、底帽运算应用(二值图像底帽运算)

1、原图转灰度图,再转二值图像

2、灰度图底帽处理

3、二值图闭运算

代码

总代码

参考资料


一、顶帽运算(礼帽)

取出亮度高的地方

顶帽运算 = 原图像 - 开运算

开运算可以消除暗背景下的高亮区域,那么如果用原图减去开运算结果就可以得到原图中灰度较亮的区域,所以又称白顶帽变换。

C++: 

  1. //顶帽运算
  2. void TopHat()
  3. {
  4. //开运算
  5. Mat kernel = getStructuringElement(MORPH_RECT, Size(19, 19)); //创建结构元
  6. // 矩形卷积核 尺寸为(19,19)宽高
  7. morphologyEx(img, dst, MORPH_OPEN, kernel, Point(-1, -1)); // 形态学处理--开运算
  8. // 原图 新图 开运算 卷积核 锚点
  9. imshow("开运算", dst); // 显示形态学处理后的效果
  10. //顶帽运算(白顶帽运算)
  11. dst = img - dst;
  12. //morphologyEx(img, dst, MORPH_TOPHAT, kernel, Point(-1, -1), 1); // 形态学处理--开帽变换
  13. imshow("顶帽运算", dst);
  14. }

python:

  1. # 顶帽(原-开)
  2. def TopHat():
  3. tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, (7, 7), iterations=5)
  4. # 类型 卷积核 迭代次数
  5. cv2.imshow('TopHat', tophat)

二、底帽运算(黑帽)

取出亮度低的地方

底帽运算 = 原图像 - 闭运算

闭运算可以删除亮背景下的暗区域,那么用原图减去闭运算结果就可以得到原图像中灰度较暗的区域,所以又称黑底帽变换。

C++: 

  1. //底帽运算
  2. void BlackHat()
  3. {
  4. //闭运算
  5. Mat kernel = getStructuringElement(MORPH_RECT, Size(19, 19)); //创建结构元
  6. // 矩形卷积核 尺寸为(19,19)宽高
  7. morphologyEx(img, dst, MORPH_CLOSE, kernel, Point(-1, -1)); // 形态学处理--开运算
  8. // 原图 新图 闭运算 卷积核 锚点
  9. imshow("闭运算", dst); // 显示形态学处理后的效果
  10. //底帽运算(黑帽运算)
  11. //morphologyEx(img, dst, MORPH_BLACKHAT, kernel, Point(-1, -1), 1); // 形态学处理--底帽变换
  12. dst = img - dst;
  13. imshow("底帽运算", dst);
  14. }

 python:

  1. # 底帽(原-闭)
  2. def BlackHat():
  3. blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, (7, 7), iterations=5)
  4. # 类型 卷积核 迭代次数
  5. cv2.imshow('BlackHat', blackhat)

只有这样可能看不出来用途,再举一个实用的例子:

三、底帽运算应用(二值图像底帽运算)

目的:得到清晰的二值图像。

底帽效果:取出亮度较暗的区域

1、原图转灰度图,再转二值图像

  1. //灰度图及二值化
  2. cvtColor(img, grayImage, COLOR_BGR2GRAY);
  3. imshow("灰度图(原图)", grayImage);
  4. threshold(grayImage, binImage, 0, 255, THRESH_OTSU);
  5. imshow("二值化图像", binImage);

        可以看出,虽然圆环被分割为目标区域,但左侧背景区域有很大一部分也被分割为目标,并且该区域面积较大难以通过开操作或闭操作去除

  为了取出亮度低的地方,接下来我们通过底帽操作来进行处理。首先对原图进行底帽处理,然后再对底帽处理的结果进行二值化,最后对处理结果进行一轮闭操作。

2、灰度图底帽处理

  1. kernel = getStructuringElement(MORPH_RECT, Size(31, 31)); //修改结构元
  2. morphologyEx(grayImage, dst, MORPH_BLACKHAT, kernel, Point(-1, -1), 1); // 形态学处理--底帽变换
  3. imshow("底帽运算", dst);
  4. threshold(dst, binImage, 0, 255, THRESH_OTSU);
  5. imshow("底帽处理后的二值化图像", binImage);

3、二值图闭运算

  1. //3、二值图闭运算处理
  2. kernel = getStructuringElement(MORPH_RECT, Size(3, 3)); //修改结构元
  3. morphologyEx(binImage, binImage, MORPH_CLOSE, kernel, Point(-1, -1)); // 形态学处理--闭运算
  4. imshow("闭运算处理后的二值化图像", binImage);

代码

  1. //二值图像底帽运算
  2. void Bin_BlackHat()
  3. {
  4. Mat kernel = getStructuringElement(MORPH_RECT, Size(19, 19)); //创建结构元
  5. //1、灰度图及二值化
  6. cvtColor(img, grayImage, COLOR_BGR2GRAY);
  7. imshow("灰度图(原图)", grayImage);
  8. threshold(grayImage, binImage, 0, 255, THRESH_OTSU);
  9. imshow("二值化图像", binImage);
  10. //2、对灰度图底帽处理
  11. kernel = getStructuringElement(MORPH_RECT, Size(31, 31)); //修改结构元
  12. morphologyEx(grayImage, dst, MORPH_BLACKHAT, kernel, Point(-1, -1), 1); // 形态学处理--底帽变换
  13. imshow("底帽运算", dst);
  14. threshold(dst, binImage, 0, 255, THRESH_OTSU);
  15. imshow("底帽处理后的二值化图像", binImage);
  16. //3、二值图闭运算处理
  17. kernel = getStructuringElement(MORPH_RECT, Size(3, 3)); //修改结构元
  18. morphologyEx(binImage, binImage, MORPH_CLOSE, kernel, Point(-1, -1)); // 形态学处理--闭运算
  19. imshow("闭运算处理后的二值化图像", binImage);
  20. }

总代码

  1. //开运算与闭运算(形态学)
  2. #include <iostream>
  3. #include <opencv2/opencv.hpp>
  4. using namespace cv;
  5. using namespace std;
  6. Mat img, dst;
  7. Mat binImage, grayImage;
  8. //图像初始化
  9. void Image_Init()
  10. {
  11. img = imread("Resource/test9.jpg");
  12. dst = Mat::zeros(img.size(), img.type());
  13. if (img.empty())
  14. {
  15. printf("图像加载失败");
  16. exit(0);
  17. }
  18. }
  19. //顶帽运算
  20. void TopHat()
  21. {
  22. //开运算
  23. Mat kernel = getStructuringElement(MORPH_RECT, Size(19, 19)); //创建结构元
  24. // 矩形卷积核 尺寸为(19,19)宽高
  25. morphologyEx(img, dst, MORPH_OPEN, kernel, Point(-1, -1)); // 形态学处理--开运算
  26. // 原图 新图 开运算 卷积核 锚点
  27. imshow("开运算", dst); // 显示形态学处理后的效果
  28. //顶帽运算(白顶帽运算)
  29. dst = img - dst;
  30. //morphologyEx(img, dst, MORPH_TOPHAT, kernel, Point(-1, -1), 1); // 形态学处理--开帽变换
  31. imshow("顶帽运算", dst);
  32. }
  33. //底帽运算
  34. void BlackHat()
  35. {
  36. //闭运算
  37. Mat kernel = getStructuringElement(MORPH_RECT, Size(19, 19)); //创建结构元
  38. // 矩形卷积核 尺寸为(19,19)宽高
  39. morphologyEx(img, dst, MORPH_CLOSE, kernel, Point(-1, -1)); // 形态学处理--闭运算
  40. // 原图 新图 闭运算 卷积核 锚点
  41. imshow("闭运算", dst); // 显示形态学处理后的效果
  42. //底帽运算(黑帽运算)
  43. //morphologyEx(img, dst, MORPH_BLACKHAT, kernel, Point(-1, -1), 1); // 形态学处理--底帽变换
  44. dst = img - dst;
  45. imshow("底帽运算", dst);
  46. }
  47. //二值图像底帽运算
  48. void Bin_BlackHat()
  49. {
  50. Mat kernel = getStructuringElement(MORPH_RECT, Size(19, 19)); //创建结构元
  51. //1、灰度图及二值化
  52. cvtColor(img, grayImage, COLOR_BGR2GRAY);
  53. imshow("灰度图(原图)", grayImage);
  54. threshold(grayImage, binImage, 0, 255, THRESH_OTSU);
  55. imshow("二值化图像", binImage);
  56. //2、对灰度图底帽处理
  57. kernel = getStructuringElement(MORPH_RECT, Size(31, 31)); //修改结构元
  58. morphologyEx(grayImage, dst, MORPH_BLACKHAT, kernel, Point(-1, -1), 1); // 形态学处理--底帽变换
  59. imshow("底帽运算", dst);
  60. threshold(dst, binImage, 0, 255, THRESH_OTSU);
  61. imshow("底帽处理后的二值化图像", binImage);
  62. //3、二值图闭运算处理
  63. kernel = getStructuringElement(MORPH_RECT, Size(3, 3)); //修改结构元
  64. morphologyEx(binImage, binImage, MORPH_CLOSE, kernel, Point(-1, -1)); // 形态学处理--闭运算
  65. imshow("闭运算处理后的二值化图像", binImage);
  66. }
  67. //显示图像
  68. void Show()
  69. {
  70. imshow("原图", img);
  71. }
  72. int main()
  73. {
  74. Image_Init(); //图像初始化
  75. //TopHat(); //顶帽运算
  76. //BlackHat(); //底帽运算
  77. Bin_BlackHat(); //二值图像底帽运算
  78. Show(); //显示原图像
  79. waitKey(0);
  80. return 0;
  81. }

  1. # 形态学(膨胀、腐蚀、开闭运算、顶帽与底帽)
  2. import cv2
  3. # 膨胀
  4. def Dilate():
  5. # 膨胀
  6. dilate = cv2.dilate(img, kernel=(7, 7), iterations=1)
  7. # 卷积核大小 迭代次数
  8. cv2.imshow("dilate", dilate)
  9. # 腐蚀
  10. def Enrode():
  11. # 腐蚀
  12. erode = cv2.erode(img, kernel=(7, 7), iterations=5)
  13. # 卷积核大小 迭代次数
  14. cv2.imshow("erode", erode)
  15. # 开运算(先腐后膨)
  16. def Open():
  17. open = cv2.morphologyEx(img, cv2.MORPH_OPEN, (7, 7), iterations=5)
  18. # 类型 卷积核大小 迭代次数
  19. cv2.imshow('open', open)
  20. # 闭运算(先膨后腐)
  21. def Close():
  22. close = cv2.morphologyEx(img, cv2.MORPH_CLOSE, (7, 7), iterations=5)
  23. # 类型 卷积核大小 迭代次数
  24. cv2.imshow('close', close)
  25. # 顶帽(原-开)
  26. def TopHat():
  27. tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, (7, 7), iterations=5)
  28. # 类型 卷积核 迭代次数
  29. cv2.imshow('TopHat', tophat)
  30. # 底帽(原-闭)
  31. def BlackHat():
  32. blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, (7, 7), iterations=5)
  33. # 类型 卷积核 迭代次数
  34. cv2.imshow('BlackHat', blackhat)
  35. if __name__ == '__main__':
  36. # 读取图片
  37. img = cv2.imread("Resource/test5.jpg")
  38. cv2.imshow("img", img)
  39. Dilate() #膨胀
  40. Enrode() #腐蚀
  41. Open() #开运算
  42. Close() #闭运算
  43. TopHat() #顶帽运算
  44. BlackHat() #底帽运算
  45. cv2.waitKey(0)

参考资料

https://blog.csdn.net/weixin_41695564/article/details/79935028

https://blog.csdn.net/freehawkzk/article/details/85261341?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162864358216780255258035%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=162864358216780255258035&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v29-5-85261341.first_rank_v2_pc_rank_v29&utm_term=%E9%A1%B6%E5%B8%BD%E4%B8%8E%E5%BA%95%E5%B8%BD&spm=1018.2226.3001.4187

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/86616?site
推荐阅读
相关标签
  

闽ICP备14008679号