如何使用 GIMP 防止色带?
How to prevent Color Banding with 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。
好的,所以它是条带 :)
但是如果你仔细观察,你的凹凸贴图中已经出现了条纹,这是不可避免的,因为你的 PNG 中只有 256 个级别。
当两个均匀区域之间的值发生显着变化且它们之间具有某种线性边界时,就会出现条带。所以这两个缓解措施是
- 在边界周围散布零钱:
- 更高精度的图像,所以变化可以小于1/256
- 模糊图像
- 使边框对眼睛来说是非线性的(散布噪声)
- 抖动,两者兼而有之,因为它引入了中间值,但将它们随机放置。
解决问题的最佳方法是从源头上解决问题,因此如果 openCV 可以在超过 256 个级别上进行计算,请让它这样做并以某种高位深度格式导出凹凸贴图 (16-bit/channel PNG 就足够了,否则 TIFF)。
否则,如果您必须从 8 位凹凸贴图开始:
- 在 Gimp 中加载
- 转换为高精度(32 位 FP 线性)
- 如果您查看此时的直方图,您仍然只有 256 个值:
- 然后您使用 RGB 噪声过滤器添加“抖动”以分散值以填充间隙。这最好通过打开直方图对话框来完成,并增加值直到“头发梳”结构几乎消失:
- 您还可以使用 Spread noise 来稍微“抖动像素”(2-3px),这样过渡就不会那么线性,也不会那么明显了:
- 然后您可以应用凹凸贴图。您用条带交换了一点颗粒感:
- 您可以使用中值模糊减少颗粒感,而不必使用会使图像失去太多清晰度的值。
也可以用选择性高斯模糊代替步骤 4 和 5。
编辑:尝试了您的 16bpc:
- 提升为 32 位 FP 线性
- 应用凹凸贴图而不进行预处理
“原生”结果已经好很多:
可以通过以下方式改进:
- 阈值为 0 的“平面”颜色的颜色选择
- 选择性高斯模糊
只是在 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。
好的,所以它是条带 :)
但是如果你仔细观察,你的凹凸贴图中已经出现了条纹,这是不可避免的,因为你的 PNG 中只有 256 个级别。
当两个均匀区域之间的值发生显着变化且它们之间具有某种线性边界时,就会出现条带。所以这两个缓解措施是
- 在边界周围散布零钱:
- 更高精度的图像,所以变化可以小于1/256
- 模糊图像
- 使边框对眼睛来说是非线性的(散布噪声)
- 抖动,两者兼而有之,因为它引入了中间值,但将它们随机放置。
解决问题的最佳方法是从源头上解决问题,因此如果 openCV 可以在超过 256 个级别上进行计算,请让它这样做并以某种高位深度格式导出凹凸贴图 (16-bit/channel PNG 就足够了,否则 TIFF)。
否则,如果您必须从 8 位凹凸贴图开始:
- 在 Gimp 中加载
- 转换为高精度(32 位 FP 线性)
- 如果您查看此时的直方图,您仍然只有 256 个值:
- 然后您使用 RGB 噪声过滤器添加“抖动”以分散值以填充间隙。这最好通过打开直方图对话框来完成,并增加值直到“头发梳”结构几乎消失:
- 您还可以使用 Spread noise 来稍微“抖动像素”(2-3px),这样过渡就不会那么线性,也不会那么明显了:
- 然后您可以应用凹凸贴图。您用条带交换了一点颗粒感:
- 您可以使用中值模糊减少颗粒感,而不必使用会使图像失去太多清晰度的值。
也可以用选择性高斯模糊代替步骤 4 和 5。
编辑:尝试了您的 16bpc:
- 提升为 32 位 FP 线性
- 应用凹凸贴图而不进行预处理
“原生”结果已经好很多:
可以通过以下方式改进:
- 阈值为 0 的“平面”颜色的颜色选择
- 选择性高斯模糊