05-VTK在图像处理中的应用(7)

本文介绍了VTK在图像处理中如何应用梯度算子、Canny算子和拉普拉斯算子进行边缘检测。通过示例代码展示了如何使用VTK进行图像梯度计算、Sobel算子及Canny算子的实现,强调了这些算子在边缘检测中的作用和处理步骤。
摘要由CSDN通过智能技术生成

5.12 边缘检测

图像中不连续的灰度值会产生边缘,图像的边缘检测是基于边界的图像分割方法的基础,例如分水岭算法,通常是分割原图的梯度图像,梯度实际上也是反应的图像边缘信息。图像边缘一般常用图像一阶导数和二阶导数来检测。

5.12.1 梯度算子

梯度算子对应于图像一阶导数。图像一阶导数计算一般是通过差分运算来近似的。VTK中可以使用vtkImageGradient计算图像梯度。注意图像梯度是一个向量,具有方向和大小。因此vtkImageGradient的计算结果是一个梯度场,也就是每个像素值都是一个梯度向量。显示梯度图像时需要计算每个像素点的梯度大小,即模值。下面代码演示了怎么计算图像梯度。

 

1:     vtkSmartPointer<vtkJPEGReader>reader =

   2:         vtkSmartPointer<vtkJPEGReader>::New();

   3:     reader->SetFileName( "lena2.jpg" );

   4:     reader->Update();

   5:  

   6:     vtkSmartPointer<vtkImageGradient> gradientFilter =

   7:         vtkSmartPointer<vtkImageGradient>::New();

   8:     gradientFilter->SetInputConnection(reader->GetOutputPort());

   9:     gradientFilter->SetDimensionality(2);

  10:  

  11:     vtkSmartPointer<vtkImageMagnitude> magnitudeFilter =

  12:         vtkSmartPointer<vtkImageMagnitude>::New();

  13:     magnitudeFilter->SetInputConnection(gradientFilter->GetOutputPort());

  14:     magnitudeFilter->Update();

  15:  

  16:     double range[2];

  17:     magnitudeFilter->GetOutput()->GetScalarRange(range);

  18:  

  19:     vtkSmartPointer<vtkImageShiftScale> ShiftScale =

  20:         vtkSmartPointer<vtkImageShiftScale>::New();

  21:     ShiftScale->SetOutputScalarTypeToUnsignedChar();

  22:     ShiftScale->SetScale( 255 / range[1] );

  23:     ShiftScale->SetInputConnection(magnitudeFilter->GetOutputPort());

      24:      ShiftScale->Update();

vtkImageGradient的使用比较简单,只需要设置输入图像即可。计算梯度时,采用的是中间差分法,即像素在每个方向的差分,都是利用的前后两个像素值之差。这样在图像在边界处的差分计算需要特殊处理。其内部定义了HandleBoundaries变量,通过函数SetHandleBoundaries()定赋值。当HandleBoundaries为真时算子会特殊处理计算边界像素的梯度;当为假时不计算边界像素的梯度值,因此输出图像大小要小于输入图像。另外函数SetDimensionality()用于设置要计算的图像维数,默认为二维,此时梯度向量也为二维。

前面也提到过,梯度是一个向量,不能直接显示。因此上面代码中定义了vtkImageMagnitude对象来计算梯度向量的2范数,即向量的模。利用vtkImageShiftScale将图像的数据范围调整到0-255然后显示。另外还可以通过vtkImageExtractComponents来提取每个方向的梯度分量进行显示。注意,彩色图像不能直接用来计算梯度,需要先转换为灰度图像。本例的执行结果如下图所示。

 

图5.26 梯度算子

索贝尔算子(Sobel)也是一种常用的梯度算子(图5.27)。Sobel算子计算稍微复杂,它采用3x3的模板。计算时模板在图像上移动,并在每个位置上计算对应中心像素的梯度值。VTK中vtkSobel2D计算图像的sobel算子,使用代码如下:

 

图5.27 Sobel算子

 

1:      vtkSmartPointer<vtkJPEGReader>reader =

   2:         vtkSmartPointer<vtkJPEGReader>::New();

   3:     reader->SetFileName( "lena2.jpg" );

   4:     reader->Update();

   5:  

   6:     vtkSmartPointer<vtkImageSobel2D> sobelFilter =

   7:         vtkSmartPointer<vtkImageSobel2D>::New();

   8:     sobel

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值