c++ - 如何在 C++ 中创建伪彩色图像?

标签 c++

我有一个具有关联强度(作为 0 和 1 之间的 float )的像素数组,我想将其转换为 RGB 图像。

最简单的方法是将每个值乘以 255 并将其分配给 R+G+B 以获得灰度图像,但我认为最好使用整个颜色范围来显示更细微的差异。

据我所知,这称为伪/假彩色图像,但我很难找到它的算法。现在我正在使用这段代码,但我想知道是否有更聪明/更快的方法来做到这一点:

 if(intensity <= 0.25) {
  p->r = 0;
  p->g = 0;
  p->b = (intensity) * 4 * 255;
  return;
 }

 if(intensity <= 0.5) {
  p->r = 0;
  p->g = (intensity - 0.25) * 4 * 255;
  p->b = 255;
  return;
 }

 if(intensity <= 0.75) {
  p->r = 0;
  p->g = 255;
  p->b = (0.75 - intensity) * 4 * 255;
  return;
 }

 if(intensity <= 1.0) {
  p->r = (intensity - 0.75) * 4 * 255;
  p->g = (1.0 - intensity) * 4 * 255;
  p->b = 0;
  return;
 }

此外,我应该为此使用任何标准调色板吗?

最佳答案

您可以改用HSV 或HSL

尝试使用 0 到 1 的值来设置色调,并使用饱和度和值的常量。您会发现大量用于将 HSV 值转换为 RGB 值的示例代码。

http://en.wikipedia.org/wiki/HSL_and_HSV

当您看到“人造颜色”图像时,通常使用的就是这种颜色。好处是图像的所有区域都是明亮的,图像的“暗”部分只是呈现出不同的颜色。

如果您使用 HSL,您还可以将大部分 0-1 范围的亮度设置为 50%,但允许它在接近尾声时上升(例如从 0.9 到 1),这将有助于带来非常强烈的效果图像的某些部分变为白色。

另一种选择是使用伪调色板。在这里,您只需创建一个 8 位图像,并为其创建一个适合您需要的调色板。这些有一些很好的例子 here...

关于c++ - 如何在 C++ 中创建伪彩色图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3863985/

相关文章:

c++ - UTF-8 字符串的大小(以字节为单位)

c++ - 使用模板c++的友元函数语法错误

c++ - 用于散列密码的随机数生成器

c++ - 使用 getline 从文本文件中读取

c# - 相当于C#中的sscanf_s?

c++ - 为什么 std::vector 是连续的?

c++ - DHT22和GPIO如何工作?

c++ - 多GPU模式下的tensorflow c++ SetDefaultDevice

c++ - 如何在Qt中播放QByteArray中的声音

c++ - c++ 编译的 makefile 未运行