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

values were used on some pixel types.
This commit is contained in:
Davis King 2016-04-28 18:57:15 -04:00
parent d3f12d832c
commit 7770225a88
1 changed files with 19 additions and 9 deletions

View File

@ -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);
}
} }