示例#1
0
 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
示例#2
0
 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')
示例#3
0
 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')
示例#4
0
 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)