当前位置:   article > 正文

利用Matlab进行图像分割和边缘检测_在边缘检测中加入阈值分割

在边缘检测中加入阈值分割

本文章包含以下内容:        

1、灰度阀值分割

(1)单阈值分割图像

先将一幅彩色图像转换为灰度图像,显示其直方图,参考直方图中灰度的分布,尝试确定阈值;应反复调节阈值的大小,直至二值化的效果最为满意为止。给图像加上零均值的高斯噪声重复上述过程,注意阈值的选择。

(2)多阈值分割图像

自选图像,对图进行多阈值分割,注意阈值的选择。

2.边缘检测

(1)使用Roberts 算子的图像分割实验,调入并显示一幅图像*.gif或*.tif;

使用Roberts 算子对图像进行边缘检测处理;Roberts 算子为一对模板,相应的矩阵为:

rh = [0 1;-1 0]; rv = [1 0;0 -1]; 

这里的rh 为水平Roberts 算子,rv为垂直Roberts 算子。可以显示处理后

的水平边界和垂直边界检测结果;

用“欧几里德距离”方式计算梯度的模,显示检测结果;对于检测结果进行二值化处理,并显示处理结果。

(2)使用Prewitt 算子的图像分割实验使用Prewitt 算子进行内容(1)中的全部步骤。

(3)使用Sobel 算子的图像分割实验使用Sobel 算子进行内容(1)中的全部步骤。

(4)使用Canny算子进行图像分割实验。

(5) 使用拉普拉斯算子进行图像分割实验。

代码如下:

  1. function U()
  2. clear;
  3. clc;
  4. Single_threshold_segmentation()
  5. Multi_threshold_segmentation()
  6. edge_detection()
  7. end
  8. % 单阈值分割
  9. % 先将一幅彩色图像转换为灰度图像,显示其直方图,
  10. % 参考直方图中灰度的分布,尝试确定阈值
  11. % 给图像加上零均值的高斯噪声重复上述过程
  12. function Single_threshold_segmentation()
  13. img = imread('gantrycrane.png'); % 读取图像
  14. figure('Name','单阈值分割'); % 开一个叫单阈值分割的窗口
  15. subplot(2,4,1);imshow(img);title('gantrycrane.png原图'); % 显示原图
  16. img = rgb2gray(img); % 彩色图像转为灰度图像
  17. subplot(2,4,2);imshow(img);title('gantrycrane.png灰度图'); % 显示灰度图
  18. subplot(2,4,3);imhist(img);title('gantrycrane.png直方图'); % 显示直方图
  19. % x = 95; % 分割阈值
  20. % img1 = uint8((0*(img<=x)+255.*(img>x))); % 图像分割
  21. x = graythresh(img); % 分割阈值
  22. img1 = im2bw(img,x); % 图像分割
  23. subplot(2,4,4);imshow(img1);title('gantrycrane.png二值图'); % 显示二值图
  24. img = imnoise(img,'gaussian'); % 添加高斯噪声
  25. subplot(2,4,6);imshow(img);title('gantrycrane.png噪声灰度图'); % 显示噪声灰度图
  26. subplot(2,4,7);imhist(img);title('gantrycrane.png噪声直方图'); % 显示噪声直方图
  27. % x = 95; % 分割阈值
  28. % img1 = uint8((0*(img<=x)+255.*(img>x))); % 图像分割
  29. x = graythresh(img); % 分割阈值
  30. img1 = im2bw(img,x); % 图像分割
  31. subplot(2,4,8);imshow(img1);title('gantrycrane.png噪声二值图'); % 显示噪声二值图
  32. end
  33. % 多阈值分割
  34. function Multi_threshold_segmentation()
  35. img = imread('cameraman.tif'); % 读取图像
  36. figure('Name','多阈值分割'); % 开一个叫多阈值分割的窗口
  37. subplot(2,2,1);imshow(img);title('cameraman.tif原图'); % 显示原图
  38. subplot(2,2,2);imhist(img);title('cameraman.tif直方图'); % 显示直方图
  39. x_1 = 77; % 分割阈值
  40. x_2 = 139;
  41. img1 = uint8(0*(img<=x_1)+round((x_1+x_2)/2)*((img>x_1)&(img<=x_2))+255*(img>x_2)); % 图像分割
  42. subplot(2,2,3);imshow(img1);title('gantrycrane.png分割图'); % 显示分割图
  43. end
  44. % 边缘检测
  45. % 使用Roberts,Prewitt,Sobel,Canny,拉普拉斯算子
  46. function edge_detection()
  47. img = imread('cameraman.tif'); % 读取图像
  48. figure('Name','边缘检测'); % 开一个叫边缘检测的窗口
  49. subplot(2,3,1);imshow(img);title('cameraman.tif原图'); % 显示原图
  50. img1 = ed(img,[[0 1;-1 0];[1 0;0 -1]]); % 使用 Roberts 算子
  51. subplot(2,3,2);imshow(img1);title('Roberts 算子'); % Roberts 算子处理图像
  52. img1 = ed(img,[[-1 -1 -1;0 0 0;1 1 1];[-1 0 1;-1 0 1;-1 0 1]]); % 使用 Prewitt 算子
  53. subplot(2,3,3);imshow(img1);title('Prewitt 算子'); % Prewitt 算子处理图像
  54. img1 = ed(img,[[-1 -2 -1;0 0 0;1 2 1];[-1 0 1;-2 0 2;-1 0 1;]]); % 使用 Sobel 算子
  55. subplot(2,3,4);imshow(img1);title('Sobel 算子'); % Sobel 算子处理图像
  56. img1 = ed(img,[[-1 1;-1 1];[-1 -1;1 1]]); % 使用 Canny算子
  57. subplot(2,3,5);imshow(img1);title('Canny算子'); % Canny算子处理图像
  58. img1 = ed(img,[[0 -1 0;-1 4 -1;0 -1 0];[-1 -1 -1;-1 8 -1;-1 -1 -1]]); % 使用 Laplace算子
  59. subplot(2,3,5);imshow(img1);title('Laplace算子'); % Laplace算子处理图像
  60. end
  61. % 进行卷积和二值化
  62. function img2 = ed(img,x)
  63. s = size(x);
  64. img1 = zeros(size(img));
  65. for i = 1:s(1)/s(2)
  66. img1 = img1 + abs(conv2(img,x(1+s(2)*(i-1):s(2)*i,1:s(2)),'same'));
  67. end
  68. img1 = uint8(img1);
  69. img2 = im2bw(img1,graythresh(img1));
  70. end

结果如下:

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

闽ICP备14008679号