X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?p=CreaPhase.git;a=blobdiff_plain;f=octave_packages%2Fimage-1.0.15%2Fimnoise.m;fp=octave_packages%2Fimage-1.0.15%2Fimnoise.m;h=0cd92b844f1574a28d49c4c3d6547531e0e08dfd;hp=0000000000000000000000000000000000000000;hb=f5f7a74bd8a4900f0b797da6783be80e11a68d86;hpb=1705066eceaaea976f010f669ce8e972f3734b05 diff --git a/octave_packages/image-1.0.15/imnoise.m b/octave_packages/image-1.0.15/imnoise.m new file mode 100644 index 0000000..0cd92b8 --- /dev/null +++ b/octave_packages/image-1.0.15/imnoise.m @@ -0,0 +1,72 @@ +## Copyright (C) 2000 Paul Kienzle +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; If not, see . + +## -*- texinfo -*- +## @deftypefn {Function File} {@var{B} =} imnoise (@var{A}, @var{type}) +## Adds noise to image in @var{A}. +## +## @table @code +## @item imnoise (A, 'gaussian' [, mean [, var]]) +## additive gaussian noise: @var{B} = @var{A} + noise +## defaults to mean=0, var=0.01 +## @item imnoise (A, 'salt & pepper' [, density]) +## lost pixels: A = 0 or 1 for density*100% of the pixels +## defaults to density=0.05, or 5% +## @item imnoise (A, 'speckle' [, var]) +## multiplicative gaussian noise: @var{B} = @var{A} + @var{A}*noise +## defaults to var=0.04 +## @end table +## @end deftypefn + +## Modified: Stefan van der Walt , 2004-02-24 + +function A = imnoise(A, stype, a, b) + + if (nargin < 2 || nargin > 4 || !ismatrix(A) || !ischar(stype)) + usage("B = imnoise(A, type, parameters, ...)"); + endif + + valid = (min(A(:)) >= 0 && max(A(:)) <= 1); + + stype = tolower(stype); + if (strcmp(stype, 'gaussian')) + if (nargin < 3), a = 0.0; endif + if (nargin < 4), b = 0.01; endif + A = A + (a + randn(size(A)) * sqrt(b)); + ## Variance of Gaussian data with mean 0 is E[X^2] + elseif (strcmp(stype, 'salt & pepper')) + if (nargin < 3), a = 0.05; endif + noise = rand(size(A)); + A(noise <= a/2) = 0; + A(noise >= 1-a/2) = 1; + elseif (strcmp(stype, 'speckle')) + if (nargin < 3), a = 0.04; endif + A = A .* (1 + randn(size(A))*sqrt(a)); + else + error("imnoise: use type 'gaussian', 'salt & pepper', or 'speckle'"); + endif + + if valid + A(A>1) = 1; + A(A<0) = 0; + else + warning("Image should be in [0,1]"); + endif + +endfunction + +%!assert(var(imnoise(ones(10)/2,'gaussian')(:)),0.01,0.005) # probabilistic +%!assert(length(find(imnoise(ones(10)/2,'salt & pepper')~=0.5)),5,10) # probabilistic +%!assert(var(imnoise(ones(10)/2,'speckle')(:)),0.01,0.005) # probabilistic