首页 > 其他分享 >ITK-重采样

ITK-重采样

时间:2024-09-05 10:54:41浏览次数:12  
标签:采样 itk 插值 resampleFilter 图像 include ITK

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

什么是重采样

       重采样(Resampling) 是一种用于图像处理的技术,主要应用于对图像进行尺寸调整、旋转、平移、变形等几何变换时重构像素数据。在图像处理中的重采样,是通过插值计算在新图像坐标系下的像素值,以保证图像在几何变换后的视觉效果和数据准确性。

       重采样的主要目的:

  •  尺寸缩放:改变图像的分辨率,使其变大或变小。例如,缩小图像可用于节省存储空间或加速处理,而放大图像用于查看细节。
  • 旋转、平移、仿射变换:对图像进行各种几何变换,保持图像特征不失真。
  • 图像配准:将一幅图像对齐到另一幅图像中,通常用于医学图像处理、多视角影像合成等领域。 

       重采样的过程:

  •  几何变换:根据目标图像的需求(缩放、旋转、平移等),使用相应的几何变换(如仿射变换、刚体变换)将原图像的坐标映射到新图像的坐标系。
  • 插值计算:由于原始图像中的像素点坐标通常不能直接映射到新图像中的整数坐标,需要通过插值算法(如线性插值、双三次插值等)来估算新位置像素值。
  • 输出图像生成:根据插值计算得到的像素值生成新的图像。 

       重采样的核心之一是插值方法,用于计算新图像中每个像素点的值。常见的插值方法有:

  •  最近邻插值

    • 最简单的插值方法,新像素值取与之最近的旧像素点的值。
    • 优点:计算量小,速度快。
    • 缺点:图像缩放后容易产生锯齿效应,图像不够平滑。
  • 双线性插值

    • 通过周围 2x2 个像素点的加权平均,计算出新像素值。
    • 优点:生成的图像较平滑,效果好于最近邻插值。
    • 缺点:相比最近邻插值,计算复杂度稍高。
  • 双三次插值

    • 通过周围 4x4 个像素点进行插值计算,考虑更多像素的信息。
    • 优点:图像质量较好,适合大规模缩放。
    • 缺点:计算量较大。
  • 样条插值(Spline Interpolation)

    • 通过样条曲线对图像进行插值,能保证图像边缘的平滑性。
    • 优点:插值精度高,能保留较多细节。
    • 缺点:计算较复杂。 

       重采样的应用:

  •  医学图像处理:重采样用于将多模态(如 CT、MRI)或多时间点图像进行配准,以便医生进行精确分析。
  • 计算机视觉:对图像进行缩放或旋转以适应不同的应用需求,如目标识别、特征提取。
  • 遥感影像处理:遥感影像需要在不同分辨率下进行分析和配准,重采样是关键步骤之一。 

       重采样的挑战:

  • 图像失真:在缩放和旋转等操作中,重采样可能会引入失真,尤其是最近邻插值容易导致锯齿或模糊效果。
  • 计算量:复杂的插值方法(如双三次插值、样条插值)会增加计算时间,在实时处理应用中可能会带来性能问题。

       总结来说,重采样是图像处理中的一种基础技术,能够对图像进行精确的几何变换,适用于图像配准、缩放、旋转等多种应用场景,且插值方法的选择直接影响到处理后的图像质量。

环境准备

参见:Windows下用CMake编译ITK及配置测试_itk配置-CSDN博客

功能解析

       下面以图像扩展2倍为例,展示重采样的使用方法。

1.引入必要的头文件:

#include <itkImage.h>
#include <itkImageFileReader.h>
#include <itkImageFileWriter.h>
#include <itkResampleImageFilter.h>
#include <itkAffineTransform.h>
#include <itkLinearInterpolateImageFunction.h>
#include <itkRescaleIntensityImageFilter.h>
#include <itkJPEGImageIOFactory.h>

2.初始化图像类型和读写器:

// 定义图像类型
typedef itk::Image<unsigned char, 2> ImageType;
typedef itk::ImageFileReader<ImageType> ReaderType;
typedef itk::ImageFileWriter<ImageType> WriterType;
// 注册JPEG格式支持
itk::JPEGImageIOFactory::RegisterOneFactory();
// 创建读取器和写入器
ReaderType::Pointer reader = ReaderType::New();
WriterType::Pointer writer = WriterType::New();

3.设置文件名:

// 设置要读取和写入的文件
reader->SetFileName("test.jpg");
writer->SetFileName("output_2x_resized.jpg");

4.读取图像信息:

// 读取图像
reader->Update();
// 获取原始图像的大小和空间信息
ImageType::Pointer inputImage = reader->GetOutput();
ImageType::SpacingType inputSpacing = inputImage->GetSpacing();
ImageType::SizeType inputSize = inputImage->GetLargestPossibleRegion().GetSize();
// 计算输出图像的空间信息(将图像扩展为原来的2倍)
ImageType::SpacingType outputSpacing;
outputSpacing[0] = inputSpacing[0] / 2.0;  // 水平方向的间距缩小一半(像素数变成两倍)
outputSpacing[1] = inputSpacing[1] / 2.0;  // 垂直方向的间距缩小一半
ImageType::SizeType outputSize;
outputSize[0] = inputSize[0] * 2;  // 水平方向的像素数扩展为两倍
outputSize[1] = inputSize[1] * 2;  // 垂直方向的像素数扩展为两倍

5.创建仿射变换、插值器、重采样滤波器:

// 创建一个仿射变换,用于调整图像空间
typedef itk::AffineTransform<double, 2> TransformType;
TransformType::Pointer transform = TransformType::New();
transform->SetIdentity();
// 创建插值器(线性插值)
typedef itk::LinearInterpolateImageFunction<ImageType, double> InterpolatorType;
InterpolatorType::Pointer interpolator = InterpolatorType::New();
// 创建重采样滤波器
typedef itk::ResampleImageFilter<ImageType, ImageType> ResampleFilterType;
ResampleFilterType::Pointer resampleFilter = ResampleFilterType::New();
resampleFilter->SetInput(inputImage);
resampleFilter->SetTransform(transform);
resampleFilter->SetInterpolator(interpolator);
resampleFilter->SetOutputSpacing(outputSpacing);
resampleFilter->SetSize(outputSize);
resampleFilter->SetOutputOrigin(inputImage->GetOrigin());
resampleFilter->SetOutputDirection(inputImage->GetDirection());
// 执行重采样
try
{
	resampleFilter->Update();
}
catch (itk::ExceptionObject &error)
{
	std::cerr << "Error: " << error << std::endl;
	return EXIT_FAILURE;
}

6.连接过滤器输出到写入器并执行写入操作:

// 保存输出图像
writer->SetInput(resampleFilter->GetOutput());
try
{
	writer->Update();
}
catch (itk::ExceptionObject &error)
{
	std::cerr << "Error: " << error << std::endl;
	return EXIT_FAILURE;
}

完整代码

#include <itkImage.h>
#include <itkImageFileReader.h>
#include <itkImageFileWriter.h>
#include <itkResampleImageFilter.h>
#include <itkAffineTransform.h>
#include <itkLinearInterpolateImageFunction.h>
#include <itkRescaleIntensityImageFilter.h>
#include <itkJPEGImageIOFactory.h>

int main()
{
	// 定义图像类型
	typedef itk::Image<unsigned char, 2> ImageType;
	typedef itk::ImageFileReader<ImageType> ReaderType;
	typedef itk::ImageFileWriter<ImageType> WriterType;

	// 注册JPEG格式支持
	itk::JPEGImageIOFactory::RegisterOneFactory();

	// 创建读取器和写入器
	ReaderType::Pointer reader = ReaderType::New();
	WriterType::Pointer writer = WriterType::New();

	// 设置要读取和写入的文件
	reader->SetFileName("test.jpg");
	writer->SetFileName("output_2x_resized.jpg");

	// 读取图像
	reader->Update();

	// 获取原始图像的大小和空间信息
	ImageType::Pointer inputImage = reader->GetOutput();
	ImageType::SpacingType inputSpacing = inputImage->GetSpacing();
	ImageType::SizeType inputSize = inputImage->GetLargestPossibleRegion().GetSize();

	// 计算输出图像的空间信息(将图像扩展为原来的2倍)
	ImageType::SpacingType outputSpacing;
	outputSpacing[0] = inputSpacing[0] / 2.0;  // 水平方向的间距缩小一半(像素数变成两倍)
	outputSpacing[1] = inputSpacing[1] / 2.0;  // 垂直方向的间距缩小一半

	ImageType::SizeType outputSize;
	outputSize[0] = inputSize[0] * 2;  // 水平方向的像素数扩展为两倍
	outputSize[1] = inputSize[1] * 2;  // 垂直方向的像素数扩展为两倍

	// 创建一个仿射变换,用于调整图像空间
	typedef itk::AffineTransform<double, 2> TransformType;
	TransformType::Pointer transform = TransformType::New();
	transform->SetIdentity();

	// 创建插值器(线性插值)
	typedef itk::LinearInterpolateImageFunction<ImageType, double> InterpolatorType;
	InterpolatorType::Pointer interpolator = InterpolatorType::New();

	// 创建重采样滤波器
	typedef itk::ResampleImageFilter<ImageType, ImageType> ResampleFilterType;
	ResampleFilterType::Pointer resampleFilter = ResampleFilterType::New();
	resampleFilter->SetInput(inputImage);
	resampleFilter->SetTransform(transform);
	resampleFilter->SetInterpolator(interpolator);
	resampleFilter->SetOutputSpacing(outputSpacing);
	resampleFilter->SetSize(outputSize);
	resampleFilter->SetOutputOrigin(inputImage->GetOrigin());
	resampleFilter->SetOutputDirection(inputImage->GetDirection());

	// 执行重采样
	try
	{
		resampleFilter->Update();
	}
	catch (itk::ExceptionObject &error)
	{
		std::cerr << "Error: " << error << std::endl;
		return EXIT_FAILURE;
	}

	// 保存输出图像
	writer->SetInput(resampleFilter->GetOutput());
	try
	{
		writer->Update();
	}
	catch (itk::ExceptionObject &error)
	{
		std::cerr << "Error: " << error << std::endl;
		return EXIT_FAILURE;
	}

	std::cout << "Image resized to 2x original size successfully!" << std::endl;
	return EXIT_SUCCESS;
}

