Remove (obsolete) filters from ImageProcessingShader

This shader is now only for Color correction
This commit is contained in:
Bruno Herbelin
2022-05-07 23:15:35 +02:00
parent f7da3a347d
commit 6b9795fe96
6 changed files with 6 additions and 213 deletions

View File

@@ -398,15 +398,6 @@ void ImGuiVisitor::visit(ImageProcessingShader &n)
if (ImGui::Combo("Invert", &n.invert, "None\0Color RGB\0Luminance\0")) if (ImGui::Combo("Invert", &n.invert, "None\0Color RGB\0Luminance\0"))
Action::manager().store("Invert " + std::string(n.invert<1 ? "None": (n.invert>1 ? "Luminance" : "Color"))); Action::manager().store("Invert " + std::string(n.invert<1 ? "None": (n.invert>1 ? "Luminance" : "Color")));
// if (ImGuiToolkit::IconButton(1, 7)) {
// n.filterid = 0;
// Action::manager().store("Filter None");
// }
// ImGui::SameLine(0, IMGUI_SAME_LINE);
// ImGui::SetNextItemWidth(IMGUI_RIGHT_ALIGN);
// if (ImGui::Combo("Filter", &n.filterid, ImageProcessingShader::filter_names, IM_ARRAYSIZE(ImageProcessingShader::filter_names) ) )
// Action::manager().store("Filter " + std::string(ImageProcessingShader::filter_names[n.filterid]));
ImGui::PopID(); ImGui::PopID();
ImGui::Spacing(); ImGui::Spacing();

View File

@@ -25,9 +25,6 @@
ShadingProgram imageProcessingShadingProgram("shaders/image.vs", "shaders/imageprocessing.fs"); ShadingProgram imageProcessingShadingProgram("shaders/image.vs", "shaders/imageprocessing.fs");
const char* ImageProcessingShader::filter_names[12] = { "None", "Blur", "Sharpen", "Edge", "Emboss", "Denoising",
"Erosion 3x3", "Erosion 5x5", "Erosion 7x7", "Dilation 3x3", "Dilation 5x5", "Dilation 7x7" };
ImageProcessingShader::ImageProcessingShader(): Shader() ImageProcessingShader::ImageProcessingShader(): Shader()
{ {
@@ -48,7 +45,6 @@ void ImageProcessingShader::use()
program_->setUniform("lumakey", lumakey); program_->setUniform("lumakey", lumakey);
program_->setUniform("nbColors", nbColors); program_->setUniform("nbColors", nbColors);
program_->setUniform("invert", invert); program_->setUniform("invert", invert);
program_->setUniform("filterid", filterid);
program_->setUniform("gamma", gamma); program_->setUniform("gamma", gamma);
program_->setUniform("levels", levels); program_->setUniform("levels", levels);
@@ -70,7 +66,6 @@ void ImageProcessingShader::reset()
lumakey = 0.f; lumakey = 0.f;
nbColors = 0; nbColors = 0;
invert = 0; invert = 0;
filterid = 0;
gamma = glm::vec4(1.f, 1.f, 1.f, 1.f); gamma = glm::vec4(1.f, 1.f, 1.f, 1.f);
levels = glm::vec4(0.f, 1.f, 0.f, 1.f); levels = glm::vec4(0.f, 1.f, 0.f, 1.f);
chromakey = glm::vec4(0.f, 0.8f, 0.f, 0.f); chromakey = glm::vec4(0.f, 0.8f, 0.f, 0.f);
@@ -88,7 +83,6 @@ void ImageProcessingShader::copy(ImageProcessingShader const& S)
lumakey = S.lumakey; lumakey = S.lumakey;
nbColors = S.nbColors; nbColors = S.nbColors;
invert = S.invert; invert = S.invert;
filterid = S.filterid;
gamma = S.gamma; gamma = S.gamma;
levels = S.levels; levels = S.levels;
chromakey = S.chromakey; chromakey = S.chromakey;

View File

@@ -31,13 +31,6 @@ public:
// chroma key // chroma key
glm::vec4 chromakey; glm::vec4 chromakey;
float chromadelta; float chromadelta;
// filter identifyer
// [0] No filter
// [1 4] 4 x kernel operations; Blur, Sharpen, Edge, Emboss
// [5] 1 x convolution opening (denoising)
// [6 11] 6 x convolutions: erosion 3x3, 5x5, 7x7, dilation 3x3, 5x5, 7x7
int filterid;
static const char* filter_names[12];
}; };

