首页 > 解决方案 > 如何使用 GIMP 防止色带?

问题描述

只需在 python GIMP 中做一个简单的 bump_map 操作。但结果有色带!

import os, glob, sys, time
from gimpfu import *

image = pdb.gimp_file_load(img_path, img_path, run_mode=RUN_NONINTERACTIVE)
gray = pdb.gimp_file_load(gray_path, gray_path, run_mode=RUN_NONINTERACTIVE)

pdb.plug_in_bump_map(image, image.active_layer, gray.active_layer, 
    135.0, 20.00, 30, 0, 0, 0.0, 0.0, 1, 0, 0)
pdb.file_png_save_defaults(image, image.active_layer, out_path, out_path)

如果我删除“plug_in_bump_map”操作,我保存的最终结果中没有色带。如果我对灰度图像应用高斯模糊,最终结果中的色带会消失,但会留下不希望的模糊,我该怎么办?所有图像均为PNG。

条带示例 示例二

标签: imageimage-processinggimppython-fubump-mapping

解决方案


好的,所以它是条带:)

但是如果你仔细观察,你会发现条纹已经在你的凹凸贴图中,并且是不可避免的,因为你的 PNG 中只有 256 个级别。

当两个均匀区域之间的值发生显着变化且它们之间具有某种线性边界时,就会出现条带化。所以这两个缓解措施是

  • 在边界周围传播变化:
    • 更高精度的图像,因此变化可以小于 1/256
    • 模糊图像
  • 使边界与眼睛非线性(传播噪声)
  • 抖动,两者都有一点作用,因为它引入了中间值,但随机放置它们。

解决问题的最佳方法是在源头上,因此,如果 openCV 可以计算超过 256 个级别,请执行此操作并以某种高位深度格式导出凹凸图(16 位/通道 PNG 就足够了,否则为 TIFF)。

否则,如果您必须从 8 位凹凸贴图开始:

  1. 在 Gimp 中加载
  2. 转换为高精度(32bit FP 线性)
  3. 如果您查看此时的直方图,您仍然只有 256 个值:

之前的直方图

  1. 然后,您可以使用 RGB 噪声过滤器添加“抖动”以扩展值以填补空白。最好使用直方图对话框来完成,并提高值直到“梳子”结构几乎消失:

RGB 噪点设置 直方图噪声

  1. 您还可以使用传播噪声来稍微“摇动像素”(2-3px),这样过渡的线性度就会降低,因此不太明显:

传播噪音

  1. 然后,您可以应用凹凸贴图。你用条带换取一点颗粒感:

凹凸映射

  1. 您可以使用中值模糊来减少颗粒感,而不必使用会使图像失去太多清晰度的值。

中值模糊

也可以用选择性高斯模糊代替步骤 4 和 5。

编辑:尝试了您的 16bpc:

  1. 提升到 32bit FP 线性
  2. 应用凹凸贴图而不进行预处理

“本机”结果已经好多了:

直接 16bpc 凹凸映射

它可以通过以下方式改进:

  1. 阈值为 0 的“flats”颜色的颜色选择
  2. 选择性高斯模糊

16Bps凹凸图+选择性高斯


推荐阅读