@TOC
1.概述
RGB(红、绿、蓝)是数字图像中常使用的一种彩色模型。RGB 表示的是使用三基色来分析人类肉眼所能分辨的可见光的代表彩色模型。
ITK
使用itk::RGBPixel
类型来支持一个RGB 色彩空间值的表示。此处的RGBPixel
类与itk::Vector
空间所包含的RGBPixel
类有着不同的含义。出于这个原因,RGBPixel
缺乏许多期望能对它做的操作。特别地,没有定义减法和加法的操作。
当你对两个RGB 类型的像素进行求“均值”操作时,假定在色彩空间中提供了两种颜色的中间颜色,可以用线性运算得到。不幸的是这在色彩空间中是不存在的,事实上它们是基于人的一种生理反应。
当你简单地用三基色来解释RGB 图像时,你最好使用itk::Vector
类型作为像素类型。这种方式下,你必须访问定义在向量空间的操作。在ITK
中RGBPixel
的当前实现是假定RGB 色彩图像是使用在期望色彩正常解释的应用中,因此RGBPixel
类只允许在色彩空间中进行有效的操作。
2.案例讲解
下面的例子阐述了在ITK 中如何表示RGB 图像。
基于ITK中的泛型编程提供的灵活性,可以实例化任意像素类型的图像。下面的例子说明了一个RGB彩色图像是如何定义的。
- 1.在
ITk
中有一个类用来支持RGB
像素类型。你也可以定义自己的像素类并用来实例化一个定制图像类型。为了使用itk::RGBPixel
类,必须包含头文件。#include "itkRGBPixel.h"
RGBPixel
类的模板化类型是用来表示红、绿和蓝像素元素。下面是这种模板类的一个典型实例:typedef itk::RGBPixel< unsigned char > PixelType;
- 2.然后将这个类型作为图像的像素模板参数:
typedef itk::Image< PixelType, 3 > ImageType;
这个图像类型可以用来对其它滤波器进行实例化。例如,一个itk::ImageFileReader
对象从文件中读取图像:typedef itk::ImageFileReader< ImageType > ReaderType;
- 3.现在可以使用
RGBPixel
类提供的方法来访问像素的色彩元素。
PixelType onePixel = image->GetPixel( pixelIndex );
PixelType::ValueType red = onePixel.GetRed();
PixelType::ValueType green = onePixel.GetGreen();
PixelType::ValueType blue = onePixel.GetBlue();
由于itk::RGBPixel
从itk::FixedArray
类继承了[]
操作,所以也可以使用分索引符号:
red = onePixel[0]; // extract Red component
green = onePixel[1]; // extract Green component
blue = onePixel[2]; // extract Blue component
std::cout << "Pixel values:" << std::endl;
std::cout << "Red = "
<< itk::NumericTraits<PixelType::ValueType>::PrintType(red)
<< std::endl;
std::cout << "Green = "
<< itk::NumericTraits<PixelType::ValueType>::PrintType(green)
<< std::endl;
std::cout << "Blue = "
<< itk::NumericTraits<PixelType::ValueType>::PrintType(blue)
<< std::endl;
3.代码样例
#include "itkImage.h"
#include "itkImageFileReader.h"
//为了使用 itk::RGBPixel 类,包含头文件
#include "itkRGBPixel.h"
#include <itkJPEGImageIOFactory.h>
//在 ITK 中如何表示 RGB 图像。
int main(int, char * argv[])
{
//RGBPixeld 类的使用是基于用来代表红、绿和蓝的像素成分的类型之上的
//定义RGBPixel类型的PixelType对象
typedef itk::RGBPixel< unsigned char > PixelType;
//然后将这个类型PixelType对象作为图像中的像素模板参数,得到ImageType对象
typedef itk::Image< PixelType, 3 > ImageType;
//显示说明读取图片类型
itk::ObjectFactoryBase::RegisterFactory(itk::JPEGImageIOFactory::New());
//使用itk::ImageFileReader 对象从文件中读取图像
typedef itk::ImageFileReader< ImageType > ReaderType;
//实例化ReaderType的读取对象reader
ReaderType::Pointer reader = ReaderType::New();
//设置RGB图像索引
const char * const filename = "lena.jpg";
//图像读取
reader->SetFileName(filename);
reader->Update();
//reader读取到的图像数据输出到image
ImageType::Pointer image = reader->GetOutput();
const ImageType::IndexType pixelIndex = { {25,35,0} };
//使用 RGBPixel 类提供的方法来执行对像素色彩成分的访问
PixelType onePixel = image->GetPixel(pixelIndex);
PixelType::ValueType red = onePixel.GetRed();//提取红色部分
PixelType::ValueType green = onePixel.GetGreen();//提取绿色部分
PixelType::ValueType blue = onePixel.GetBlue();//提取蓝色部分
// Software Guide : EndCodeSnippet
std::cout << "method1" << std::endl;
std::cout << "Pixel values from GetRed,GetGreen,GetBlue:" << std::endl;
std::cout << "Red = "
<< itk::NumericTraits<PixelType::ValueType>::PrintType(red)
<< std::endl;
std::cout << "Green = "
<< itk::NumericTraits<PixelType::ValueType>::PrintType(green)
<< std::endl;
std::cout << "Blue = "
<< itk::NumericTraits<PixelType::ValueType>::PrintType(blue)
<< std::endl << std::endl;
//由于 itk::RGBPixel 从 itk::FixedArray 类继承了 [ ] 操作
//以下方法也可执行对像素色彩成分的访问
red = onePixel[0]; // extract Red component
green = onePixel[1]; // extract Green component
blue = onePixel[2]; // extract Blue component
std::cout << "method2" << std::endl;
std::cout << "Pixel values:" << std::endl;
std::cout << "Red = "
<< itk::NumericTraits<PixelType::ValueType>::PrintType(red)
<< std::endl;
std::cout << "Green = "
<< itk::NumericTraits<PixelType::ValueType>::PrintType(green)
<< std::endl;
std::cout << "Blue = "
<< itk::NumericTraits<PixelType::ValueType>::PrintType(blue)
<< std::endl;
return EXIT_SUCCESS;
}
4.结果
5.参考目录
https://blog.csdn.net/qq_32809093/article/details/116886237