[comp.lang.postscript] Adding noice to grayscales

christer@zeus.cs.umu.se (Christer Ericson) (05/22/89)

I would like to add some random noice to the grayscale when I'm filling an
area. I have tried to do something like this (simplified example);

    60 45 { add rand 3 mod add 1 sub 3.0 div } setscreen

but obviously the current screen is only accessed once before the filling and
not during the operation (as I would want it to work).

Is there any way to accomplish this in a straightforward way?

Thanks,

/Christer



| Christer Ericson                           Internet: christer@cs.umu.se  |
| Department of Computer Science, University of Umea, S-90187 UMEA, Sweden |
|     >>>>>    "I bully sheep. I claim God doesn't exist..."    <<<<<      |

geof@apolling (Geof Cooper) (05/24/89)

In article <861@umecs.cs.umu.se> christer@zeus.UUCP (Christer Ericson) writes:
>I would like to add some random noice to the grayscale when I'm filling an
>area. I have tried to do something like this (simplified example);
>
>    60 45 { add rand 3 mod add 1 sub 3.0 div } setscreen
>
>but obviously the current screen is only accessed once before the filling and
>not during the operation (as I would want it to work).

No simple way.  PostScript uses an imaging model that calls for a
particular type of half-tone screen.  It is not willing to half-tone
using other digital techniques, such as convolution with random
screens, etc..

As for adding random noise to the image, the only way that I can think
of to do this is to generate the image, then superimpose a noise
function on top of it.  The noise function is just a "repeat" loop
that turns a bit on or off at a random location (hopefully within the
image).

Here is some non-debugged code that illustrates the technique.
I would expect this to take a LONG time to work for any real amount
of noise.

% SizeX and SizeY are the dimensions of the image that has
% been imaged at the current origin.
% The current origin should be pixel aligned using:
%   0 0 moveto currentpoint transform round exch round itransform translate

/xpix 1 0 idtransform dup mul exch dup mul add sqrt def
/ypix 0 1 idtransform dup mul exch dup mul add sqrt def
/SizeX SizeX xpix div round def
/SizeY SizeY ypix div round def
xpix ypix scale

/sr { rand 2.15e9 div } bind def

1000
{
    sr SizeX mul round sr SizeY mul round moveto
    rand 16#4000000 ge {0}{1}ifelse setgray
    0 1 rlineto 1 0 rlineto 0 -1 rlineto fill
}
bind repeat