当前位置:   article > 正文

OpenCV Using Python——边缘检测和Otsu方法背景分割_python opencv 基于边缘背景分割

python opencv 基于边缘背景分割

边缘检测和Otsu方法背景分割

1. 简介

        鉴于OpenCV的官方文档中选择的图片比较完美,所以当遇到现实问题时会苦恼方法的选择。下面简要谈谈自己遇到的个别问题的认识。

2. 实现代码

        代码主要内容为使用拉普拉斯算子和自适应高斯阈值作边缘检测;用Otsu方法作前后背景分割。
(1)拉普拉斯算子提取的边缘由于数据长度的关系,很多边缘在图中被忽略了;
(2)Canny算子因为提取的边缘断断续续,所以这里不再给出结果,一般用于图片中有大范围或明显的几何结构(比如道路检测)等场合中;
(3)自适应高斯提取边缘在不同的图像块内的阈值都不一样,所以对图片中不同的光照条件会有很好的适应;
(4)Otsu方法可用于提取前后背景,适用于有两个尖峰的灰度直方图的图片中(这样的图片前后背景乍看会分得很开)。维基里有Otsu方法的java代码,但转换的结果和OpenCV自带的函数结果不太一致。
  1. import cv2
  2. import math
  3. import cv2.cv
  4. import numpy as np
  5. from matplotlib import pyplot as plt
  6. ################################################################################
  7. print 'Load Image'
  8. imgFile = 'images/big_alice.jpg'
  9. # load an original image
  10. img = cv2.imread(imgFile)
  11. ################################################################################
  12. # color value range
  13. cRange = 256
  14. rows,cols,channels = img.shape
  15. # convert color space from bgr to gray
  16. img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  17. imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  18. ################################################################################
  19. # laplacian edge
  20. imgLap = cv2.Laplacian(imgGray,cv2.CV_8U)
  21. # otsu method
  22. threshold,imgOtsu = cv2.threshold(imgGray,0,255,cv2.THRESH_BINARY + cv2.THRESH_OTSU)
  23. # adaptive gaussian threshold
  24. imgAdapt = cv2.adaptiveThreshold(imgGray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2)
  25. # imgAdapt = cv2.medianBlur(imgAdapt, 3)
  26. ################################################################################
  27. # display original image and gray image
  28. plt.subplot(2,2,1), plt.imshow(img), plt.title('Original Image'), plt.xticks([]), plt.yticks([])
  29. plt.subplot(2,2,2), plt.imshow(imgLap,cmap = 'gray'), plt.title('Laplacian Edge'), plt.xticks([]), plt.yticks([])
  30. plt.subplot(2,2,3), plt.imshow(imgOtsu,cmap = 'gray'), plt.title('Otsu Method'), plt.xticks([]), plt.yticks([])
  31. plt.subplot(2,2,4), plt.imshow(imgAdapt,cmap = 'gray'), plt.title('Adaptive Gaussian Threshold'), plt.xticks([]), plt.yticks([])
  32. plt.show()
  33. ################################################################################
  34. print 'Goodbye!'

3. 实现结果

        实现效果如下图所示,上一行的图片因为前景轮廓清晰和背景统一,所以可以发现所有方法都可以用。下一行图片背景复杂很多,对边缘提取影响不大,但Otsu方法的前后背景分割显然不可行,原因是背景的混乱导致在灰度直方图中的背景对应的灰度值投票过少,不足以形成尖峰使得前后背景分割的阈值刚好停留在尖峰的山脚附近。

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

闽ICP备14008679号