【发布时间】:2019-04-22 21:52:32
【问题描述】:
我正在尝试使用 webgl 为图像实现直方图。 我可以在 javascript HTML5 Canvas 中做到这一点,方法是获取一个长度为 255 的数组,并将每个索引的像素值增加到 0-255,并使用 createLinearGradient 创建一个直方图。
for(var c = 0; c < 256; c++){
histogram[c] = 0;
}
var ctx = document.getElementById('canvas').getContext('2d');
var pixels= ctx.getImageData(0, 0, width, height).data;
for (var i = 0, j = 0; i < u8a.length; i++, j = j + 4) {
histogram[pixels[j]]++; //increasing pixel index for histogram
}
为了在 WebGL 中实现相同的功能,我指的是 jsfiddle,但我看到的是直方图不平滑且未排序。
所以,我在使用 WebGL 时遇到了两件事:
-在上面提到的小提琴中,我们如何将像素值从 0.0(0) 到 1.0(255) 排序?
-如何在有/没有线性梯度的情况下使webgl中的直方图平滑?
代码:
precision mediump float;
uniform sampler2D u_histTexture;
uniform vec2 u_resolution;
uniform sampler2D u_maxTexture;
void main() {
// get the max color constants
vec4 maxColor = texture2D(u_maxTexture, vec2(0));
// compute our current UV position
vec2 uv = gl_FragCoord.xy / u_resolution;
// Get the history for this color
// (note: since u_histTexture is 256x1 uv.y is irrelevant
vec4 hist = texture2D(u_histTexture, uv);
// scale by maxColor so scaled goes from 0 to 1 with 1 = maxColor
vec4 scaled = hist / maxColor;
// 1 > maxColor, 0 otherwise
vec4 color = step(uv.yyyy, scaled);
float rr = 0.2989 * color.r + 0.5870 * color.g + 0.1140 * color.b;
gl_FragColor = vec4(rr, rr, rr, 1);
}
【问题讨论】:
-
??对直方图进行排序!,如果已排序,则不是真正的直方图。无论如何,您的问题很不清楚,平滑和排序是什么意思?您能否提供您想要的图像,包括未排序和排序的直方图,因为很难猜出您的意思?
-
从排序我的意思是它应该以灰度格式从最暗到最亮(从黑色到白色)呈现 0.0 到 1.0。我将很快添加预期的图像
-
已添加图片,请检查,我目前正在使用 Html5 Canvas 的 createLinearGradient 来获取此结果
-
要创建渐变,将最后一行更改为
gl_FragColor = vec4(rr, rr, rr, 1.0) * vec4(uv.xxx,1.0);,它将颜色乘以x位置(0-1)至于排序,您的意思还不清楚。 -
好的,我尝试了您的更改,看起来不错。谢谢。对于排序的事情,请检查我添加的图像,它从较深的阴影开始到较浅的阴影。希望这很清楚。
标签: opengl-es html5-canvas webgl linear-gradients