mirror of
https://github.com/wassname/scikit-image.git
synced 2026-07-04 08:11:57 +08:00
88 lines
2.7 KiB
Python
88 lines
2.7 KiB
Python
from numpy.testing import assert_array_equal, assert_allclose
|
|
|
|
import numpy as np
|
|
from skimage.data import camera
|
|
from skimage.util import random_noise, img_as_float
|
|
|
|
|
|
def test_set_seed():
|
|
seed = 42
|
|
cam = camera()
|
|
test = random_noise(cam, seed=seed)
|
|
assert_array_equal(test, random_noise(cam, seed=seed))
|
|
|
|
|
|
def test_salt():
|
|
seed = 42
|
|
cam = img_as_float(camera())
|
|
cam_noisy = random_noise(cam, seed=seed, mode='salt', d=0.15)
|
|
saltmask = cam != cam_noisy
|
|
|
|
# Ensure all changes are to 1.0
|
|
assert_allclose(cam_noisy[saltmask], np.ones(saltmask.sum()))
|
|
|
|
# Ensure approximately correct amount of noise was added
|
|
proportion = float(saltmask.sum()) / (cam.shape[0] * cam.shape[1])
|
|
assert 0.11 < proportion <= 0.18
|
|
|
|
|
|
def test_pepper():
|
|
seed = 42
|
|
cam = img_as_float(camera())
|
|
cam_noisy = random_noise(cam, seed=seed, mode='pepper', d=0.15)
|
|
peppermask = cam != cam_noisy
|
|
|
|
# Ensure all changes are to 1.0
|
|
assert_allclose(cam_noisy[peppermask], np.zeros(peppermask.sum()))
|
|
|
|
# Ensure approximately correct amount of noise was added
|
|
proportion = float(peppermask.sum()) / (cam.shape[0] * cam.shape[1])
|
|
assert 0.11 < proportion <= 0.18
|
|
|
|
|
|
def test_salt_and_pepper():
|
|
seed = 42
|
|
cam = img_as_float(camera())
|
|
cam_noisy = random_noise(cam, seed=seed, mode='s&p', d=0.15, p=0.25)
|
|
saltmask = np.logical_and(cam != cam_noisy, cam_noisy == 1.)
|
|
peppermask = np.logical_and(cam != cam_noisy, cam_noisy == 0.)
|
|
|
|
# Ensure all changes are to 0. or 1.
|
|
assert_allclose(cam_noisy[saltmask], np.ones(saltmask.sum()))
|
|
assert_allclose(cam_noisy[peppermask], np.zeros(peppermask.sum()))
|
|
|
|
# Ensure approximately correct amount of noise was added
|
|
proportion = float(
|
|
saltmask.sum() + peppermask.sum()) / (cam.shape[0] * cam.shape[1])
|
|
assert 0.11 < proportion <= 0.18
|
|
|
|
# Verify the relative amount of salt vs. pepper is close to expected
|
|
assert 0.18 < saltmask.sum() / float(peppermask.sum()) < 0.32
|
|
|
|
|
|
def test_gaussian():
|
|
seed = 42
|
|
data = np.zeros((128, 128)) + 0.5
|
|
data_gaussian = random_noise(data, seed=seed, v=0.01)
|
|
assert 0.008 < data_gaussian.var() < 0.012
|
|
|
|
data_gaussian = random_noise(data, seed=seed, m=0.3, v=0.015)
|
|
assert 0.28 < data_gaussian.mean() - 0.5 < 0.32
|
|
assert 0.012 < data_gaussian.var() < 0.018
|
|
|
|
|
|
def test_speckle():
|
|
seed = 42
|
|
data = np.zeros((128, 128)) + 0.1
|
|
np.random.seed(seed=42)
|
|
noise = np.random.normal(0.1, 0.02 ** 0.5, (128, 128))
|
|
expected = np.clip(data + data * noise, 0, 1)
|
|
|
|
data_speckle = random_noise(data, mode='speckle', seed=seed, m=0.1,
|
|
v=0.02)
|
|
assert_allclose(expected, data_speckle)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
np.testing.run_module_suite()
|