Commit 7770225a authored by Davis King's avatar Davis King

Fixed a bug in gaussian_blur() that caused messed up outputs when big sigma

values were used on some pixel types.
parent d3f12d83
...@@ -1233,15 +1233,25 @@ namespace dlib ...@@ -1233,15 +1233,25 @@ namespace dlib
<< "\n\t is_same_object(in_img,out_img): " << is_same_object(in_img,out_img) << "\n\t is_same_object(in_img,out_img): " << is_same_object(in_img,out_img)
); );
typedef typename pixel_traits<typename image_traits<out_image_type>::pixel_type>::basic_pixel_type type; if (sigma < 18)
typedef typename promote<type>::type ptype; {
typedef typename pixel_traits<typename image_traits<out_image_type>::pixel_type>::basic_pixel_type type;
const matrix<ptype,0,1>& filt = create_gaussian_filter<ptype>(sigma, max_size); typedef typename promote<type>::type ptype;
const matrix<ptype,0,1>& filt = create_gaussian_filter<ptype>(sigma, max_size);
ptype scale = sum(filt); ptype scale = sum(filt);
scale = scale*scale; scale = scale*scale;
return spatially_filter_image_separable(in_img, out_img, filt, filt, scale);
return spatially_filter_image_separable(in_img, out_img, filt, filt, scale); }
else
{
// For large sigma we need to use a type with a lot of precision to avoid
// numerical problems. So we use double here.
typedef double ptype;
const matrix<ptype,0,1>& filt = create_gaussian_filter<ptype>(sigma, max_size);
ptype scale = sum(filt);
scale = scale*scale;
return spatially_filter_image_separable(in_img, out_img, filt, filt, scale);
}
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment