def test_tv_denoise_3d(self): """ Apply the TV denoising algorithm on a 3D image representing a sphere. """ x, y, z = np.ogrid[0:40, 0:40, 0:40] mask = (x -22)**2 + (y - 20)**2 + (z - 17)**2 < 8**2 mask = 100 * mask.astype(np.float) mask += 60 mask += 20*np.random.randn(*mask.shape) mask[mask < 0] = 0 mask[mask > 255] = 255 res = filter.tv_denoise(mask.astype(np.uint8), weight=100, keep_type=True) assert res.std() < mask.std() assert res.dtype is np.dtype('uint8') res = filter.tv_denoise(mask.astype(np.uint8), weight=100) assert res.std() < mask.std() assert res.dtype is not np.dtype('uint8') # test wrong number of dimensions a = np.random.random((8, 8, 8, 8)) try: res = filter.tv_denoise(a) except ValueError: pass
def test_tv_denoise_2d(self): """ Apply the TV denoising algorithm on the lena image provided by scipy """ # lena image lena = color.rgb2gray(data.lena()) # add noise to lena lena += 0.5 * lena.std()*np.random.randn(*lena.shape) # denoise denoised_lena = filter.tv_denoise(lena, weight=60.0) # which dtype? assert denoised_lena.dtype in [np.float, np.float32, np.float64] from scipy import ndimage grad = ndimage.morphological_gradient(lena, size=((3,3))) grad_denoised = ndimage.morphological_gradient(denoised_lena, size=((3,3))) # test if the total variation has decreased assert np.sqrt((grad_denoised**2).sum()) < np.sqrt((grad**2).sum()) / 2 denoised_lena_int = filter.tv_denoise(lena.astype(np.int32), \ weight=60.0, keep_type=True) assert denoised_lena_int.dtype is np.dtype('int32')
def test_tv_denoise_2d(self): """ Apply the TV denoising algorithm on the lena image provided by scipy """ import scipy # lena image lena = scipy.lena().astype(np.float) # add noise to lena lena += 0.5 * lena.std() * np.random.randn(*lena.shape) # denoise denoised_lena = F.tv_denoise(lena, weight=60.0) # which dtype? assert denoised_lena.dtype in [np.float, np.float32, np.float64] from scipy import ndimage grad = ndimage.morphological_gradient(lena, size=((3, 3))) grad_denoised = ndimage.morphological_gradient(denoised_lena, size=((3, 3))) # test if the total variation has decreased assert np.sqrt((grad_denoised**2).sum()) < np.sqrt((grad**2).sum()) denoised_lena_int = F.tv_denoise(lena.astype(np.int32), \ weight=60.0, keep_type=True) assert denoised_lena_int.dtype is np.dtype('int32')
def test_tv_denoise_3d(self): """ Apply the TV denoising algorithm on a 3D image representing a sphere. """ x, y, z = np.ogrid[0:40, 0:40, 0:40] mask = (x - 22)**2 + (y - 20)**2 + (z - 17)**2 < 8**2 mask = 100 * mask.astype(np.float) mask += 60 mask += 20 * np.random.randn(*mask.shape) mask[mask < 0] = 0 mask[mask > 255] = 255 res = F.tv_denoise(mask.astype(np.uint8), weight=100, keep_type=True) assert res.std() < mask.std() assert res.dtype is np.dtype('uint8') res = F.tv_denoise(mask.astype(np.uint8), weight=100) assert res.std() < mask.std() assert res.dtype is not np.dtype('uint8') # test wrong number of dimensions a = np.random.random((8, 8, 8, 8)) try: res = F.tv_denoise(a) except ValueError: pass
the tradeoff between denoising and faithfulness to the original image. """ import numpy as np import matplotlib.pyplot as plt from scikits.image import data, color, img_as_ubyte from scikits.image.filter import tv_denoise l = img_as_ubyte(color.rgb2gray(data.lena())) l = l[230:290, 220:320] noisy = l + 0.4 * l.std() * np.random.random(l.shape) tv_denoised = tv_denoise(noisy, weight=10) plt.figure(figsize=(12,2.8)) plt.subplot(131) plt.imshow(noisy, cmap=plt.cm.gray, vmin=40, vmax=220) plt.axis('off') plt.title('noisy', fontsize=20) plt.subplot(132) plt.imshow(tv_denoised, cmap=plt.cm.gray, vmin=40, vmax=220) plt.axis('off') plt.title('TV denoising', fontsize=20) tv_denoised = tv_denoise(noisy, weight=50) plt.subplot(133) plt.imshow(tv_denoised, cmap=plt.cm.gray, vmin=40, vmax=220)