数字图像处理(冈萨雷斯版)学习笔记(6)第10章

10.1.2 线检测

数字图像处理(冈萨雷斯版)学习笔记(6)第10章_第1张图片

  • 检测指定方向的线

      f = imread('c:\图像\线检测样本.tif');
    
      g = abs(imfilter(double(f),w));
    
      figure,imshow(f)
    
      figure,imshow(g)
    
      gtop = g(1:120,1:120);
    
      gtop = pixeldup(gtop,4);
      
      figure,imshow(gtop,[])
    
      gbot = g(end-119:end,end-119:end);
    
      gbot = pixeldup(gbot,4);
    
      figure,imshow(gbot,[]);
    
      g = abs(g);
    
      figure,imshow(g,[])
    
      T = max(g(:));
    
      g = g >= T;
    
      figure,imshow(g)
    

    图像1为原始图像

    图像2使用-45度检测器处理后的结果

    图像3是图像2的左上角放大图

    图像4是图像2的右下角放大图

    图像5为图像2的绝对值

    图像6为值满足条件 g >= T的所有点(白色),其中g是图像5所示的图像
    数字图像处理(冈萨雷斯版)学习笔记(6)第10章_第2张图片

数字图像处理(冈萨雷斯版)学习笔记(6)第10章_第3张图片

数字图像处理(冈萨雷斯版)学习笔记(6)第10章_第4张图片

10.1.3 使用edge函数的边缘检测

数字图像处理(冈萨雷斯版)学习笔记(6)第10章_第5张图片
数字图像处理(冈萨雷斯版)学习笔记(6)第10章_第6张图片

  • Sobel边缘检测器

数字图像处理(冈萨雷斯版)学习笔记(6)第10章_第7张图片

Sobel检测器的调用方法为:

[g, t] = edge(f,‘sobel’,T,dir)

其中,f是输入图像,T是一个指定的阈值,dir指定检测边缘的首选方向:‘horizontal’,‘vertical’或’both’(默认值)。g是在被检测到边缘的位置处为1而在其他位置为0的逻辑类图像。输出参数是可选的,它是函数edge所用的阈值。若指定了T的值,则t = T。否则,若T未被赋值(或为空,[]),则函数edge会令t等于它自动确定的一个阈值,然后用于边缘检测。在输出参量中要包括t的主要原因之一是为了得到一个阈值的初始值。若使用语法g = edge(f)或[g,t] = egde(f),则函数edge会默认使用Sobel检测器。

图像1为原始图像

图像2为使用带有自动确定的阈值的一个垂直Sobel掩模后,函数edge导致的结果;

图像3为使用指定阈值后的结果

图像4是使用指定阈值来决定垂直边缘和水平边缘的结果

图像5使用函数imfilter(具有指定掩模和阈值)计算45度边缘的结果;

图像6是-45度边缘的结果

数字图像处理(冈萨雷斯版)学习笔记(6)第10章_第8张图片

数字图像处理(冈萨雷斯版)学习笔记(6)第10章_第9张图片
数字图像处理(冈萨雷斯版)学习笔记(6)第10章_第10张图片

数字图像处理(冈萨雷斯版)学习笔记(6)第10章_第11张图片

  • Prewitt边缘检测器(使用图10.5©)

    基本语法:[g,t] = edge(f,‘prewitt’,T,dir)

    该函数的参数和Sobel的参数相同。Prewitt检测器比Sobel检测器在计算上要简单一些,但比较容易产生一些噪声(系数为2的Sobel检测器可提供一种平滑作用)。

  • Roberts边缘检测器(使用图10.5(d))

    基本语法:[g,t] = edge(f,‘roberts’,T,dir)

  • Laplacian of a Gaussian

数字图像处理(冈萨雷斯版)学习笔记(6)第10章_第12张图片

  • 零交叉检测器

    这种检测器基于与LoG方法相同的概念,但卷积是使用指定的滤波函数H执行。调用语法为

    [g, t] = edge(f,‘zerocross’,T,H)

    其他参数的解释与LoG中的参数相同

  • Canny边缘检测器

