算法介绍
区域生长,指将前景种子点扩展为更大区域的过程。
预备知识
编程工具:VS2010, CMAKE
编程语言:C++
编程库:ITK
数据结构:栈,通过栈实现区域生长算法
数据:三维的病变视网膜图像
目的:分割视网膜图像中的病变区域,即色素上皮层脱离区域。
实现过程
(1) 读入原图像,前景种子点图像;
说明:前景种子点由形态学方法自动获取,也可以手动标注前景种子点。
(2) 定义区域生长的准则;
(3) 前景种子点入栈;对前景种子点逐个遍历,在当前种子点的26邻域内,如果有像素点满足生长条件,则该像素点入栈;直到栈为空,则算法结束;
(4) 添加约束条件,对区域生长结果进行限制;
(5) 将区域生长结果叠加在原图上,查看具体效果。
具体代码如下,并在VS2010上测试通过:
#include"itkImage.h"
#include"itkImageFileReader.h"
#include"itkImageFileWriter.h"
#include<iostream>
#include<string>
#include <fstream>
#include <stack>
using namespace std;
int main(int argc, char* argv[])
{
char* srcImagePath = argv[1];
char* seedImagePath = argv[2];
char* dstImagePath = argv[3];
char* sur1Path = argv[4];//视网膜分层结果
char* sur12Path = argv[5];//视网膜分层结果
typedef itk::Image<unsigned short,3>InputImageType;
typedef itk::Image<unsigned short,3>OutputImageType;
typedef itk::Image<unsigned char,3>SeedImageType;
InputImageType::Pointer srcImage = InputImageType::New();
OutputImageType::Pointer dstImage = OutputImageType::New();
SeedImageType::Pointer seedImage = SeedImageType::New();
typedef itk::ImageFileReader<InputImageType>ReaderType;
typedef itk::ImageFileReader<SeedImageType>SeedReaderType;
ReaderType::Pointer reader = ReaderType::New();
SeedReaderType::Pointer readerSeed = SeedReaderType::New();
reader->SetFileName(argv[1]);//原图像
readerSeed->SetFileName(argv[2]);//前景种子点图
reader->Update();
srcImage = reader->GetOutput();
readerSeed->Update();
seedImage = readerSeed->GetOutput(