如何最好地接近局部阈值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 Matrix Camera 控件,局部旋转无法正常工作
IOS OpenGL ES GPUImage 图像阈值边缘检测GPUImageThresholdEdgeDetectionFilter