こんにちは、openGL ES2.0 を使用して画像リターゲティング アルゴリズムを実装しようとしています。このアルゴリズムは、最初にソーベル フィルターを使用し、次に画像の差分を使用してエッジをチェックし、次にモーションをそれぞれチェックします。次に、これらの値を使用して、画像から削除できるピクセルを決定するマトリックスを作成します。ここまでソーベルフィルターとフラグメントシェーダーを使った画像差分を実装してきました。エッジ マップとモーション マップを取得したら、2 つの値を追加して 0 と 1 の間で正規化します。次に、この正規化されたマトリックスに対して再びソーベル フィルターを実行する必要があります。しかし、それをテクスチャ メモリに保存して、テクスチャとして再度ロードできるかどうかはわかりません。または、これらの値を画像と同じサイズのマトリックスに保存する必要がありますか? GLSLを使用してそれを行うにはどうすればよいですか? (私は GLSL の初心者です。これはばかげた質問かもしれません :p)
ここにフラグメントシェーダーがあります:
precision mediump float;
varying vec2 coordVar;
uniform sampler2D s_baseMap;
uniform sampler2D s_lightMap;
void main()
{
vec4 baseColor;
float basemono;
vec4 lightColor;
float lightmono;
float diffmap;
baseColor = texture2D( s_baseMap, coordVar );
lightColor = texture2D( s_lightMap, coordVar );
//######TEMPORAL SALIENCY MAP#########
basemono = baseColor .r * 0.299 + baseColor .g * 0.587 + baseColor .b * 0.114;
lightmono = lightColor.r * 0.299 + lightColor.g * 0.587 + lightColor.b * 0.114;
diffmap = basemono - lightmono;
//######## SPATIAL SALIENCY MAP #######
float pixelHSobel;
float pixelVSobel;
float pixel;
mat3 sobelHoriz = mat3(
0.125, 0.250, 0.125,
0.000, 0.000, 0.000,
-0.125,-0.250,-0.125);
mat3 sobelVert = mat3(
-0.125, 0, 0.125,
-0.250, 0, 0.250,
-0.125, 0, 0.125);
float stepH = 1.0/800.0;
float stepV = 1.0/600.0;
float tmp1;
float tmp2;
float tmp3;
float tmp4;
float tmp5;
float tmp6;
float tmp7;
float tmp8;
float tmp9;
// ####### Horizontal Sobel ######
tmp1 = texture2D(s_baseMap, coordVar.st + vec2(-stepH, stepV)).r * sobelHoriz[0][0];
tmp3 = texture2D(s_baseMap, coordVar.st + vec2(stepH, stepV)).r * sobelHoriz[2][0];
tmp4 = texture2D(s_baseMap, coordVar.st + vec2(-stepH, 0.0)).r * sobelHoriz[0][1];
tmp6 = texture2D(s_baseMap, coordVar.st + vec2(stepH,0.0)).r *sobelHoriz[2][1];
tmp7 = (texture2D(s_baseMap, coordVar.st + vec2(-stepH, -stepV)).r *sobelHoriz[0][2]);
tmp9 = (texture2D(s_baseMap, coordVar.st + vec2(stepH, -stepV)).r *sobelHoriz[2][2]);
pixelHSobel = tmp1+tmp3 + tmp4 + tmp6+ tmp7 + tmp9 + 0.5;
// ####### Vertical Sobel #######
tmp1 = texture2D(s_baseMap, coordVar.st + vec2(-stepH, stepV)).r * sobelVert[0][0];
tmp2 = texture2D(s_baseMap, coordVar.st + vec2(0.0, stepV)).r * sobelVert[1][0];
tmp3 = texture2D(s_baseMap, coordVar.st + vec2(stepH, stepV)).r * sobelVert[2][0];
tmp4 = texture2D(s_baseMap, coordVar.st + vec2(-stepH, 0.0)).r * sobelVert[0][1];
tmp5 = texture2D(s_baseMap, coordVar.st + vec2(0.0, 0.0)).r *sobelVert[1][1];
tmp6 = texture2D(s_baseMap, coordVar.st + vec2(stepH,0.0)).r *sobelVert[2][1];
tmp7 = (texture2D(s_baseMap, coordVar.st + vec2(-stepH, -stepV)).r *sobelVert[0][2]);
tmp8 = (texture2D(s_baseMap, coordVar.st + vec2(0.0, -stepV)).r *sobelVert[1][2]);
tmp9 = (texture2D(s_baseMap, coordVar.st + vec2(stepH, -stepV)).r *sobelVert[2][2]);
pixelVSobel = tmp1 + tmp2 + tmp3 + tmp4 + tmp5 + tmp6 + tmp7 + tmp8 + tmp9 + 0.5;
pixel = (sqrt(pixelVSobel*pixelVSobel +pixelHSobel*pixelHSobel));
if (pixel <= 0.715)
{
pixel=0.0;
}
else
{
pixel=1.0;
}
// ###########IMPORTANCE MATRIX###########
float impmap = (pixel+diffmap)/2.0;
// ########## display ######
gl_FragColor = vec4(impmap,impmap,impmap,1.0);
どういうわけか、画像 impmap で sobel フィルターを実行する必要があります。