X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=deconvolution_sharpen_effect.cpp;h=f564b68c4bcc62f350b88ca929d46d4f4cd1bec3;hp=29071c540c32d93170607012d7e59a9588d604ed;hb=0cdd6e9e30a807056699ed9b3fa023a23ce83af9;hpb=ebe6d6ba984b2fb77b365aeacd1f30d4da59964b diff --git a/deconvolution_sharpen_effect.cpp b/deconvolution_sharpen_effect.cpp index 29071c5..f564b68 100644 --- a/deconvolution_sharpen_effect.cpp +++ b/deconvolution_sharpen_effect.cpp @@ -2,17 +2,24 @@ // Since all of our signals are symmetrical, discrete correlation and convolution // is the same operation, and so we won't make a difference in notation. - -#include -#include #include #include +#include +#include +#include +#include +#include +#include +#include #include "deconvolution_sharpen_effect.h" +#include "effect_util.h" #include "util.h" -#include "opengl.h" using namespace Eigen; +using namespace std; + +namespace movit { DeconvolutionSharpenEffect::DeconvolutionSharpenEffect() : R(5), @@ -33,7 +40,7 @@ DeconvolutionSharpenEffect::DeconvolutionSharpenEffect() register_float("noise", &noise); } -std::string DeconvolutionSharpenEffect::output_fragment_shader() +string DeconvolutionSharpenEffect::output_fragment_shader() { char buf[256]; sprintf(buf, "#define R %u\n", R); @@ -166,10 +173,10 @@ MatrixXf convolve(const MatrixXf &a, const MatrixXf &b) int xa_max = xr; // Now fit to the first demand. - ya_min = std::max(ya_min, 0); - ya_max = std::min(ya_max, a.rows() - 1); - xa_min = std::max(xa_min, 0); - xa_max = std::min(xa_max, a.cols() - 1); + ya_min = max(ya_min, 0); + ya_max = min(ya_max, a.rows() - 1); + xa_min = max(xa_min, 0); + xa_max = min(xa_max, a.cols() - 1); assert(ya_max >= ya_min); assert(xa_max >= xa_min); @@ -216,10 +223,10 @@ MatrixXf central_convolve(const MatrixXf &a, const MatrixXf &b) int xa_max = xr; // Now fit to the first demand. - ya_min = std::max(ya_min, 0); - ya_max = std::min(ya_max, a.rows() - 1); - xa_min = std::max(xa_min, 0); - xa_max = std::min(xa_max, a.cols() - 1); + ya_min = max(ya_min, 0); + ya_max = min(ya_max, a.rows() - 1); + xa_min = max(xa_min, 0); + xa_max = min(xa_max, a.cols() - 1); assert(ya_max >= ya_min); assert(xa_max >= xa_min); @@ -236,26 +243,10 @@ MatrixXf central_convolve(const MatrixXf &a, const MatrixXf &b) return result; } -void print_matrix(const MatrixXf &m) -{ - for (int y = 0; y < m.rows(); ++y) { - for (int x = 0; x < m.cols(); ++x) { - printf("%7.4f ", m(x, y)); - } - printf("\n"); - } -} - } // namespace void DeconvolutionSharpenEffect::update_deconvolution_kernel() { - printf("circular blur radius: %5.3f\n", circle_radius); - printf("gaussian blur radius: %5.3f\n", gaussian_radius); - printf("correlation: %5.3f\n", correlation); - printf("noise factor: %5.3f\n", noise); - printf("\n"); - // Figure out the impulse response for the circular part of the blur. MatrixXf circ_h(2 * R + 1, 2 * R + 1); for (int y = -R; y <= R; ++y) { @@ -274,8 +265,7 @@ void DeconvolutionSharpenEffect::update_deconvolution_kernel() if (gaussian_radius < 1e-3) { val = (x == 0 && y == 0) ? 1.0f : 0.0f; } else { - float z = hypot(x, y) / gaussian_radius; - val = exp(-z * z); + val = exp(-(x*x + y*y) / (2.0 * gaussian_radius * gaussian_radius)); } gaussian_h(y + 2 * R, x + 2 * R) = val; } @@ -313,7 +303,7 @@ void DeconvolutionSharpenEffect::update_deconvolution_kernel() MatrixXf r_uu(8 * R + 1, 8 * R + 1); for (int y = -4 * R; y <= 4 * R; ++y) { for (int x = -4 * R; x <= 4 * R; ++x) { - r_uu(x + 4 * R, y + 4 * R) = pow(correlation, hypot(x, y)); + r_uu(x + 4 * R, y + 4 * R) = pow(double(correlation), hypot(x, y)); } } @@ -326,7 +316,6 @@ void DeconvolutionSharpenEffect::update_deconvolution_kernel() assert(r_vv.cols() == 4 * R + 1); // Similarly, r_uv = u ⊙ v = u ⊙ (h ⊙ u) = h ⊙ r_uu. - //MatrixXf r_uv = central_convolve(r_uu, h).block(2 * R, 2 * R, 2 * R + 1, 2 * R + 1); MatrixXf r_uu_center = r_uu.block(2 * R, 2 * R, 4 * R + 1, 4 * R + 1); MatrixXf r_uv = central_convolve(r_uu_center, h); assert(r_uv.rows() == 2 * R + 1); @@ -379,8 +368,7 @@ void DeconvolutionSharpenEffect::update_deconvolution_kernel() // (G+H) x0 + I x2 = y2 // // This both increases accuracy and provides us with a very nice speed - // boost. We could have gone even further and went for 8-way symmetry - // like the shader does, but this is good enough right now. + // boost. MatrixXf M(MatrixXf::Zero((R + 1) * (R + 1), (R + 1) * (R + 1))); MatrixXf r_uv_flattened(MatrixXf::Zero((R + 1) * (R + 1), 1)); for (int outer_i = 0; outer_i < 2 * R + 1; ++outer_i) { @@ -432,7 +420,7 @@ void DeconvolutionSharpenEffect::update_deconvolution_kernel() last_noise = noise; } -void DeconvolutionSharpenEffect::set_gl_state(GLuint glsl_program_num, const std::string &prefix, unsigned *sampler_num) +void DeconvolutionSharpenEffect::set_gl_state(GLuint glsl_program_num, const string &prefix, unsigned *sampler_num) { Effect::set_gl_state(glsl_program_num, prefix, sampler_num); @@ -445,7 +433,6 @@ void DeconvolutionSharpenEffect::set_gl_state(GLuint glsl_program_num, const std update_deconvolution_kernel(); } // Now encode it as uniforms, and pass it on to the shader. - // (Actually the shader only uses about half of the elements.) float samples[4 * (R + 1) * (R + 1)]; for (int y = 0; y <= R; ++y) { for (int x = 0; x <= R; ++x) { @@ -457,5 +444,7 @@ void DeconvolutionSharpenEffect::set_gl_state(GLuint glsl_program_num, const std } } - set_uniform_vec4_array(glsl_program_num, prefix, "samples", samples, R * R); + set_uniform_vec4_array(glsl_program_num, prefix, "samples", samples, (R + 1) * (R + 1)); } + +} // namespace movit