clip_image001

Sobel算子检测方法对灰度渐变和噪声较多的图像处理效果较好,Sobel算子对边缘定位不是很准确,图像的边缘不止一个像素。

clip_image003

clip_image005

clip_image006

Roberts算子检测方法对具有陡峭的低噪声的图像处理效果较好,但是利用roberts算子提取边缘的结果是边缘比较粗,因此边缘的定位不是很准确。

clip_image008

clip_image009

clip_image010

Prewitt算子检测方法对灰度渐变和噪声较多的图像处理效果较好。但边缘较宽,而且间断点多。

clip_image012

clip_image014

Canny算子是目前边缘检测最常用的算法,效果也是最理想的。

Canny边缘检测算法不是简单的模板卷积而已,通过梯度方向和双阈值法来检测边缘点,具体算法可以参考:http://www.cnblogs.com/AndyJee/p/3734805.html

Canny方法不容易受噪声干扰,能够检测到真正的弱边缘。优点在于,使用两种不同的阈值分别检测强边缘和弱边缘,并且当弱边缘和强边缘相连时,才将弱边缘包含在输出图像中。

clip_image016

clip_image018

clip_image019 clip_image020

Laplacian算子法对噪声比较敏感,所以很少用该算子检测边缘,而是用来判断边缘像素视为与图像的明区还是暗区。

clip_image022

clip_image024

clip_image026

  • Sobel算子检测方法对灰度渐变和噪声较多的图像处理效果较好,sobel算子对边缘定位不是很准确,图像的边缘不止一个像素;
  • Roberts算子检测方法对具有陡峭的低噪声的图像处理效果较好,但是利用roberts算子提取边缘的结果是边缘比较粗,因此边缘的定位不是很准确;
  • Prewitt算子检测方法对灰度渐变和噪声较多的图像处理效果较好。但边缘较宽,而且间断点多;
  • Laplacian算子法对噪声比较敏感,所以很少用该算子检测边缘,而是用来判断边缘像素视为与图像的明区还是暗区;
  • Canny方法不容易受噪声干扰,能够检测到真正的弱边缘。优点在于,使用两种不同的阈值分别检测强边缘和弱边缘,并且当弱边缘和强边缘相连时,才将弱边缘包含在输出图像中。

clip_image028

  • Sobel、Robert、Prewitt算子的增强效果并不是很明显,尤其是Robert算子,因为它提取的边缘点过于稀疏和离散;
  • Laplacian算子和canny算子的增强效果都比较理想, 将边缘叠加上去后,整个手的轮廓和边缘都很清晰,直观上看,canny算子实现的效果比Laplacian算子好,最明显的地方就是手指尖的边缘。

下面的程序就实现上面效果的完整Matlab代码:

  1. clear;clc;
  2. I=imread(\'x1.tif\');
  3. % I=rgb2gray(I);
  4. % gray transform
  5. J=imadjust(I,[0.1 0.9],[0 1],1);
  6. % Edge detection
  7. % Sobel
  8. BW1=edge(I,\'sobel\');
  9. sobelBW1=im2uint8(BW1)+J;
  10. figure;
  11. %imshow(BW1);
  12. subplot(1,2,1);
  13. imshow(J);
  14. title(\'original image\');
  15. subplot(1,2,2);
  16. imshow(sobelBW1);
  17. title(\'Sobel augmented image\');
  18. % Roberts
  19. BW2=edge(I,\'roberts\');
  20. robertBW2=im2uint8(BW2)+J;
  21. figure;
  22. %imshow(BW2);
  23. subplot(1,2,1);
  24. imshow(J);
  25. title(\'original image\');
  26. subplot(1,2,2);
  27. imshow(robertBW2);
  28. title(\'robert augmented image\');
  29. % prewitt
  30. BW3=edge(I,\'prewitt\');
  31. prewittBW3=im2uint8(BW3)+J;
  32. figure;
  33. %imshow(BW3);
  34. subplot(1,2,1);
  35. imshow(J);
  36. title(\'original image\');
  37. subplot(1,2,2);
  38. imshow(prewittBW3);
  39. title(\'Prewitt augmented image\');
  40. % log
  41. BW4=edge(I,\'log\');
  42. logBW4=im2uint8(BW4)+J;
  43. figure;
  44. %imshow(BW4);
  45. subplot(1,2,1);
  46. imshow(J);
  47. title(\'original image\');
  48. subplot(1,2,2);
  49. imshow(logBW4);
  50. title(\'Laplacian augmented image\');
  51. % canny
  52. BW5=edge(I,\'canny\');
  53. cannyBW5=im2uint8(BW5)+J;
  54. figure;
  55. %imshow(BW5);
  56. subplot(1,2,1);
  57. imshow(J);
  58. title(\'original image\');
  59. subplot(1,2,2);
  60. imshow(cannyBW5);
  61. title(\'Canny augmented image\');
  62. % gaussian & canny
  63. % h=fspecial(\'gaussian\',5);
  64. % fI=imfilter(I,h,\'replicate\');
  65. % BW6=edge(fI,\'canny\');
  66. % figure;
  67. % imshow(BW6);
  68. figure;
  69. subplot(2,3,1), imshow(BW1);
  70. title(\'sobel edge detect\');
  71. subplot(2,3,2), imshow(BW2);
  72. title(\'roberts edge detect\');
  73. subplot(2,3,3), imshow(BW3);
  74. title(\'prewitt edge detect\');
  75. subplot(2,3,4), imshow(BW4);
  76. title(\'log edge detect\');
  77. subplot(2,3,5), imshow(BW5);
  78. title(\'canny edge detect\');
  79. % subplot(2,3,6), imshow(BW6);
  80. % title(\'gasussian&canny edge detect\');
  81. figure;
  82. subplot(2,3,1), imshow(sobelBW1);
  83. title(\'sobel edge detect\');
  84. subplot(2,3,2), imshow(robertBW2);
  85. title(\'roberts edge detect\');
  86. subplot(2,3,3), imshow(prewittBW3);
  87. title(\'prewitt edge detect\');
  88. subplot(2,3,4), imshow(logBW4);
  89. title(\'laplacian edge detect\');
  90. subplot(2,3,5), imshow(cannyBW5);
  91. title(\'canny edge detect\');

下面的Matlab程序是精简的边缘提取实现:

  1. clear;clc;
  2. I=imread(\'lena.bmp\');
  3. I=rgb2gray(I);
  4. imshow(I,[]);
  5. title(\'Original Image\');
  6. sobelBW=edge(I,\'sobel\');
  7. figure;
  8. imshow(sobelBW);
  9. title(\'Sobel Edge\');
  10. robertsBW=edge(I,\'roberts\');
  11. figure;
  12. imshow(robertsBW);
  13. title(\'Roberts Edge\');
  14. prewittBW=edge(I,\'prewitt\');
  15. figure;
  16. imshow(prewittBW);
  17. title(\'Prewitt Edge\');
  18. logBW=edge(I,\'log\');
  19. figure;
  20. imshow(logBW);
  21. title(\'Laplasian of Gaussian Edge\');
  22. cannyBW=edge(I,\'canny\');
  23. figure;
  24. imshow(cannyBW);
  25. title(\'Canny Edge\');

版权声明:本文为AndyJee原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/AndyJee/p/3737325.html