【ITK库学习】使用itk库进行图像滤波ImageFilter:三种边缘检测

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):
三个类都是用于图像边缘检测的滤波器,它们的用法和适用场景略有不同。

  1. itkCannyEdgeDetectionImageFilter:该滤波器实现了Canny算法,它首先使用高斯滤波器对图像进行平滑处理,然后通过计算梯度幅值和方向,使用非最大抑制策略来细化边缘,并使用双阈值策略来筛选出明显的边缘。因此,itkCannyEdgeDetectionImageFilter适用于需要提取细节丰富明显边缘的情况,比如在计算机视觉和图像分析等方面常常使用。

  2. itkSobelEdgeDetectionImageFilter:该滤波器使用Sobel算子来进行边缘检测,它通过计算图像的一阶和二阶导数来检测边缘。Sobel算子对噪声有一定的抵抗能力,可以较好地提取出边缘。因此,itkSobelEdgeDetectionImageFilter适用于需要较好噪声抑制能力的边缘检测场景。

  3. itkZeroCrossingBasedEdgeDetectionImageFilter:该滤波器使用零交叉算法来进行边缘检测,它通过查找图像中像素值的零交叉来定位边缘。这种方法对于一些边缘不明显的图像可以产生较好的效果,例如在医学图像中检测肿瘤等。因此,itkZeroCrossingBasedEdgeDetectionImageFilter适用于需要检测不明显边缘的场景。

根据具体的需求和图像特点,可以选择合适的边缘检测滤波器进行处理。

  • 30
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ITK(Insight Segmentation and Registration Toolkit)是一个开源的图像处理,提供了丰富的图像过滤和分析功能。其中之一的多线程图像过滤功能,是对图像进行并行处理的重要特性。 使用多线程过滤图像可以显著提高图像处理的效率。多线程技术可以将图像划分成多个区域,每个线程负责处理一个区域,同时进行处理。比如,对一幅图像进行平滑操作时,可以将图像分割成多个块,每个线程对其中一个块进行平滑处理,最后再将结果合并。 多线程过滤图像的步骤如下: 1. 导入ITK,并创建图像对象。 2. 设置多线程过滤器的参数,比如平滑半径、滤波类型等。 3. 创建多线程过滤器对象,并将图像对象作为输入。 4. 调用多线程过滤器的Update()函数进行处理。 5. 获取处理后的结果,可以保存为新的图像文件或进行后续分析。 多线程过滤图像的好处是可以充分利用计算机的多核处理器,提高处理速度,特别是对大规模的图像数据而言。同时,多线程过滤图像可以减少对内存的占用,提高了程序的稳定性。 然而,使用多线程过滤图像也有一些需要注意的地方。首先,需要合理调节线程数量,避免过多的线程导致资源竞争或者过多的开销。其次,需要注意线程之间的同步问题,以避免出现数据冲突等错误。最后,不同的图像过滤器可能对多线程支持的程度有所不同,需要进行相应的测试和优化。 总之,ITK提供了强大的多线程图像过滤功能,可以提高图像处理的效率和准确性。使用多线程过滤图像需要合理设置参数并处理同步问题,以充分发挥多核处理器的优势。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值