测试效果 

       如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

标签:采样,itk,插值,resampleFilter,图像,include,ITK
From: https://blog.csdn.net/zhaitianbao/article/details/141923349

相关文章

  • 优化采样参数提升大语言模型响应质量:深入分析温度、top_p、top_k和min_p的随机解码策
    当向大语言模型(LLM)提出查询时,模型会为其词汇表中的每个可能标记输出概率值。从这个概率分布中采样一个标记后,我们可以将该标记附加到输入提示中,使LLM能够继续输出下一个标记的概率。这个采样过程可以通过诸如temperature和top_p等参数进行精确控制。但是你是否曾深入思......
  • GAMES202——作业4 Kulla-Conty BRDF(BRDF的预计算、重要性采样)
    目录任务实现    预计算E(µ)    预计算Eavg    Bonus1:重要性采样    在实时渲染中使用预计算数据结果任务        完成Kulla-ContyBRDF模型,关键在于计算BRDF的补偿项fms,而fms的计算需要E(µ)和......
  • 大语言模型的超参数含义: Top-P 采样; Top-P 采样;logit_bias:
    目录大语言模型的超参数含义 Top-P采样频率惩罚(FrequencyPenalty)top_k:logit_bias:top_logprobs:max_tokens:大语言模型的超参数含义 Top-P采样含义:一种采样替代方法,称为核采样。模型考虑top_p概率质量的token结果。例如,0.1表示仅考虑组成前10%概率质量的token......
  • 电流峰值采样电路分析
    一、前言  在一些电路控制中,采集电路中某部分的峰值电流做处理是非常有必要的,所谓的电流采样,本质上还是电压采样。接下来将介绍一种电流峰值采样电路。二.基本原理  最基本的原理是利用电容的充放电特性,基本电路如下图所示,当电源电压上升时,二极管导通给电容充电。电源电压......
  • 数仓之TABLESAMPLE采样
    前言在日常工作中,我们会对表中记录随机抽样然后探查,如何进行抽样就是本章要讲的重点。数仓中的抽样方法有很多,这里主要介绍一下:随机抽样、块抽样、桶抽样、分组抽样这四种,话不多说,直接上干货。随机抽样随机抽样就是给每行数据赋值一个随机数,排序之后进行抽样,主要分为:or......
  • mitk添加插件步骤
    一插件添加说明在MITK(MedicalImagingInteractionToolkit)中添加一个插件涉及多个步骤。以下是一个基本的指南,帮助你在MITK中添加插件:1.**设置开发环境**:  -确保已安装必要的开发工具,例如CMake和一个兼容的C++编译器。  -下载并构建MITK的源代码。这通......
  • mitk插件有哪些以及作用
    MITK(MedicalImagingInteractionToolkit)是一个用于医疗图像处理与交互的开源软件框架。它提供了一套丰富的插件,使其功能得到扩展和定制。以下是一些常见的MITK插件及其作用:1.**DICOM支持插件**:  -**作用**:提供对DICOM(DigitalImagingandCommunicationsinMedic......
  • mitk滤波算法有哪些以及应用场景
    一.mitk滤波算法有哪些MITK(MedicalImagingInteractionToolkit)提供了多种滤波算法用于医学图像处理。以下是一些常见的MITK滤波算法及其简要说明:1.高斯滤波(GaussianFilter)  -用途:平滑图像,减少噪声  -原理:使用高斯函数作为卷积核2.中值滤波(Median......
  • Vulkan入门系列17 - 多重采样( Multisampling)
    一:概述        我们的程序现在可以加载多个级别的纹理,从而解决了在渲染远离观察者的物体时出现的伪影问题。现在图像变得平滑多了,但仔细观察,你会发现绘制的几何图形边缘呈现锯齿状。这在我们早期渲染一个四边形的程序中尤为明显:        这种不希望有的效果......
  • 机器学习-过采样(全网最详解)
    相关介绍在逻辑回归中,处理不平衡数据集是一个重要的步骤,因为不平衡的数据集可能导致模型偏向于多数类,而忽略少数类。过采样(Over-sampling)是处理不平衡数据集的一种常用方法,它通过增加少数类样本的数量来平衡数据集。1.过采样的基本概念过采样是指对训练集中的少数类样本......