【问题标题】:Cropping an 8-bit bitmap by its palette information通过调色板信息裁剪 8 位位图
【发布时间】:2012-06-08 11:04:24
【问题描述】:

我目前正在使用 C++ 读取我的 8 位位图并保存其像素数据和颜色表。我目前将颜色表存储在一个数组中:

RGBQUAD* colours;

我想知道如何在所有方向上找到最近的唯一像素颜色并将位图裁剪到该像素。我正在使用没有任何外部库的 C++。

【问题讨论】:

  • 我被告知转换为灰度然后使用边缘检测算法将是实现这一目标的最佳方法。有人可以对此发表看法吗?

标签: c++ image colors color-palette


【解决方案1】:

我建议使用现成的库,例如ImageMagick,而不是尝试重新实现那个特定的轮子。

只有两个原因可以实现在其他地方已经实现得很好的东西:1) 家庭作业,或 2) 你认为你实际上可以比现有代码做得更好。

不能是1)因为没有“作业”标签,也不能是2)因为你不用问,那么……

【讨论】:

  • @Aequitas: ...但除非你告诉人们为什么你坚持重新发明轮子,否则人们会继续告诉你,“使用轮子”。 ;-)
  • 我只是想在不使用库的情况下尽可能多地了解较低级别的图像处理。将来,我肯定会使用图书馆,但首先我想自己做一些事情来了解他们是如何实现的。
  • @Aequitas:那么请随意将其标记为[homework];该标签还包括自学。
【解决方案2】:

“最近的唯一像素颜色”是指颜色空间中最近的?是绝对意义上的(R/G/B)还是人类意义上的?那么,鉴于#0002FE,您可能会在您的颜色表中找到#0000FF

“标准”的简单 C++ 方法是 std::min_element(),它接受一个范围和一个谓词。在您的情况下,该范围是您的颜色表,谓词是您想要的颜色的接近度。例如。 [targetColor](RGBQUAD tableEntry) { return abs(RGBdiff(tableEntry, targetColor)); }

【讨论】:

  • @Aequitas:这要困难得多。谷歌搜索“色差感知”会告诉你这是一个正在进行的研究的主题。一种简单的方法是实现RGBdiff,对两种颜色进行CIELAB 转换,然后在Lab 空间中进行简单的区别。
猜你喜欢
  • 2019-05-10
  • 2015-12-11
  • 2013-03-25
  • 2011-03-12
  • 1970-01-01
  • 2015-05-05
  • 1970-01-01
  • 1970-01-01
  • 2012-11-08
相关资源
最近更新 更多