728x90
1. 개요
vtkImageMask Filter의 기본적인 사용 방법을 알아본다.
2. vtkImageMaskFilter
Mask filter는 source image 와 mask 이미지간의 중첩되는 픽셀만을 최종 결과 값으로 출력하는 filter이다.
주의할 점은 source image의 채널은 상관없지만 mask image는 component 가 1인 1채널 이미지여야 한다.
Masking 은 단순히 0이면 원본 이미지가 통과하지 못하고 0이 아닌 값이면 통과하여 원본이미지 픽셀 값이 그대로 표현된다.
Mask filter에는 NotMaskOn을 설정함으로써 Mask를 invser로 적용할 수도 있다.
3. 코드 및 Pipeline 구성
구현한 테스트 코드의 중요 부분과 pipeline의 연결도이다.
public void TestDrawingMaskImage()
{
CreateViewport(new[] { 800, 800 }, 2, 2);
originCavasSource = VtkCanvasUtils.CreateCanvas(400, 400, "Yellow");
originCavasSource.Update();
maskCanvasSource = vtkImageCanvasSource2D.New();
maskCanvasSource.SetScalarTypeToUnsignedChar();
maskCanvasSource.SetNumberOfScalarComponents(1);
maskCanvasSource.SetExtent(0, 400 - 1, 0, 400 - 1, 0, 0);
maskCanvasSource.SetDrawColor(0);
maskCanvasSource.FillBox(0, 399, 0, 399);
// Set drawing color
maskCanvasSource.SetDrawColor(255);
// Draw something
maskCanvasSource.FillBox(10, 50, 0, 100);
maskCanvasSource.Update();
vtkImageSliceMapper canvasImageMapper = vtkImageSliceMapper.New();
canvasImageMapper.SetInputConnection(originCavasSource.GetOutputPort());
canvasImageActor = vtkImageActor.New();
canvasImageActor.SetMapper(canvasImageMapper);
renderers[0].AddActor(canvasImageActor);
vtkImageSliceMapper maskCanvasImageMapper = vtkImageSliceMapper.New();
maskCanvasImageMapper.SetInputConnection(maskCanvasSource.GetOutputPort());
var maskCanvasImageActor = vtkImageActor.New();
maskCanvasImageActor.SetMapper(maskCanvasImageMapper);
renderers[1].AddActor(maskCanvasImageActor);
// Initialize the vtkImageMask
maskFilter = vtkImageMask.New();
maskFilter.SetInputConnection(0, originCavasSource.GetOutputPort()); // Original image data
maskFilter.SetInputConnection(1, maskCanvasSource.GetOutputPort()); // Original image data
maskFilter.Update();
vtkImageSliceMapper maskImageMapper = vtkImageSliceMapper.New();
maskImageMapper.SetInputConnection(maskFilter.GetOutputPort());
maskImageActor = vtkImageActor.New();
maskImageActor.SetMapper(maskImageMapper);
renderers[2].AddActor(maskImageActor);
maskInvFilter = vtkImageMask.New();
maskInvFilter.SetInputConnection(0, originCavasSource.GetOutputPort()); // Original image data
maskInvFilter.SetInputConnection(1, maskCanvasSource.GetOutputPort()); // Original image data
maskInvFilter.NotMaskOn();
maskInvFilter.Update();
vtkImageSliceMapper maskInvImageMapper = vtkImageSliceMapper.New();
maskInvImageMapper.SetInputConnection(maskInvFilter.GetOutputPort());
maskInvImageActor = vtkImageActor.New();
maskInvImageActor.SetMapper(maskInvImageMapper);
renderers[3].AddActor(maskInvImageActor);
}
4. 결과 이미지
1사분면은 원본이미지, 2사분면은 Mask 이미지, 3사분면은 Mask 결과 이미지, 4사분면은 Mask Inverse 결과 이미지이다.
728x90
728x90