目录
1、itkCannyEdgeDetectionImageFilter Canny边缘检测
该滤波器主要功能是对标量值图像进行Canny边缘检测。
根据 John Canny 的论文“边缘检测的计算方法”(IEEE Transactions on Pattern Analysis and Machine Intelligence,Vol. PAMI-8,No.6,1986 年 11 月),边缘检测方案中使用了四个主要步骤:
- a) 用高斯滤波器对输入图像进行平滑处理
- b) 计算平滑图像的二阶方向导数
- c) 非极大值抑制:找到二阶导数的零交叉点,并利用三阶导数的符号来找到正确的极值
- d) 将滞后阈值应用于平滑图像的梯度幅度(乘以过零)以查找和链接边缘。
输入:任意维度的标量、实值itk图像,输出:相同维度的标量、实值Itk图像。
该过滤器有四个控制算法使用的子过滤器参数,方差和最大误差用于输入图像的高斯平滑,有关这些参数的信息,请参阅itkDiscreteGaussianImageFilter。
阈值是输出图像中允许的最低值,其数据类型与输出图像的数据类型相同,低于阈值的任何像素值都将替换为OutsideValue,OutsideValue默认值为零。
TODO:
当 itk 连接组件标记算法可用时,将添加边缘链接。
常用的成员函数:
SetImage()
:设置输入图像Set/GetVariance()
:设置/获取高斯平滑滤波器的方差Set/GetUpperThreshold()
:设置/获取检测到的边缘的上限阈值Set/GetLowerThreshold()
:设置/获取检测到的边缘的下限阈值Set/GetMaximumError()
:设置/获取高斯平滑核在每个维度方向上的最大误差HysteresisThresholding()
:实施迟滞阈值ComputeCannyEdge()
:计算非边界像素的二阶导数,由ThreadedCompute2ndDerivative方法调用FollowEdge()
:边缘链接功能
示例代码:
#include "itkImage.h"
#include "itkCannyEdgeDetectionImageFilter.h"
using namespace itk;
const unsigned int Dimension = 2; //数据的Dimension
typedef double doublePixelType;
typedef itk::Image<doublePixelType, Dimension> doubleImageType;
//图像进行Canny边缘检测
bool cannyEdgeDetFilter(doubleImageType* image, doubleImageType* outImage)
{
double lowerThr = 0.0; //设置上下阈值
double upperThr = 100.0;
double variance = 2.0;
typedef CannyEdgeDetectionImageFilter<doubleImageType, doubleImageType> cannyEdgeDetFilterType;
typename cannyEdgeDetFilterType::Pointer cannyFilter = cannyEdgeDetFilterType::New();
cannyFilter->SetInput(image);
cannyFilter->SetVariance(variance);
//设置上下阈值
cannyFilter->SetLowerThreshold(lowerThr);
cannyFilter->SetUpperThreshold(upperThr);
try
{
cannyFilter->Update();
}
catch (itk::ExceptionObject& ex)
{
//读取过程发生错误
std::cerr << "Error: " << ex << std::endl;
return false;
}
outImage = cannyFilter->GetOutput();
return true;
}
2、itkSobelEdgeDetectionImageFilter Sobel边缘检测
该类是使用 Sobel 算子进行 2D 或 3D 边缘检测。
该滤波器使用Sobel算子计算图像梯度,然后找到该梯度向量的大小。Sobel梯度大小(平方根平方和)是边缘强度的指示。
示例代码:
#include "itkImage.h"
#include "itkSobelEdgeDetectionImageFilter.h"
using namespace itk;
const unsigned int Dimension = 2; //数据的Dimension
typedef double doublePixelType;
typedef itk::Image<doublePixelType, Dimension> doubleImageType;
typedef signed short shortPixelType;
typedef itk::Image<shortPixelType, Dimension> ShortImageType;
//图像进行Sobel边缘检测
bool sobelEdgeDetFilter(ShortImageType* image, doubleImageType* outImage)
{
typedef SobelEdgeDetectionImageFilter<ShortImageType, doubleImageType> sobelEdgeDetFilterType;
typename sobelEdgeDetFilterType::Pointer sobelFilter = sobelEdgeDetFilterType::New();
sobelFilter->SetInput(image);
try
{
sobelFilter->Update();
}
catch (itk::ExceptionObject& ex)
{
//读取过程发生错误
std::cerr << "Error: " << ex << std::endl;
return false;
}
outImage = sobelFilter->GetOutput();
return true;
}
3、itkZeroCrossingBasedEdgeDetectionImageFilter
该滤波器的主要功能是实现基于零交叉点的原理,通过计算图像中灰度值的二阶导数来检测图像中的边缘。
基于零交叉的边缘检测器在图像的拉普拉斯算子中寻找拉普拉斯算子值通过零的像素——拉普拉斯算子改变符号的点,这些点通常出现在图像的“边缘”处,即图像强度快速变化的点,但它们也出现在不容易与边缘关联的地方,最好将过零检测器视为某种特征检测器,而不是特定的边缘检测器。
零交叉总是位于闭合轮廓上,因此零交叉检测器的输出通常是二进制图像,具有显示零交叉点位置的单像素粗细线。
首先,使用高斯滤波器对输入图像进行平滑;然后,将LaplacianImageFilter应用于平滑后的图像;最后,检测平滑图像的拉普拉斯算子的零交叉, 输出图像。
输入:标量,任意维度的 itk::Image;输出:二值图像
有关输出数据类型要求的更多信息,请参阅itkZeroCrossingImageFilter。
要使用此滤波器,首先设置嵌入的DiscreteGaussianImageFilter所需的参数(方差和最大误差)。或者,还可以为过零过滤器设置前景和背景值, 默认标签值为背景0,前景为1,如NumericTraits中针对输出图像的数据类型所定义。
常用的成员函数:
SetImage()
:设置输入图像Set/GetVariance()
:设置/获取高斯平滑滤波器的方差Set/GetForegroundValue()
:设置/获取ZeroCrossingImageFilter的前景值Set/GetBackgroundValue()
:设置/获取ZeroCrossingImageFilter的背景值Set/GetMaximumError()
:设置/获取嵌入式高斯滤波器所需的MaximumError的参数,该值用于设置高斯近似所需的最大误差,最大误差是离散高斯曲线下的面积与连续高斯曲线下的面积之差,最大误差影响高斯算子的大小,该值必须介于 0.0 和 1.0 之间
示例代码:
#include "itkImage.h"
#include "itkZeroCrossingBasedEdgeDetectionImageFilter.h"
using namespace itk;
const unsigned int Dimension = 2; //数据的Dimension
typedef double doublePixelType;
typedef itk::Image<doublePixelType, Dimension> doubleImageType;
bool zeroCrossingBasedEdgeDetFilter(doubleImageType* image, doubleImageType* outImage)
{
double variance = 2.0;
double maximumError = 0.5;
double backGround = 0.0;
double foreGround = 255.0;
typename zeroCBEdgeDetFilterType::Pointer zeroCroFilter = zeroCBEdgeDetFilterType::New();
zeroCroFilter->SetInput(image);
zeroCroFilter->SetVariance(variance);
zeroCroFilter->SetMaximumError(maximumError);
zeroCroFilter->SetBackgroundValue(backGround);
zeroCroFilter->SetForegroundValue(foreGround);
try
{
zeroCroFilter->Update();
}
catch (itk::ExceptionObject& ex)
{
//读取过程发生错误
std::cerr << "Error: " << ex << std::endl;
return false;
}
outImage = zeroCroFilter->GetOutput();
return true;
}
归纳(来自GTP):
三个类都是用于图像边缘检测的滤波器,它们的用法和适用场景略有不同。
-
itkCannyEdgeDetectionImageFilter:该滤波器实现了Canny算法,它首先使用高斯滤波器对图像进行平滑处理,然后通过计算梯度幅值和方向,使用非最大抑制策略来细化边缘,并使用双阈值策略来筛选出明显的边缘。因此,itkCannyEdgeDetectionImageFilter适用于需要提取细节丰富的明显边缘的情况,比如在计算机视觉和图像分析等方面常常使用。
-
itkSobelEdgeDetectionImageFilter:该滤波器使用Sobel算子来进行边缘检测,它通过计算图像的一阶和二阶导数来检测边缘。Sobel算子对噪声有一定的抵抗能力,可以较好地提取出边缘。因此,itkSobelEdgeDetectionImageFilter适用于需要较好的噪声抑制能力的边缘检测场景。
-
itkZeroCrossingBasedEdgeDetectionImageFilter:该滤波器使用零交叉算法来进行边缘检测,它通过查找图像中像素值的零交叉来定位边缘。这种方法对于一些边缘不明显的图像可以产生较好的效果,例如在医学图像中检测肿瘤等。因此,itkZeroCrossingBasedEdgeDetectionImageFilter适用于需要检测不明显边缘的场景。
根据具体的需求和图像特点,可以选择合适的边缘检测滤波器进行处理。