VTK笔记-图像融合-03-vtkImageMask类

vtkImageMask

  vtkImageMask将掩膜与图像相结合。掩模分为非零掩膜和零掩膜;非零掩模意味着输出像素将与原始图像相同。如果掩膜的像素为零,则输出像素将设置为“MaskedValue”。vtkImageMask过滤器还可以选择在处理图像之前通过布尔not操作传递掩膜。这将反转和替换像素。两个输入应该具有相同的“WholeExtent”。掩膜Mask输入应该是无符号字符,并且图像标量类型与输出标量类型相同。
  vtkImageMask类既可以处理二维图像也可以处理三维图像,都是vtkImageData对象;

接口

设置输入图像源

void SetImageInputData(vtkImageData* in);  
virtual void SetInput1Data(vtkDataObject* in) { this->SetInputData(0, in); }   

设置掩膜图像源

void SetMaskInputData(vtkImageData* in);
virtual void SetInput2Data(vtkDataObject* in) { this->SetInputData(1, in); }

设置掩膜为0遮盖部分颜色

void SetMaskedOutputValue(int num, double* v);
void SetMaskedOutputValue(double v) { this->SetMaskedOutputValue(1, &v); }
void SetMaskedOutputValue(double v1, double v2){
	double v[2];
	v[0] = v1;
	v[1] = v2;
    this->SetMaskedOutputValue(2, v);
}
// V1:R;V2:G;V3:B;
void SetMaskedOutputValue(double v1, double v2, double v3){
	double v[3];
    v[0] = v1;
    v[1] = v2;
    v[2] = v3;
    this->SetMaskedOutputValue(3, v);
}

开启颜色掩膜反转

vtkSetMacro(NotMask, vtkTypeBool);
vtkGetMacro(NotMask, vtkTypeBool);
vtkBooleanMacro(NotMask, vtkTypeBool);

透明度

vtkSetClampMacro(MaskAlpha, double, 0.0, 1.0);
vtkGetMacro(MaskAlpha, double);

示例

#include <vtkImageActor.h>
#include <vtkImageCanvasSource2D.h>
#include <vtkImageCast.h>
#include <vtkImageData.h>
#include <vtkImageEllipsoidSource.h>
#include <vtkImageMapper3D.h>
#include <vtkImageMask.h>
#include <vtkInteractorStyleImage.h>
#include <vtkJPEGWriter.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>