数字图像处理(冈萨雷斯版)学习笔记(6)第10章_第13张图片

  • Sobel,LoG和Canny边缘检测器的比较

      f = imread('c:\图像\边缘检测样本.tif');
    
      [g_sobel_default,ts] = edge(f,'sobel');
    
      [g_log_default,tlog] = edge(f,'log');
    
      [g_canny_default,tc] = edge(f,'canny');
    
      figure,imshow(g_sobel_default)
    
      figure,imshow(g_log_default)
    
      figure,imshow(g_canny_default)
    
      g_sobel_best = edge(f,'sobel',0.05);
    
      g_log_best = edge(f,'log',0.003,2.25);
    
      g_canny_best = edge(f,'canny',[0.04 0.10],1.5);
    
      figure,imshow(g_sobel_best)
    
      figure,imshow(g_log_best)
    
      figure,imshow(g_canny_best)
    

    图像1 - 3分别为使用默认选项’Sobel’,'log’和’canny’得到的边缘图像:

数字图像处理(冈萨雷斯版)学习笔记(6)第10章_第14张图片

数字图像处理(冈萨雷斯版)学习笔记(6)第10章_第15张图片
图像4 - 6交互地显示原图像的主要特征所得到的结果,该结果减少了无关的细节。这是到目前为止Canny边缘检测器产生的最好结果
数字图像处理(冈萨雷斯版)学习笔记(6)第10章_第16张图片
数字图像处理(冈萨雷斯版)学习笔记(6)第10章_第17张图片

10.2 使用Hough变换的线检测

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E9EdThVV-1593138195503)(https://s2.ax1x.com/2019/07/13/Zhl4vn.png)]

  •   f = imread('c:\图像\Hough函数样本.tif');
    
      f = zeros(101,101);
    
      f(1,1) = 1;
    
      f(101,1) = 1;
    
      f(1,101) = 1;
    
      f(101,101) = 1;
    
      f(51,51) = 1;
    
      H = hough(f);
    
      figure,imshow(H,[])
    
      figure,imshow(f)
    
      figure,imshow(H,[])
    

数字图像处理(冈萨雷斯版)学习笔记(6)第10章_第18张图片

10.2.1 使用Hough变换做峰值检测

10.2.2 使用Hough变换做线检测和链接

10.3 阈值处理

10.3.1 全局阈值处理

数字图像处理(冈萨雷斯版)学习笔记(6)第10章_第19张图片

  • 函数graythresh能够计算阈值,其语法为:T = graythresh(f)

    其中,f是输入图像,T是产生的阈值。为了分割图像,我们在函数im2bw中使用阈值T。因为阈值已被归一化到范围[0,1]内,因此必须在使用阈值之前将其缩放到合适范围。例如,若f是uint8类图像,则我们在使用T之前要让T乘以255.

  • 计算全局阈值

      f = imread('c:\图像\计算阈值样本.tif');
    
      T = 0.5*(double(min(f(:))) + double(max(f(:))));
    
      done = false;
    
      while~done
    
      g = f >= T;
    
      Tnext = 0.5*(mean(f(g)) + mean(f(~g)));
    
      done = abs(T - Tnext) < 0.5;
    
      T = Tnext;
    
      end
    
      figure,imshow(f)
    
      T2 = graythresh(f)
      
      T2 =
      
          0.3961
      
      >> T2 * 255
      
      ans =
      
         101
      
      while~done
    
      g = f >= T2;
    
      T2next = 0.5*(mean(f(g)) + mean(f(~g)));
    
      done = abs(T2 - Tnext) < 0.5;
    
      T2 = T2next;
    
      end
    
      figure,imshow(g)
    

    图1为原图像,图2为策略迭代的结果,图3为使用graythresh的结果

数字图像处理(冈萨雷斯版)学习笔记(6)第10章_第20张图片

数字图像处理(冈萨雷斯版)学习笔记(6)第10章_第21张图片

10.3.2 局部阈值处理

数字图像处理(冈萨雷斯版)学习笔记(6)第10章_第22张图片
f = imread(‘c:\图像\计算阈值样本.tif’);

	g = imsubtract(imadd(f, imtophat(f, strel('disk', 3))),imtophat(f, strel('disk', 3)));

	subplot(1, 3, 1), imshow(f), title('原图');

	subplot(1, 3, 2), imshow(g), title('顶帽后');

	subplot(1, 3, 3), imshow(im2bw(g, graythresh(tofloat(g))))title('顶帽后进行阈值处理');

数字图像处理(冈萨雷斯版)学习笔记(6)第10章_第23张图片

你可能感兴趣的:(数字图像处理)