如何最好地接近局部阈值opengl函数

Posted

技术标签:

【中文标题】如何最好地接近局部阈值opengl函数【英文标题】:How best to approach a localised thresholding opengl function 【发布时间】:2012-01-29 14:02:08 【问题描述】:

我想拍一些文字的照片,让文字更容易阅读。棘手的部分是初始照片可能有暗区和亮区,我希望 opengl 函数能够增强所有这些区域的文本。

这是一个例子。最上面是原图。底部是处理后的图像。

[编辑] 我已经添加了一个更好的示例图片来说明正在发生的事情。我能够增强文本,但在我没有文本的区域,这种简单的阈值处理会产生斑点噪声(图像左下角)。 如果我回退阈值,那么我会丢失较暗区域(右下角)的文本。

目前,处理后的图像只拾取部分文本,而不是所有文本。我使用的原始算法非常简单: - 在当前像素周围采样 8 个像素(大约 4-5 远的像素似乎效果最好) - 从这个样本中找出最亮和最暗的像素 - 如果当前像素更接近最暗阈值,则变黑,反之亦然

这似乎对围绕文本非常有效,但是当涉及到非文本时,它提供了一个非常嘈杂的图像(即使我提供了初始拒绝阈值)

我修改了这个算法,假设文本总是接近黑色。这提供了上面的底部图像,但我再次无法提取出我想要的所有文本功能。

【问题讨论】:

您想为该任务使用 OpenGL GLSL 着色器还是...?当问题正文中从未提及 OpenGL 时,仅通过 OpenGL 标记很难说。 嗨,我在 ios 和 GLSL 过滤器上使用 OpenGL ES。我上面描述的算法是一个内核例程。很抱歉造成混乱。 我添加了一个更好的示例图片来说明正在发生的事情。我能够增强文本,但在我没有文本的区域,这种简单的阈值处理会产生斑点噪声(图像左下角)。如果我回退阈值,那么我会丢失较暗区域(右下角)的文本。 【参考方案1】:

在将其作为程序实现之前,您可能需要拍摄源照片并在 GIMP 或其他编辑器中使用它,看看您能做什么。

处理阴影的一种方法是在阈值化之前运行高通滤波器。

这就是您在图像编辑器中的操作方式(手动,没有“高通”过滤器插件): 1. 将图像转灰度并保存到“layer_A” 2.将“layer_A”复制到“Layer_B” 3. 在“Layer_B”中反转颜色 4. 半径大于您要保留的最大特征的高斯模糊“Layer_B”。 (模糊半径大于字母) 5.将“Layer_A”与“Layer_B”合并,其中result = "Layer_A" * 0.5 + "Layer_B" * 0.5。 6. 增加生成图像的对比度。 7. 运行阈值。


在 opengl 中,它将以相同的方式完成(并且没有多层)

它不适用于强烈/清晰的阴影(显然),但它会消除由于页面弯曲等而出现的巨大平滑阴影。

该技术(高通滤镜)经常用于制作无缝纹理,您应该可以通过 google 找到几个这样的教程和其他信息(GIMP 无缝纹理高通 GIMP 高通)。

顺便说一句,如果您想提高“可读性”,那么您可能希望保持灰度(同时提高对比度)而不是将其转换为“黑白”(1 位颜色)。锋利的字母边缘使文本更难阅读。

【讨论】:

【参考方案2】:

感谢您的帮助。

最后我选择了一个相当基本的方法。 取 8 个附近像素的样本,确定最大值和最小值。确定局部阈值(最大值 - 最小值)。那么

smooth = dot(vec3(1.0/3.0), smoothstep(currentMin, currentMax, p11).rgb);
smooth = (localthreshold < threshold) ? 1.0 : smooth;
return vec4(smooth, smooth, smooth, 1);

这并不能很好地显示暗区和亮区的文本,这是理想的,但它很好地清理了亮区的文本。

迈克

【讨论】:

以上是关于如何最好地接近局部阈值opengl函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 OpenGL/GLSL 中对特定颜色进行阈值处理

opengl导入一个3维物体,如何修改其局部坐标系?

OpenGL Matrix Camera 控件,局部旋转无法正常工作

IOS OpenGL ES GPUImage 图像阈值边缘检测GPUImageThresholdEdgeDetectionFilter

哪有opengl所有函数的列表?

如何在 OpenGL 中绘制圆弧