class Test_ImageMask
{
public:
	static void Test()
	{
		vtkNew<vtkNamedColors> colors;

		// Create an image of a rectangle
		vtkNew<vtkImageCanvasSource2D> source;
		source->SetScalarTypeToUnsignedChar();
		source->SetNumberOfScalarComponents(3);
		source->SetExtent(0, 200, 0, 200, 0, 0);

		// Create a red image
		source->SetDrawColor(255, 0, 0);
		source->FillBox(0, 200, 0, 200);
		source->Update();

		// Create a rectanglular mask
		vtkNew<vtkImageCanvasSource2D> maskSource;
		maskSource->SetScalarTypeToUnsignedChar();
		maskSource->SetNumberOfScalarComponents(1);
		maskSource->SetExtent(0, 200, 0, 200, 0, 0);

		// Initialize the mask to black
		maskSource->SetDrawColor(0, 0, 0);
		maskSource->FillBox(0, 200, 0, 200);

		// Create a square
		maskSource->SetDrawColor(255, 255,255); 
		// anything non-zero means "make the output
		// pixel equal the input pixel." If the mask is
		// zero, the output pixel is set to MaskedValue
		maskSource->FillBox(100, 120, 100, 120);
		maskSource->Update();

		vtkNew<vtkImageMask> maskFilter;
		maskFilter->SetInputConnection(0, source->GetOutputPort());
		maskFilter->SetInputConnection(1, maskSource->GetOutputPort());
		maskFilter->SetMaskedOutputValue(0, 0, 0);
		maskFilter->Update();

		vtkNew<vtkImageMask> inverseMaskFilter;
		inverseMaskFilter->SetInputConnection(0, source->GetOutputPort());
		inverseMaskFilter->SetInputConnection(1, maskSource->GetOutputPort());
		inverseMaskFilter->SetMaskedOutputValue(0, 0, 0);
		inverseMaskFilter->NotMaskOn();
		inverseMaskFilter->Update();

		// Create actors
		vtkNew<vtkImageActor> originalActor;
		originalActor->GetMapper()->SetInputConnection(source->GetOutputPort());

		vtkNew<vtkImageActor> maskActor;
		maskActor->GetMapper()->SetInputConnection(maskSource->GetOutputPort());

		vtkNew<vtkImageActor> maskedActor;
		maskedActor->GetMapper()->SetInputConnection(maskFilter->GetOutputPort());

		vtkNew<vtkImageActor> inverseMaskedActor;
		inverseMaskedActor->GetMapper()->SetInputConnection(inverseMaskFilter->GetOutputPort());

		// Define viewport ranges
		// (xmin, ymin, xmax, ymax)
		double originalViewport[4] = { 0.0, 0.0, 0.25, 1.0 };
		double maskViewport[4] = { 0.25, 0.0, 0.5, 1.0 };
		double maskedViewport[4] = { 0.5, 0.0, 0.75, 1.0 };
		double inverseMaskedViewport[4] = { 0.75, 0.0, 1.0, 1.0 };

		// Setup renderers
		vtkNew<vtkRenderer> originalRenderer;
		originalRenderer->SetViewport(originalViewport);
		originalRenderer->AddActor(originalActor);
		originalRenderer->ResetCamera();
		originalRenderer->SetBackground(colors->GetColor3d("SandyBrown").GetData());

		vtkNew<vtkRenderer> maskRenderer;
		maskRenderer->SetViewport(maskViewport);
		maskRenderer->AddActor(maskActor);
		maskRenderer->ResetCamera();
		maskRenderer->SetBackground(colors->GetColor3d("Peru").GetData());

		vtkNew<vtkRenderer> maskedRenderer;
		maskedRenderer->SetViewport(maskedViewport);
		maskedRenderer->AddActor(maskedActor);
		maskedRenderer->ResetCamera();
		maskedRenderer->SetBackground(colors->GetColor3d("SandyBrown").GetData());

		vtkNew<vtkRenderer> inverseMaskedRenderer;
		inverseMaskedRenderer->SetViewport(inverseMaskedViewport);
		inverseMaskedRenderer->AddActor(inverseMaskedActor);
		inverseMaskedRenderer->ResetCamera();
		inverseMaskedRenderer->SetBackground(colors->GetColor3d("Peru").GetData());

		vtkNew<vtkRenderWindow> renderWindow;
		renderWindow->SetSize(1000, 250);
		renderWindow->AddRenderer(originalRenderer);
		renderWindow->AddRenderer(maskRenderer);
		renderWindow->AddRenderer(maskedRenderer);
		renderWindow->AddRenderer(inverseMaskedRenderer);
		renderWindow->SetWindowName("ImageMask");

		vtkNew<vtkRenderWindowInteractor> renderWindowInteractor;
		vtkNew<vtkInteractorStyleImage> style;

		renderWindowInteractor->SetInteractorStyle(style);
		renderWindowInteractor->SetRenderWindow(renderWindow);
		renderWindow->Render();
		renderWindowInteractor->Initialize();
		renderWindowInteractor->Start();
	}
};

  运行结果如下:
在这里插入图片描述
  将maskFilter->SetMaskedOutputValue(0, 0, 0);修改为maskFilter->SetMaskedOutputValue(0, 0, 255);
  显示效果如下,可见被Mask遮盖的颜色编程了蓝色,反转后的颜色黑色也变成了蓝色;
在这里插入图片描述
  具体执行步骤:
    1.生成一张红色图像;
    2.生成一张掩膜图像,中间有一个方形非零掩膜;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑山老妖的笔记本

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值