Fractals/Computer graphic techniques/2D

< Fractals < Computer graphic techniques

Intro

All tasks ( image processing [1]) can be done using :


One can use free graphic libraries :

Creating graphic

Here are 3 targets / tasks :

Graphic file

Graphic files

Memory array

Image in memory is a matrix :

The color depth of the image :

Screen pixels


glxinfo | grep OpenGL
glxinfo | grep "direct rendering"

DRI

Direct Rendering Infrastructure (DRI2)[10]

Color

Example of interesting color gradient
Palette graphics, palette replacement mechanism

Curve

Field lines

Field line [11]

Tracing

Tracing curve [12]

Curve rasterisation

Ray

Ray can be parametrised with radius ( r)

Closed curve

Simple closed curve ("a connected curve that does not cross itself and ends at the same point where it begins" [13] = having no endpoints) can be parametrized with angle ( t).

Edge detection


Sobel filter

Short introduction

Sobel filter G consist of 2 filters (masks):

Sobel kernels
8-point neighborhood on a 2D grid

The Sobel kernel contains weights for each pixel from the 8-point neighbourhood of a tested pixel. These are 3x3 kernels.

There are 2 Sobel kernels, one for computing horizontal changes and other for computing vertical changes. Notice that a large horizontal change may indicate a vertical border, and a large vertical change may indicate a horizontal border. The x-coordinate is here defined as increasing in the "right"-direction, and the y-coordinate is defined as increasing in the "down"-direction.

The Sobel kernel for computing horizontal changes is:

The Sobel kernel for computing vertical changes is:

Note that :


Pixel kernel

Pixel kernel A containing central pixel with its 3x3 neghbourhood  :

Other notations for pixel kernel :

where : [16]

unsigned char ul, // upper left
unsigned char um, // upper middle
unsigned char ur, // upper right
unsigned char ml, // middle left
unsigned char mm, // middle = central pixel
unsigned char mr, // middle right
unsigned char ll, // lower left
unsigned char lm, // lower middle
unsigned char lr, // lower right
Pixel 3x3 neighbourhood (with Y axis directed down)

In array notation it is :[17]

In geographic notation usede in cellular aotomats it is central pixel of Moore neighbourhood.

So central ( tested ) pixel is :

Sobel filters

Compute sobel filters ( where here denotes the 2-dimensional convolution operation not matrix multiplication ). It is a sum of products of pixel and its weghts :

Because 3 weights in each kernal are zero so there are only 6 products. [18]

short Gh = ur + 2*mr + lr - ul - 2*ml - ll;
short Gv = ul + 2*um + ur - ll - 2*lm - lr;
Result

Result is computed (magnitude of gradient):

It is a color of tested pixel .


One can also approximate result by sum of 2 magnitudes :

which is much faster to compute.[19]

Algorithm

Programming

Sobel filters ( 2 filters 3x3 ) : image and full c code
Skipped pixel - some points from its neighbourhood are out of the image

Lets take array of 8-bit colors ( image) called data. To find borders in this image simply do :

for(iY=1;iY<iYmax-1;++iY){ 
    for(iX=1;iX<iXmax-1;++iX){ 
     Gv= - data[iY-1][iX-1] - 2*data[iY-1][iX] - data[iY-1][iX+1] + data[iY+1][iX-1] + 2*data[iY+1][iX] + data[iY+1][iX+1];
     Gh= - data[iY+1][iX-1] + data[iY-1][iX+1] - 2*data[iY][iX-1] + 2*data[iY][iX+1] - data[iY-1][iX-1] + data[iY+1][iX+1];
     G = sqrt(Gh*Gh + Gv*Gv);
     if (G==0) {edge[iY][iX]=255;} /* background */
         else {edge[iY][iX]=0;}  /* boundary */
    }
  }

Note that here points on borders of array ( iY= 0 , iY = iYmax , iX=0, iX=iXmax) are skipped

Result is saved to another array called edge ( with the same size).

One can save edge array to file showing only borders, or merge 2 arrays  :

for(iY=1;iY<iYmax-1;++iY){ 
    for(iX=1;iX<iXmax-1;++iX){ if (edge[iY][iX]==0) data[iY][iX]=0;}}

to have new image with marked borders.

Above example is for 8-bit or indexed color. For higher bit colors "the formula is applied to all three color channels separately" ( from RoboRealm doc).


Other implementations :

Problems

Bad edge position seen in the middle of image. Lines are not meeting in good points, like z = 0

Edge position :

