Merge pull request #1504 from ahojnnes/denoise_bilateral_fix

Fix out-of-bounds access in color LUT for NaN values
This commit is contained in:
Stefan van der Walt
2015-05-10 16:00:11 -07:00
2 changed files with 19 additions and 2 deletions
+13 -2
View File
@@ -44,6 +44,13 @@ cdef double* _compute_range_lut(Py_ssize_t win_size, double sigma):
return range_lut
cdef inline Py_ssize_t Py_ssize_t_min(Py_ssize_t value1, Py_ssize_t value2):
if value1 < value2:
return value1
else:
return value2
def _denoise_bilateral(image, Py_ssize_t win_size, sigma_range,
double sigma_spatial, Py_ssize_t bins,
mode, double cval):
@@ -60,6 +67,7 @@ def _denoise_bilateral(image, Py_ssize_t win_size, sigma_range,
Py_ssize_t cols = image.shape[1]
Py_ssize_t dims = image.shape[2]
Py_ssize_t window_ext = (win_size - 1) / 2
Py_ssize_t max_color_lut_bin = bins - 1
double max_value
@@ -69,7 +77,7 @@ def _denoise_bilateral(image, Py_ssize_t win_size, sigma_range,
double* color_lut
double* range_lut
Py_ssize_t r, c, d, wr, wc, kr, kc, rr, cc, pixel_addr
Py_ssize_t r, c, d, wr, wc, kr, kc, rr, cc, pixel_addr, color_lut_bin
double value, weight, dist, total_weight, csigma_range, color_weight, \
range_weight
double dist_scale
@@ -126,7 +134,10 @@ def _denoise_bilateral(image, Py_ssize_t win_size, sigma_range,
dist = sqrt(dist)
range_weight = range_lut[kr * win_size + kc]
color_weight = color_lut[<int>(dist * dist_scale)]
color_lut_bin = Py_ssize_t_min(
<Py_ssize_t>(dist * dist_scale), max_color_lut_bin)
color_weight = color_lut[color_lut_bin]
weight = range_weight * color_weight
for d in range(dims):
@@ -144,6 +144,12 @@ def test_denoise_bilateral_3d():
assert out1[30:45, 5:15].std() > out2[30:45, 5:15].std()
def test_denoise_bilateral_nan():
img = np.NaN + np.empty((50, 50))
out = restoration.denoise_bilateral(img)
assert_equal(img, out)
def test_nl_means_denoising_2d():
img = np.zeros((40, 40))
img[10:-10, 10:-10] = 1.