View File

@@ -917,7 +917,6 @@ void SessionLoader::visit(ImageProcessingShader &n)
uniforms->QueryIntAttribute("nbColors", &n.nbColors); uniforms->QueryIntAttribute("nbColors", &n.nbColors);
uniforms->QueryIntAttribute("invert", &n.invert); uniforms->QueryIntAttribute("invert", &n.invert);
uniforms->QueryFloatAttribute("chromadelta", &n.chromadelta); uniforms->QueryFloatAttribute("chromadelta", &n.chromadelta);
uniforms->QueryIntAttribute("filter", &n.filterid);
} }
XMLElement* gamma = xmlCurrent_->FirstChildElement("gamma"); XMLElement* gamma = xmlCurrent_->FirstChildElement("gamma");

View File

@@ -495,7 +495,6 @@ void SessionVisitor::visit(ImageProcessingShader &n)
filter->SetAttribute("nbColors", n.nbColors); filter->SetAttribute("nbColors", n.nbColors);
filter->SetAttribute("invert", n.invert); filter->SetAttribute("invert", n.invert);
filter->SetAttribute("chromadelta", n.chromadelta); filter->SetAttribute("chromadelta", n.chromadelta);
filter->SetAttribute("filter", n.filterid);
xmlCurrent_->InsertEndChild(filter); xmlCurrent_->InsertEndChild(filter);
XMLElement *gamma = xmlDoc_->NewElement("gamma"); XMLElement *gamma = xmlDoc_->NewElement("gamma");

View File

@@ -49,7 +49,6 @@ uniform float threshold;
uniform float lumakey; uniform float lumakey;
uniform int nbColors; uniform int nbColors;
uniform int invert; uniform int invert;
uniform int filterid;
// conversion between rgb and YUV // conversion between rgb and YUV
const mat4 RGBtoYUV = mat4(0.257, 0.439, -0.148, 0.0, const mat4 RGBtoYUV = mat4(0.257, 0.439, -0.148, 0.0,
@@ -57,188 +56,6 @@ const mat4 RGBtoYUV = mat4(0.257, 0.439, -0.148, 0.0,
0.098, -0.071, 0.439, 0.0, 0.098, -0.071, 0.439, 0.0,
0.0625, 0.500, 0.500, 1.0 ); 0.0625, 0.500, 0.500, 1.0 );
const mat3 KERNEL[5] = mat3[5]( mat3( 0.0, 0.0, 0.0,
0.0, 1.0, 0.0,
0.0, 0.0, 0.0),
mat3( 0.0625, 0.125, 0.0625,
0.125, 0.25, 0.125,
0.0625, 0.125, 0.0625),
mat3( -1.0, -1.0, -1.0,
-1.0, 9.0, -1.0,
-1.0, -1.0, -1.0),
mat3( -2.0, 1.0, -2.0,
1.0, 4.0, 1.0,
-2.0, 1.0, -2.0),
mat3( -2.0, -1.0, 0.0,
-1.0, 1.0, 1.0,
0.0, 1.0, 2.0)
);
vec3 erosion(int N, vec2 filter_step)
{
vec3 minValue = vec3(1.0);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (0.0,0.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (0.0,-1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (-1.0, 0.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (1.0, 0.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (0.0, 1.0) * filter_step ).rgb, minValue);
if (N < 1)
return minValue;
minValue = min(texture(iChannel0, texcoord.xy + vec2 (-1.0, -2.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (0.0,-2.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (1.0,-2.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (-1.0,2.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (0.0, 2.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (1.0, 2.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (-2.0, 1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (-1.0, 1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 ( 1.0, 1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 ( 2.0, 1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (-2.0, -1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (-1.0, -1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 ( 1.0, -1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 ( 2.0, -1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (-2.0, 0.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 ( 2.0, 0.0) * filter_step ).rgb, minValue);
if (N < 2)
return minValue;
minValue = min(texture(iChannel0, texcoord.xy + vec2 (-1.0, -3.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (0.0,-3.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (1.0,-3.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (-1.0,3.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (0.0, 3.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (1.0, 3.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (-2.0, 2.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 ( 2.0, 2.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (-2.0, -2.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 ( 2.0, -2.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (-3.0, -1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (3.0, -1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (-3.0, 1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 ( 3.0, 1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (-3.0, 0.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 ( 3.0, 0.0) * filter_step ).rgb, minValue);
return minValue;
}
vec3 dilation(int N, vec2 filter_step)
{
vec3 maxValue = vec3(0.0);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (0.0, 0.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (0.0,-1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-1.0, 0.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (1.0, 0.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (0.0, 1.0) * filter_step ).rgb, maxValue);
if (N < 1)
return maxValue;
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-1.0, -2.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (0.0,-2.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (1.0,-2.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-1.0,2.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (0.0, 2.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (1.0, 2.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-2.0, 1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-1.0, 1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 ( 1.0, 1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 ( 2.0, 1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-2.0, -1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-1.0, -1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 ( 1.0, -1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 ( 2.0, -1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-2.0, 0.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 ( 2.0, 0.0) * filter_step ).rgb, maxValue);
if (N < 2)
return maxValue;
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-1.0, -3.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (0.0,-3.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (1.0,-3.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-1.0,3.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (0.0, 3.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (1.0, 3.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-2.0, 2.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 ( 2.0, 2.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-2.0, -2.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 ( 2.0, -2.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-3.0, -1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (3.0, -1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-3.0, 1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 ( 3.0, 1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-3.0, 0.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 ( 3.0, 0.0) * filter_step ).rgb, maxValue);
return maxValue;
}
vec3 opening(vec2 filter_step)
{
// 1) erosion
vec3 minValue1 = vec3(1.0);
minValue1 = min(texture(iChannel0, texcoord.xy + vec2 (0.0, 0.0) * filter_step ).rgb, minValue1);
minValue1 = min(texture(iChannel0, texcoord.xy + vec2 (0.0, 1.0) * filter_step ).rgb, minValue1);
minValue1 = min(texture(iChannel0, texcoord.xy + vec2 (0.0, 2.0) * filter_step ).rgb, minValue1);
minValue1 = min(texture(iChannel0, texcoord.xy + vec2 (1.0, 1.0) * filter_step ).rgb, minValue1);
minValue1 = min(texture(iChannel0, texcoord.xy + vec2 (1.0, -1.0) * filter_step ).rgb, minValue1);
vec3 minValue2 = vec3(1.0);
minValue2 = min(texture(iChannel0, texcoord.xy + vec2 (0.0, 0.0) * filter_step ).rgb, minValue2);
minValue2 = min(texture(iChannel0, texcoord.xy + vec2 (-1.0, 0.0) * filter_step ).rgb, minValue2);
minValue2 = min(texture(iChannel0, texcoord.xy + vec2 (-2.0, 0.0) * filter_step ).rgb, minValue2);
minValue2 = min(texture(iChannel0, texcoord.xy + vec2 (1.0, -1.0) * filter_step ).rgb, minValue2);
minValue2 = min(texture(iChannel0, texcoord.xy + vec2 (-1.0, -1.0) * filter_step ).rgb, minValue2);
vec3 minValue3 = vec3(1.0);
minValue3 = min(texture(iChannel0, texcoord.xy + vec2 (0.0, 0.0) * filter_step ).rgb, minValue3);
minValue3 = min(texture(iChannel0, texcoord.xy + vec2 (0.0, -1.0) * filter_step ).rgb, minValue3);
minValue3 = min(texture(iChannel0, texcoord.xy + vec2 (0.0, -2.0) * filter_step ).rgb, minValue3);
minValue3 = min(texture(iChannel0, texcoord.xy + vec2 (-1.0, -1.0) * filter_step ).rgb, minValue3);
minValue3 = min(texture(iChannel0, texcoord.xy + vec2 (-1.0, 1.0) * filter_step ).rgb, minValue3);
vec3 minValue4 = vec3(1.0);
minValue4 = min(texture(iChannel0, texcoord.xy + vec2 (0.0, 0.0) * filter_step ).rgb, minValue4);
minValue4 = min(texture(iChannel0, texcoord.xy + vec2 (1.0, 0.0) * filter_step ).rgb, minValue4);
minValue4 = min(texture(iChannel0, texcoord.xy + vec2 (2.0, 0.0) * filter_step ).rgb, minValue4);
minValue4 = min(texture(iChannel0, texcoord.xy + vec2 (1.0, 1.0) * filter_step ).rgb, minValue4);
minValue4 = min(texture(iChannel0, texcoord.xy + vec2 (-1.0, 1.0) * filter_step ).rgb, minValue4);
// 2) dilation
vec3 maxValue = vec3(0.0);
maxValue = max(minValue1, maxValue);
maxValue = max(minValue2, maxValue);
maxValue = max(minValue3, maxValue);
maxValue = max(minValue4, maxValue);
return maxValue;
}
vec3 convolution(mat3 kernel, vec2 filter_step)
{
int i = 0, j = 0;
vec3 sum = vec3(0.0);
for (i = 0; i<3; ++i)
for (j = 0; j<3; ++j)
sum += texture(iChannel0, texcoord.xy + filter_step * vec2 (i-1, j-1) ).rgb * kernel[i][j];
return sum;
}
vec3 apply_filter() {
vec2 filter_step = 1.f / textureSize(iChannel0, 0);
if (filterid < 1 || filterid > 11)
return texture(iChannel0, texcoord.xy).rgb;
else if (filterid < 5)
return convolution( KERNEL[filterid], filter_step);
else if (filterid < 6)
return opening(filter_step);
else if (filterid < 9)
return erosion( filterid - 6 , filter_step);
else
return dilation( filterid - 9, filter_step);
}
/* /*
** Hue, saturation, luminance <=> Red Green Blue ** Hue, saturation, luminance <=> Red Green Blue
*/ */
@@ -320,13 +137,13 @@ void main(void)
// adjust UV // adjust UV
texcoord = iTransform * vec4(vertexUV.x, vertexUV.y, 0.0, 1.0); texcoord = iTransform * vec4(vertexUV.x, vertexUV.y, 0.0, 1.0);
// deal with alpha separately vec4 texcolor = texture(iChannel0, texcoord.xy);
float ma = texture(iChannel0, texcoord.xy).a;
// float ma = texture(maskTexture, texcoord.xy).a * texture(iChannel0, texcoord.xy).a;
float alpha = clamp(ma * color.a, 0.0, 1.0);
// read color & apply basic filterid // deal with alpha separately
vec3 transformedRGB = apply_filter(); float alpha = clamp(texcolor.a * color.a, 0.0, 1.0);
// read color
vec3 transformedRGB = texcolor.rgb;
// chromakey // chromakey
alpha -= mix( 0.0, 1.0 - alphachromakey( transformedRGB, chromakey.rgb, chromadelta), float(chromadelta > 0.0001) ); alpha -= mix( 0.0, 1.0 - alphachromakey( transformedRGB, chromakey.rgb, chromadelta), float(chromadelta > 0.0001) );