itk 处理seed所在的连通区域
vtk吧
全部回复
仅看楼主
level 8
臭臭爸YY 楼主
吧神,您看楼下的图,我用connectedThresholdimagefilter它处理后的图,为毛只显示seed所在的那一个连通区域呀,其他的都木有了。能不能也显示其他的连通区域呀?
【其实我主要是想改变seed所在连通区域的像素值,别的不作处理,吧神有好的建议吗?】[花心]
2016年08月02日 09点08分 1
level 10
获取到你seed提取出来的连同区域的像素坐标值,然后对应赋值
2016年08月02日 10点08分 2
小吧主,您好,我以前提取这个连通区域坐标的时候,用的labelObject->GetRegion().GetIndex()和labelObject->GetRegion().GetSize()[0]来获取能包这个连通区域最小矩形,然后再遍历这个矩形里面像素值并返回坐标值,可是这是种笨办法,
2016年08月02日 11点08分
回复 臭臭爸YY :但是很有效[哈哈]
2016年08月02日 11点08分
@纳爱斯阿 小吧主您看楼下的图,您还有什么法子直接获取那个连通区域的坐标嘛
2016年08月02日 11点08分
level 10
回复 臭臭爸YY :你通过第二幅图获取你要的坐标,然后在第一幅图像中设置像素,
2016年08月02日 12点08分 4
哈哈,小吧主,我给忽略了,哈哈,果然是有经验的“老人”,多谢小吧主,俺试试[花心]
2016年08月02日 12点08分
回复 臭臭爸YY :哈哈,共同学习,共同探索,共同提高
2016年08月02日 12点08分
@纳爱斯阿 嗯呢,么么哒
2016年08月02日 12点08分
@纳爱斯阿 小吧主,又要麻烦您了,这个程序每次运行到那个嵌套的for循环,就会出错,您能给丢丢提示吗[乖]
2016年08月03日 02点08分
level 8
臭臭爸YY 楼主
#include "itkConnectedThresholdImageFilter.h"
#include "itkImage.h"
#include "itkCastImageFilter.h"
#include "itkCurvatureFlowImageFilter.h"
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "itkImageToVTKImageFilter.h"
#include "vtkImageViewer.h"
#include "vtkRenderWindowInteractor.h"
#include <vtkPoints.h>
#include <vtkSmartPointer.h>
#include <itkRGBPixel.h>
#include <itkImage.h>
#include <vtkImageExtractComponents.h>
#include <vtkImageAppendComponents.h>
#include "vtkImageViewer.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkImageActor.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
int main()
{
vtkSmartPointer<vtkPoints> point_of_255 = vtkSmartPointer<vtkPoints>::New();
const int dim = 3;
typedef unsigned char PixelType;
typedef itk::RGBPixel< unsigned char > PixelType1;
typedef itk::Image< PixelType1, dim > ImageType;
typedef itk::Image< PixelType, dim > ImageType1;
ImageType1::Pointer image;
// 创建对象类型
typedef float InternalPixelType;
typedef itk::Image< InternalPixelType, dim > InternalImageType;
typedef unsigned char OutputPixelType;
typedef itk::Image< OutputPixelType, dim > OutputImageType;
typedef itk::CastImageFilter< InternalImageType, OutputImageType > CastingFilterType;
typedef itk::ConnectedThresholdImageFilter< InternalImageType, InternalImageType > ConnectedFilterType;
typedef itk::ImageFileReader< InternalImageType > ReaderType;
typedef itk::ImageFileWriter< OutputImageType > WriterType;
ReaderType::Pointer reader = ReaderType::New();
reader->SetFileName("C:\\Users\\rolle\\Desktop\\02.png");
// 创建连接门限过滤器对去噪后的图像进行区域生长
ConnectedFilterType::Pointer connectedThreshold = ConnectedFilterType::New();
connectedThreshold->SetInput( reader->GetOutput() );
const InternalPixelType lowerThreshold = 250;
const InternalPixelType upperThreshold = 255;
// 设置上下门限值,用于过滤不同的像素值
connectedThreshold->SetLower( lowerThreshold );
connectedThreshold->SetUpper( upperThreshold );
// 设置区域中的亮度值
connectedThreshold->SetReplaceValue( 255 );
// 设置种子范围
InternalImageType::IndexType index;
index[0] = 400;
index[1] = 350;
index[2] = 0;
connectedThreshold->SetSeed( index );
CastingFilterType::Pointer caster = CastingFilterType::New();
caster->SetInput( connectedThreshold->GetOutput() );
image = caster->GetOutput();
/* 将文件写在C:\\Users\\rolle\\Desktop\\write*/
WriterType::Pointer writer = WriterType::New();
writer->SetFileName("C:\\Users\\rolle\\Desktop\\write\\00.png");
writer->SetInput( caster->GetOutput() );
writer->Update();// 触发写文件操作
for (int input_coordinate_X = 0;input_coordinate_X<512;input_coordinate_X++)
{
for (int input_coordinate_Y = 0;input_coordinate_Y<495;input_coordinate_Y++)
{
ImageType1::IndexType pixelIndex;
pixelIndex[0] = input_coordinate_X;
pixelIndex[1] = input_coordinate_Y;
pixelIndex[2] = 0;
PixelType1 onePixel = image->GetPixel(pixelIndex);
PixelType1::ValueType red = onePixel.GetRed();
red = onePixel[0];
/*std::cout<<onePixel<<std::endl;*/
if(red == 255)
{
point_of_255->InsertNextPoint(pixelIndex[0],pixelIndex[1],pixelIndex[2]);//获取value=255的点并加入点集
}
}
}
int number_of_point = 0;
number_of_point = point_of_255->GetNumberOfPoints();
std::cerr << number_of_point << std::endl;
for(int m = 0;m<number_of_point;m++)
{
ImageType::IndexType pixelIndex;
pixelIndex[0] = point_of_255->GetPoint(m)[0];
pixelIndex[1] = point_of_255->GetPoint(m)[1];
pixelIndex[2] = point_of_255->GetPoint(m)[2];
image->SetPixel(pixelIndex,0);
}
typedef itk::ImageToVTKImageFilter<ImageType1>ConnectorType;
ConnectorType::Pointer connector=ConnectorType::New();
connector->SetInput(image);
vtkImageActor *actor=vtkImageActor::New();
vtkRenderer *ren=vtkRenderer::New();
ren->AddActor(actor);
vtkRenderWindow *renWin=vtkRenderWindow::New();
renWin->AddRenderer(ren);
vtkImageViewer *viewer=vtkImageViewer::New();
vtkRenderWindowInteractor *iren=vtkRenderWindowInteractor::New();
iren->SetRenderWindow(renWin);
viewer->SetInput(connector->GetOutput());
viewer->SetupInteractor(iren);
viewer->SetColorWindow(255);
viewer->SetColorLevel(128);
viewer->Render();
iren->Initialize();
iren->Start();
return 0;
}
2016年08月03日 11点08分 8
[哈哈]辛苦了。谢谢分享~
2016年08月04日 00点08分
@rabbitbride 哎呀 吧神 您老终于发话了 [阴险] 狠狠 不会的我还会请教您哒 可不能嫌烦[乖]
2016年08月04日 09点08分
@臭臭爸YY 我一直都在,只是有时候比较忙。[放大仔细看]
2016年08月05日 00点08分
@rabbitbride 哇偶 我一直都在~~~好暖心的说~~~我要是女的就嫁给你啦
2016年08月05日 01点08分
level 1
请问你有没有做过内脏分割呢,另外想请教一下三维图像提取三维的感兴趣区域该怎么做啊
2017年05月13日 07点05分 9
三维图像????我们用的是ct呢。。。。
2017年05月13日 07点05分
level 1
1.itk::ConnectedComponentImageFilter 连通域求取
2.itk::LabelShapeKeepNObjectsImageFilter 标注连通对象
3. itkRelabelComponentImageFilter 不同连通域标注不同像素
2022年05月11日 02点05分 11
1