RGB LUT 到灰度 - 红外成像

RGB LUT to grayscale - IR Imaging

我的工作需要将JPG中的伪彩RGB值替换成灰度进行处理。 'color' 图像具有特定范围的 RGB 颜色(20 或 255,取决于来源)需要链接到灰度值以便对输出图像进行一些测量。 使用原始 RGB 值非常困难,因为指定的范围只能在 PNG 或 tiff 格式中正常工作,但转换为 JPG 会创建一些 RGB 值,这些值与预期的 RGB 值有点偏离,这使我现有的分析变得毫无用处.

我在其中一个答案中找到了这段不错的代码,作为将某个点的颜色四舍五入到字典中最接近的相似颜色的解决方案。

def distance(c1, c2):
   (r1,g1,b1) = c1
   (r2,g2,b2) = c2
   return math.sqrt((r1 - r2)**2 + (g1 - g2) ** 2 + (b1 - b2) **2)

colors = list(rgb_code_dictionary.keys())
closest_colors = sorted(colors, key=lambda color: distance(color, point))
closest_color = closest_colors[0]
code = rgb_code_dictionary[closest_color]

rgb_code_dictionary 替换为 rgb 值的字典以及我想应用的相应灰度值。

这真的很棒,它产生了我需要的输出。 但是,如果将此代码应用于完整图像(每张图像只需要 18 秒,但我有几千张图像要处理),此代码会非常慢,因为我需要将每个像素提供给函数以获得最接近的匹配。

我发现了另一段代码,可以非常快速地替换颜色:

# Extract color codes and their IDs from input dict
colors = np.array(_color_codes.keys())
color_ids = np.array(_color_codes.values())

# Initialize output array
result = np.empty((img_arr.shape[0],img_arr.shape[1]),dtype=int)
result[:] = -1

# Finally get the matches and accordingly set result locations
# to their respective color IDs
R,C,D = np.where((img_arr == colors[:,None,None,:]).all(3))
result[C,D] = color_ids[R]

但是只有当字典中的 RGB 值与图像中的 RGB 值完全匹配时,这个方法才有效。理想情况下,我会将两者合并在一起,以获得快速可靠的功能来替换颜色。 但是我在将第一段代码翻译成 numpy 中的 "where" 语句时遇到问题,以加快将 RGB 值与灰度值交换的整个过程。

由于我不是受过教育的程序员(而且对 python 来说确实是个新手),所以我不知道如何解决这个问题。在许多论坛上搜索并没有帮助找到一个好的解决方案(我理解并且可以自己实施),因此我的问题。

是否有功能可以满足我的需求?或者有没有办法将这 2 个函数合并为一个,以便转换既快速又正确?

非常感谢任何帮助(但如果可能,请保持简单一点:-))

谢谢

已编辑: 我最终得到了另一种解决方案,因为我在安装 Mark Setchell 提出的解决方案时遇到了一些困难。 我非常相信使用 ImageMAgick 是解决我的特定问题的最佳解决方案,很遗憾,由于我 PC 上的安全设置,我无法安装该解决方案。

我想出的解决方案基本上是将彩色图像转换为灰度,然后将另一个灰度值应用于每个像素,其中新灰度将跨越旧灰度值的 +/- 6 个灰度值。 (例如,从 242 到 255 的所有内容都将替换为 255) 这个解决方案并不能真正快速地工作,也不能提供最好的结果,但目前这似乎是在不久的将来可行的。

感谢您的回答,它帮助我重新思考了这个过程。

为什么不为此使用 PIL 库:

greyImage = Image.open(colorImageName).convert('L')

'L'代表亮度。

像素数据可通过 getdata() 方法获得。

嗯...JPEG 很少是 "data" 类型图像的好选择,因为其固有的损耗 - 总是更喜欢 PNGTIFF,或者为了最简单,古老的 NetPBM 格式(PGMPPMPAM)和 PFM for float.

无论如何,您可以在命令行使用 ImageMagick 非常快速地重新映射图像,而无需编码,大多数 Linux 发行版都安装了它,并且也适用于 macOS 和 Windows.

因此,将所需颜色(仅一行像素)的字典保存为名为 LUT.pngPNG 文件(查找 Table)。我将使用 ImageMagick 制作一个带有红色、柠檬绿、蓝色、黑色和白色的小图案,向您展示它的外观:

convert xc:red xc:lime xc:blue xc:white xc:black +append LUT.png

旁白:如果您的 Look Up Table 颜色是 RGB 三元组,而不是命名颜色,您可以像这样使用它们:

convert xc:"rgb(255,0,0)" xc:"rgb(0,255,0)" xc:"rgb(0,0,255)" +append LUT.png

现在拍一张你的照片,憨豆先生说:

并将包含的颜色映射到查找 table:

convert MrBean.jpg +dither -map LUT.png result.png

请注意,从 ImageMagickv7 开始,convert 命令变为 magick,即:

magick MrBean.jpg +dither -map LUT.png result.png

如果您有成百上千的事情要做,您可以使用 GNU ParallelGNU 并行CPU 那些可爱的 CPU 核心并行完成它们=69=]:

parallel convert {} +dither -map LUT.png {.}.png ::: *.jpg

其中:

  • {}表示当前正在处理的文件,而
  • {.} 表示没有扩展名的文件,
  • :::表示要处理的文件名的开头

显然,在使用 Internet 上陌生人建议的任何内容之前,先进行备份并只处理数据的子集 ;-)