当前位置:   article > 正文

图像分割——边缘检测——LoG(Marr-Hildreth算法)(Matlab)_marr-hildreth算子matlab

marr-hildreth算子matlab
  1. clc;
  2. clear all;
  3. close all;
  4. %边缘测测试图像(Detection of Edge)
  5. I=im2double(imread('D:\Gray Files\10-16.tif'));
  6. [M,N]=size(I);
  7. %%
  8. %=============================边缘检测(四)=================================
  9. % Marr-Hildreth算法,LoG
  10. %-------------------------产生高斯低通滤波器(高斯内核)-------------------
  11. n=25;
  12. n_l=floor(n/2);
  13. Gaussian=zeros(n,n);
  14. delta=4;
  15. for i=-n_l:n_l
  16. for j=-n_l:n_l
  17. %计算点(x,y)到中心点的距离
  18. D=(i)^2+(j)^2;
  19. %用滤波器乘以主函数
  20. Gaussian(i+n_l+1,j+n_l+1)=exp(-D/(2*delta^2));
  21. end
  22. end
  23. %找到抽样最小值
  24. m=min(Gaussian(:));
  25. Gaussian=floor(Gaussian/m);
  26. %忽略半径大于3*delta的取值,即置零
  27. for i=-n_l:n_l
  28. for j=-n_l:n_l
  29. %计算点(x,y)到中心点的距离
  30. d=sqrt((i)^2+(j)^2);
  31. %将大于3*delta的取值置零
  32. if d>3*delta
  33. Gaussian(i+n_l+1,j+n_l+1)=0;
  34. end
  35. end
  36. end
  37. %-------------------高斯内核与图像卷积-------------------------------------
  38. g_LoG=zeros(M,N);
  39. %对原图进行扩展,方便处理边界
  40. I_pad=padarray(I,[n_l+1,n_l+1],'symmetric');
  41. for i=1:M
  42. for j=1:N
  43. %获得图像子块区域
  44. Block=I_pad(i:i+2*n_l,j:j+2*n_l);
  45. %用Kirsch内核对子区域卷积
  46. g_LoG(i,j)=sum(sum(Block.*Gaussian));
  47. end
  48. end
  49. n=25;
  50. sigma=4;
  51. type='symmetric';
  52. g_LoG=GaussianBlur(n,I,sigma,type);
  53. % imshow(g_LoG)
  54. %-------------------拉普拉斯算子与上述卷积结果进行卷积---------------------
  55. %拉普拉斯算子
  56. L=[1 1 1;
  57. 1 -8 1;
  58. 1 1 1];
  59. %系数
  60. a=-1;
  61. len=1;
  62. %对原图进行扩展,方便处理边界
  63. g_LoG_pad=padarray(g_LoG,[len+1,len+1],'symmetric');
  64. g_Laplacian=zeros(M,N);
  65. g_L=zeros(M,N);
  66. for i=1+len:M-len
  67. for j=1+len:N-len
  68. %从扩展图像中,取出局部图像
  69. Block=g_LoG_pad(i-len:i+len,j-len:j+len);
  70. %保留拉普拉斯算子的运算结果
  71. g_L(i-len,j-len)=a*sum(sum(Block.*L));
  72. end
  73. end
  74. %计算Laplacian算子标定值
  75. m_min=min(g_L(:));
  76. img=(-m_min+g_L);
  77. g_BiaoDing=img/max(img(:));
  78. % imshow(g_BiaoDing)
  79. %-----------------------0值跨界边界搜索------------------------------------
  80. %设定门限
  81. % th=0.04;
  82. th=0.112;
  83. n_max=max(g_L(:));
  84. T=th*n_max;
  85. ind=find(g_L>T)
  86. %图像二值化
  87. g_b=zeros(M,N);
  88. g_b(ind)=1;
  89. %对二值图像周边以0扩展
  90. g_b_pad=padarray(g_b,[1,1]);
  91. %0值跨界,寻找边界
  92. g_z=zeros(M,N);
  93. for i=2:M+1
  94. for j=2:N+1
  95. %以0或者1为中心
  96. if g_b_pad(i,j)==1
  97. %计算以(i,j)为中心点的四个对角是否相异
  98. if xor(g_b_pad(i-1,j-1),g_b_pad(i+1,j+1))||... %左对角
  99. xor(g_b_pad(i-1,j+1),g_b_pad(i+1,j-1))||...%右对角
  100. xor(g_b_pad(i,j-1),g_b_pad(i,j+1))||...%行相对
  101. xor(g_b_pad(i-1,j),g_b_pad(i+1,j)) %列相对
  102. g_z(i-1,j-1)=1;
  103. end
  104. end
  105. end
  106. end
  107. imshow(g_z)

高斯模糊GaussianBlur函数:

  1. function [g]=GaussianBlur(n,I,sigma,type)
  2. [M,N]=size(I);
  3. %生成高斯核函数
  4. G=GaussianKernelG(n,sigma);
  5. %平滑图像
  6. n_l=n-1;
  7. g=zeros(M,N);
  8. %对原图进行扩展,方便处理边界
  9. I_pad=padarray(I,[n_l,n_l],type);
  10. for i=1:M
  11. for j=1:N
  12. %获得图像子块区域
  13. Block=I_pad(i:i+n_l,j:j+n_l);
  14. %用Kirsch内核对子区域卷积
  15. g(i,j)=sum(sum(Block.*G));
  16. end
  17. end
  18. %归一化
  19. g=g/max(g(:));
  20. end
  21. %生成高斯核函数
  22. % n 核函数的大小
  23. function G=GaussianKernelG(n,sigma)
  24. n_l=floor(n/2);
  25. %初始化
  26. G=zeros(n,n);
  27. %产生高斯核矩阵
  28. for i=-n_l:n_l
  29. for j=-n_l:n_l
  30. d=i^2+j^2;
  31. G(i+n_l+1,j+n_l+1)=exp(-(d)/(2*sigma^2));
  32. end
  33. end
  34. %寻找最小值
  35. m=sum(G(:));
  36. %取整
  37. G=G/m;
  38. %将大于3*delta的取值置零
  39. for i=-n_l:n_l
  40. for j=-n_l:n_l
  41. d=sqrt(i^2+j^2);
  42. if d>3*sigma
  43. G(i+n_l+1,j+n_l+1)=0;
  44. end
  45. end
  46. end
  47. end

 

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

闽ICP备14008679号