Re: Raster process
- To: mathgroup at smc.vnet.net
- Subject: [mg40623] Re: Raster process
- From: Steve Gray <stevebg at adelphia.net>
- Date: Fri, 11 Apr 2003 02:03:40 -0400 (EDT)
- References: <b7394b$p0f$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
After I posted this I realized that the arithmetic would be carried out in exact fractional form. Changing 7/16, etc., to decimal results in a big improvement but it's still way slower than I would guess it should be. Also, mysteriously, the time as measured by Timing[floyd] shows that the execution time goes up much faster than the total number of pixels in "g" (= length of the list). ??? Thanks again. On Thu, 10 Apr 2003 08:14:03 +0000 (UTC), Steve Gray <stevebg at adelphia.net> wrote: > I have a two-level list representing a raster of gray levels. >I want to go through it fast, testing every element and at the same >time modifying certain elements following it on the same line and in >the next line. One such algorithm is known as the Floyd-Steinberg >method for converting a gray-scale image to binary. The most obvious >implementation using a double For loop seems to be extremely slow. Is >there a way to use Map or whatever? > Thanks for any help. > >floyd := Module[{cw, ch, err}, > g = Import[fili]; > picd = Dimensions[g[[1, 1]]]; (* Actual array. *) > pich = picd[[1]]; > picw = picd[[2]]; > gp = g; (* Make working copy *) > For [ ch = 1, ch < pich, ch++, > For [ cw = 2, cw < picw, cw++, > If[g[[1, 1, ch, cw]] > 128, gp[[1, 1, ch, cw]] = 255, > gp[[1, 1, ch, cw]] = 0]; > err = gp[[1, 1, ch, cw]] - g [[1, 1, ch, cw]]; > g[[1, 1, ch , cw + 1]] -= er*7/16; > g[[1, 1, ch + 1, cw - 1]] -= er*3/16; > g[[1, 1, ch + 1, cw ]] -= er*5/16; > g[[1, 1, ch + 1, cw + 1]] -= er/16; > ]; > ]; > Show[gp]; > Export[filo, gp, "JPEG"]; > ]