In ImageMagic as "you can see, the edge is added only to areas with a color gradient that is more than 50% white! I don't know if this is a bug or intentional, but it means that the edge in the above is located almost completely in the white parts of the original mask image. This fact can be extremely important when making use of the results of the "-edge" operator." [20]

The result is :

See also new operators from 6 version of Image Magic : EdgeIn and EdgeOut from Morphology [22]

Edge thickening

dilation [23][24][25]


convert $tmp0 -convolve "1,1,1,1,1,1,1,1,1" -threshold 0 $outfile

Filling contour

Filling contour - simple procedure in c


Quality of image

Interval arithemthic

Antialiasing

Aliased chessboard - image and c src code


Supersampling

example of supersampled image
Cpp code of supersampling

Other names :

Examples :

 // subpixels finished -> make arithmetic mean
 char pixel[3];
 for (int c = 0; c < 3; c++)
   pixel[c] = (int)(255.0 * sum[c] / (subpix * subpix)  + 0.5);
 fwrite(pixel, 1, 3, image_file);
 //pixel finished
 //Created by Josef Jelinek
 // http://java.rubikscube.info/
 Color c0 = color(dx, dy); // color of central point
 // computation of 4 new points for antialiasing
 if (antialias) { // computes 4 new points (corners)
   Color c1 = color(dx - 0.25 * r, dy - 0.25 * r);
   Color c2 = color(dx + 0.25 * r, dy - 0.25 * r);
   Color c3 = color(dx + 0.25 * r, dy + 0.25 * r);
   Color c4 = color(dx - 0.25 * r, dy + 0.25 * r);
  // resulting color; each component of color is an avarage of 5 values ( central point and 4 corners )
   int red = (c0.getRed() + c1.getRed() + c2.getRed() + c3.getRed() + c4.getRed()) / 5;
   int green = (c0.getGreen() + c1.getGreen() + c2.getGreen() + c3.getGreen() + c4.getGreen()) / 5;
   int blue = (c0.getBlue() + c1.getBlue() + c2.getBlue() + c3.getBlue() + c4.getBlue()) / 5;
   color = new Color(red, green, blue);
 }


convert big.ppm -resize 2000x2000 m.png

Plane

Description is here

Optimization

Optimisation is described here

References

  1. IPOL Journal · Image Processing On Line
  2. ImageMagick image processing libraries
  3. GEGL (Generic Graphics Library)
  4. http://openil.sourceforge.net/
  5. http://freeimage.sourceforge.net/
  6. GD Graphics Library
  7. graphics magick
  8. OpenCv
  9. OpenImageIO
  10. w:Direct Rendering Infrastructure (DRI)
  11. wikipedia : Field line
  12. Curve sketching in wikipedia
  13. mathwords : simple_closed_curve
  14. matrixlab - line-detection
  15. Sobel Edge Detector by R. Fisher, S. Perkins, A. Walker and E. Wolfart.
  16. NVIDIA Forums , CUDA GPU Computing discussion by kr1_karin
  17. Sobel Edge by RoboRealm
  18. forum nvidia : Sobel Filter Don't understand a little thing in the SDK example
  19. Sobel Edge Detector by R. Fisher, S. Perkins, A. Walker and E. Wolfart.
  20. Image Magic doc
  21. Edge operator from Imagew Magic dosc
  22. imagemagick doc : morphology / edgein
  23. dilation at HIPR2 by Robert Fisher, Simon Perkins, Ashley Walker, Erik Wolfart
  24. imagemagick doc : morphology, dilate
  25. Fred's ImageMagick Scripts
  26. Images of Julia sets that you can trust Luiz Henrique de Figueiredo
  27. ON THE NUMERICAL CONSTRUCTION OF HYPERBOLIC STRUCTURES FOR COMPLEX DYNAMICAL SYSTEMS by Jennifer Suzanne Lynch Hruska
  28. "Images of Julia sets that you can trust" by Luiz Henrique de Figueiredo and Joao Batista Oliveira
  29. adaptive algorithms for generating guaranteed images of Julia sets by Luiz Henrique de Figueiredo
  30. Drawing Fractals With Interval Arithmetic - Part 1 by Dr Rupert Rawnsley
  31. Drawing Fractals With Interval Arithmetic - Part 2 by Dr Rupert Rawnsley
  32. Spatial anti aliasing at wikipedia
  33. fractalforums discussion : Antialiasing fractals - how best to do it?
  34. Supersampling at wikipedia
  35. ImageMagick v6 Examples -- Resampling Filters
  36. What is the best image downscaling algorithm (quality-wise)?
  37. Aptus ( python and c code ) by Ned Batchelder
  38. Pil function resize
  39. Java code by Josef Jelinek
This article is issued from Wikibooks. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.