美文网首页
ITK 基础(三) — 边缘检测(Edge_Delection)

ITK 基础(三) — 边缘检测(Edge_Delection)

作者: 小张Python | 来源:发表于2020-08-24 08:47 被阅读0次

方法介绍

ITK 中边缘检测方法用到的是 Canny Edge Delection,用于图像中各结构轮廓的提取。

为了取得一个不错的结果,Canny 边缘检测内置封装多中算法,涉及到的算法有用

  • 利用高斯模糊来如初图像中的噪点;

  • 通过计算像素递归梯度来定位边缘调整;

  • 非最大抑去除 suprious 特征;

  • 设置阈值最终得到二值化图像;

虽然整个边缘检测的的数据管道流对于用户来说相对比较抽象,但是对这些组分的充分理解,可以调节到比较合适的参数,得到不错的结果

代码实现

实现时用到 itk::CannyEdgeDetectionImageFilter 头文件;在下面这个例子中因为读取是 PNG 格式图片,因此图像读取时用到的数据类型为 unsigned char;

但是 CannyEdgeDetectionImageFilter 处理的图像格式需是 double ,因此在 Filter 处理之前,用 CastImageFilter 把 unsigned char 格式转化为 double;

最后文件写出之前利用 RescaleIntensityImageFilter 将 double 转化为 unsigned char,写出 PNG 图像;

边缘检测时,需要设置三个参数值 ;

  • SetVariance() ,设置一个值用于图像高斯模糊;

  • SetUpperThreshold() ,设置一个选择阈值的最大临界点;

  • SetLowerThreshold() , 设置阈值范围的最低临界点;

#include<itkImageFileReader.h>
#include<itkImageFileWriter.h>
#include<itkCastImageFilter.h>
#include<itkRescaleIntensityImageFilter.h>
#include<itkCannyEdgeDetectionImageFilter.h>
#include<itkPNGImageIOFactory.h>
using namespace std;
​
int main()
{
​
 itk::PNGImageIOFactory::RegisterOneFactory();
 using CharPixelType = unsigned char;
 using RealPixelType = double;

 string input_name = "D:/ceshi1/ITK/Filter/Edge_Detection/input.png";
 string output_name = "D:/ceshi1/ITK/Filter/Edge_Detection/output.png";
​
​
 using CharImageType = itk::Image<CharPixelType, 2>;
 using RealImageType = itk::Image<RealPixelType, 2>;
​
​
 using ReaderType = itk::ImageFileReader<CharImageType>;
 using WriterType = itk::ImageFileWriter<CharImageType>;
​
 using CastToRealFilterType = itk::CastImageFilter<CharImageType, RealImageType>;
 using CannyFilterType = itk::CannyEdgeDetectionImageFilter<RealImageType, RealImageType>;

 using RescaleFilterType = itk::RescaleIntensityImageFilter<RealImageType, CharImageType>;//Real to Char

​
 ReaderType::Pointer reader = ReaderType::New();
 CastToRealFilterType::Pointer  toReal = CastToRealFilterType::New();
 CannyFilterType::Pointer cannyFilter = CannyFilterType::New();
 RescaleFilterType::Pointer  rescale = RescaleFilterType::New();
 WriterType::Pointer writer = WriterType::New();
​
​
 reader->SetFileName(input_name);
 writer->SetFileName(output_name);

 toReal->SetInput(reader->GetOutput());//Cast unsigned char to double;
 cannyFilter->SetInput(toReal->GetOutput());//Get double;
 rescale->SetInput(cannyFilter->GetOutput());//reacale;
 writer->SetInput(rescale->GetOutput());
​
 cannyFilter->SetVariance(5.0);
 cannyFilter->SetUpperThreshold(1.0);
 cannyFilter->SetLowerThreshold(1.0);

 try
 {
 writer->Update();
 }
 catch (const itk::ExceptionObject &e)
 {
 cout << "Exceptation Caught" << std::endl;
 cout << e.what() << std::endl;
 return EXIT_FAILURE;
 }
 return EXIT_SUCCESS;
​
​

代码中,处理的图像为 ITK 官网 提供的大脑切片 PNG 格式,Variance 设置为 5.0,UpperThreshold 和 LowerThreshold 都设置为 1.0;最终的呈现效果如下

Snipaste_2020-05-03_21-17-44.png

相关文章

  • ITK 基础(三) — 边缘检测(Edge_Delection)

    方法介绍 ITK 中边缘检测方法用到的是 Canny Edge Delection,用于图像中各结构轮廓的提取。 ...

  • cv领域之边缘检测技术学习

    一、边缘检测简单介绍 边缘检测是图像分割中最常见的操作之一,一般提到边缘可能有三个概念: 边缘检测:定位边缘像素的...

  • opencv+python学习记录(二十)边缘检测

    边缘检测包含:Prewitt边缘检测、Sobel边缘检测、Scharr算子、Canny边缘检测、Laplacian...

  • 霍夫变换与直线检测

    背景 霍夫变换应该是在边缘检测的基础上的,如果要在如下这张图中做直线的检测,opencv有很多边缘检测的算法得到一...

  • Canny边缘检测---OpenCV-Python开发指南(22

    什么是Canny边缘检测 Canny边缘检测是一种使用多级边缘检测算法检测边缘的方法。该方法由John F. Ca...

  • Opencv第三课---边缘检测

    边缘检测 边缘检测是图像领域非常重要的一种处理手段,要理解边缘检测,首先要理解什么是边缘。边缘是图像局部强度具有非...

  • Task06 边缘检测

    6.1 简介 6.1.1 什么是边缘? 边缘是图像强度函数快速变化的地方 6.1.2 如何检测边缘? 为了检测边缘...

  • 图像处理基础-图像边缘检测

    一、插曲 图像处理经常会用到这张赫赫有名的图片,这位lena女士的照片原本用在“花花公子”的杂志封面上,机缘巧合被...

  • 图像轮廓(1)

    边缘检测虽然能够检测出边缘,但是边缘不是连续的,检测到的边缘不是一个整体。图像轮廓是指将边缘连接起来形成一个整体 ...

  • 数字图像 - 边缘检测原理 - Sobel, Laplace,

    先来看张图,左边是原图,右边是边缘检测后的图,边缘检测就是检测出图像上的边缘信息,右图用白色的程度表示边缘的深浅。...

网友评论

      本文标题:ITK 基础(三) — 边缘检测(Edge_Delection)

      本文链接:https://www.haomeiwen.com/subject/jznedktx.html