Java DIP – Useful Resources ”; Previous Next The following resources contain additional information on Java DIP. Please use them to get more in-depth knowledge on this topic. Useful Links on Java DIP Digital image processing – Wikipedia reference for Java DIP. Useful Books on Java DIP To enlist your site on this page, please drop an email to [email protected] Print Page Previous Next Advertisements ”;
Category: java Dip
DIP – Box Filter
Java DIP – Applying Box Filter ”; Previous Next We apply Box filter that blurs an image. A Box filter could be of dimensions 3×3, 5×5, 9×9 etc. We use OpenCV function filter2D to apply Box filter to images. It can be found under Imgproc package. Its syntax is given below − filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT ); The function arguments are described below − Sr.No. Argument & Description 1 src It is source image. 2 dst It is destination image. 3 depth It is the depth of dst. A negative value (such as -1) indicates that the depth is the same as the source. 4 kernel It is the kernel to be scanned through the image. 5 anchor It is the position of the anchor relative to its kernel. The location Point (-1, -1) indicates the center by default. 6 delta It is a value to be added to each pixel during the convolution. By default it is 0. 7 BORDER_DEFAULT We let this value by default. Apart from the filter2D() method, there are other methods provided by the Imgproc class. They are described briefly − Sr.No. Method & Description 1 cvtColor(Mat src, Mat dst, int code, int dstCn) It converts an image from one color space to another. 2 dilate(Mat src, Mat dst, Mat kernel) It dilates an image by using a specific structuring element. 3 equalizeHist(Mat src, Mat dst) It equalizes the histogram of a grayscale image. 4 filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) It convolves an image with the kernel. 5 GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) It blurs an image using a Gaussian filter. 6 integral(Mat src, Mat sum) It calculates the integral of an image. Example The following example demonstrates the use of Imgproc class to apply Box filter to an image of Grayscale. import org.opencv.core.Core; import org.opencv.core.CvType; import org.opencv.core.Mat; import org.opencv.highgui.Highgui; import org.opencv.imgproc.Imgproc; public class convolution { public static void main( String[] args ) { try { int kernelSize = 9; System.loadLibrary( Core.NATIVE_LIBRARY_NAME ); Mat source = Highgui.imread(“grayscale.jpg”, Highgui.CV_LOAD_IMAGE_GRAYSCALE); Mat destination = new Mat(source.rows(),source.cols(),source.type()); Mat kernel = Mat.ones(kernelSize,kernelSize, CvType.CV_32F); for(int i=0; i<kernel.rows(); i++) { for(int j=0; j<kernel.cols(); j++) { double[] m = kernel.get(i, j); for(int k =0; k<m.length; k++) { m[k] = m[k]/(kernelSize * kernelSize); } kernel.put(i,j, m); } } Imgproc.filter2D(source, destination, -1, kernel); Highgui.imwrite(“output.jpg”, destination); } catch (Exception e) { System.out.println(“Error: ” + e.getMessage()); } } } Output When you execute the given code, the following output is seen − Original Image In this example we convolve our image with the following filter (kernel). This filter results in blurring an image as its size increases. This original image has been convolved with the box filter of size 5, which is given below − Box filter of size 5 1/25 1/25 1/25 1/25 1/25 1/25 1/25 1/25 1/25 1/25 1/25 1/25 1/25 1/25 1/25 1/25 1/25 1/25 1/25 1/25 1/25 1/25 1/25 1/25 1/25 Convolved Image (with Box Filter of Size 5) Convolved Image (with Box Filter of Size 9) Print Page Previous Next Advertisements ”;
DIP – Discussion
Discuss Java DIP ”; Previous Next Digital Image Processing (DIP) deals with manipulation of digital images using a digital computer. This tutorial gives a simple and practical approach of implementing algorithms used in digital image processing. After completing this tutorial, you should find yourself at a moderate level of expertise, from where you should be able to take yourself to next levels. Print Page Previous Next Advertisements ”;
DIP – Color Space Conversion
Java DIP – OpenCV Color Space Conversion ”; Previous Next In order to change color space of one image to another using OpenCV, we read image into BufferedImage and convert it into Mat Object. Its syntax is given below − File input = new File(“digital_image_processing.jpg”); BufferedImage image = ImageIO.read(input); //convert Buffered Image to Mat. OpenCv allows many color conversion types, all of which can be found in the Imgproc class. Some of the types are described briefly − Sr.No. Color Conversion Type 1 COLOR_RGB2BGR 2 COLOR_RGB2BGRA 3 COLOR_RGB2GRAY 4 COLOR_RGB2HLS 5 COLOR_RGB2HSV 6 COLOR_RGB2Luv 7 COLOR_RGB2YUV 8 COLOR_RGB2Lab From any of the color conversion type, just pass the appropriate one into method cvtColor() in the Imgproc class. Its syntax is given below − Imgproc.cvtColor(source mat, destination mat1, Color_Conversion_Code); The method cvtColor() takes three parameters which are the source image matrix, the destination image matrix and the color conversion type. Apart from the cvtColor() method, there are other methods provide by the Imgproc class. They are described briefly − Sr.No. Method & Description 1 cvtColor(Mat src, Mat dst, int code, int dstCn) It converts an image from one color space to another. 2 dilate(Mat src, Mat dst, Mat kernel) It dilates an image by using a specific structuring element. 3 equalizeHist(Mat src, Mat dst) It equalizes the histogram of a grayscale image. 4 filter2D(Mat src, Mat dst, int ddepth, Mat kernel, Point anchor, double delta) It convolves an image with the kernel. 5 GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) It blurs an image using a Gaussian filter. 6 integral(Mat src, Mat sum) It calculates the integral of an image. Example The following example demonstrates the use of Imgproc class to convert an image from one color space to another. import java.awt.image.BufferedImage; import java.awt.image.DataBufferByte; import java.io.File; import javax.imageio.ImageIO; import org.opencv.core.Core; import org.opencv.core.CvType; import org.opencv.core.Mat; import org.opencv.imgproc.Imgproc; public class Main { public static void main( String[] args ) { try { System.loadLibrary( Core.NATIVE_LIBRARY_NAME ); File input = new File(“digital_image_processing.jpg”); BufferedImage image = ImageIO.read(input); byte[] data = ((DataBufferByte) image.getRaster().getDataBuffer()).getData(); Mat mat = new Mat(image.getHeight(),image.getWidth(), CvType.CV_8UC3); mat.put(0, 0, data); Mat mat1 = new Mat(image.getHeight(), image.getWidth(), CvType.CV_8UC3); Imgproc.cvtColor(mat, mat1, Imgproc.COLOR_RGB2HSV); byte[] data1 = new byte[mat1.rows()*mat1.cols()*(int)(mat1.elemSize())]; mat1.get(0, 0, data1); BufferedImage image1 = new BufferedImage(mat1.cols(), mat1.rows(), 5); image1.getRaster().setDataElements(0, 0, mat1.cols(), mat1.rows(), data1); File ouptut = new File(“hsv.jpg”); ImageIO.write(image1, “jpg”, ouptut); } catch (Exception e) { System.out.println(“Error: ” + e.getMessage()); } } } Output When you execute the given example, it converts an image name digital_image_processing.jpg to its equivalent HSV color space image and writes it on hard disk with name hsv.jpg. Original Image (RGB) Converted Image (HSV) Print Page Previous Next Advertisements ”;
DIP – Robinson Operator
Java DIP – Robinson Operator ”; Previous Next Robinson compass masks are yet another type of derivative masks which are used for edge detection. This operator is also known as direction mask. In this operator we take one mask and rotate it in all the eight major directions to get edges of the eight directions. We are going to use OpenCV function filter2D to apply Robinson operator to images. It can be found under Imgproc package. Its syntax is given below − filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT ); The function arguments are described below − Sr.No. Argument & Description 1 src It is source image. 2 dst It is destination image. 3 depth It is the depth of dst. A negative value (such as -1) indicates that the depth is the same as the source. 4 kernel It is the kernel to be scanned through the image. 5 anchor It is the position of the anchor relative to its kernel. The location Point(-1, -1) indicates the center by default. 6 delta It is a value to be added to each pixel during the convolution. By default it is 0. 7 BORDER_DEFAULT We let this value by default. Apart from the filter2D method, there are other methods provided by the Imgproc class. They are described briefly − Sr.No. Method & Description 1 cvtColor(Mat src, Mat dst, int code, int dstCn) It converts an image from one color space to another. 2 dilate(Mat src, Mat dst, Mat kernel) It dilates an image by using a specific structuring element. 3 equalizeHist(Mat src, Mat dst) It equalizes the histogram of a grayscale image. 4 filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) It convolves an image with the kernel. 5 GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) It blurs an image using a Gaussian filter. 6 integral(Mat src, Mat sum) It calculates the integral of an image. Example The following example demonstrates the use of Imgproc class to apply Robinson operator to an image of Grayscale. import org.opencv.core.Core; import org.opencv.core.CvType; import org.opencv.core.Mat; import org.opencv.highgui.Highgui; import org.opencv.imgproc.Imgproc; public class convolution { public static void main( String[] args ) { try { int kernelSize = 9; System.loadLibrary( Core.NATIVE_LIBRARY_NAME ); Mat source = Highgui.imread(“grayscale.jpg”, Highgui.CV_LOAD_IMAGE_GRAYSCALE); Mat destination = new Mat(source.rows(),source.cols(),source.type()); Mat kernel = new Mat(kernelSize,kernelSize, CvType.CV_32F) { { put(0,0,-1); put(0,1,0); put(0,2,1); put(1,0-2); put(1,1,0); put(1,2,2); put(2,0,-1); put(2,1,0); put(2,2,1); } }; Imgproc.filter2D(source, destination, -1, kernel); Highgui.imwrite(“output.jpg”, destination); } catch (Exception e) { System.out.println(“Error: ” + e.getMessage()); } } } Output When you execute the given code, the following output is seen − Original Image This original image is convolved with the Robinson operator of North edges as given below − North Direction Mask -1 0 1 -2 0 2 -1 0 1 Convolved Image(Robinson North) This original image has also been convolved with the Robinson operator of East edges as given below − East Direction Mask -1 -2 -1 0 0 0 1 2 1 Convolved Image(Robinson East) Print Page Previous Next Advertisements ”;
Java DIP – Enhancing Image Contrast ”; Previous Next In this chapter learn how to enhance the contrast of an image using histogram equalization. We use the OpenCV function equalizeHist() method. It can be found under Imgproc package. Its syntax is given below − Imgproc.equalizeHist(source, destination); The parameters are described below − Sr.No. Parameter & Description 1 Source It is 8-bit single channel source image. 2 Destination It is the destination image. Apart from the equalizeHist() method, there are other methods provided by the Imgproc class. They are described briefly − Sr.No. Method & Description 1 cvtColor(Mat src, Mat dst, int code, int dstCn) It converts an image from one color space to another. 2 dilate(Mat src, Mat dst, Mat kernel) It dilates an image by using a specific structuring element. 3 equalizeHist(Mat src, Mat dst) It equalizes the histogram of a grayscale image. 4 filter2D(Mat src, Mat dst, int ddepth, Mat kernel, Point anchor, double delta) It convolves an image with the kernel. 5 GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) It blurs an image using a Gaussian filter. 6 integral(Mat src, Mat sum) It calculates the integral of an image. Example The following example demonstrates the use of Imgproc class to enhance contrast of an image − import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.highgui.Highgui; import org.opencv.imgproc.Imgproc; public class Main { static int width; static int height; static double alpha = 2; static double beta = 50; public static void main( String[] args ) { try { System.loadLibrary( Core.NATIVE_LIBRARY_NAME ); Mat source = Highgui.imread(“grayscale.jpg”, Highgui.CV_LOAD_IMAGE_GRAYSCALE); Mat destination = new Mat(source.rows(),source.cols(),source.type()); Imgproc.equalizeHist(source, destination); Highgui.imwrite(“contrast.jpg”, destination); } catch (Exception e) { System.out.println(“error: ” + e.getMessage()); } } } Output When you execute the given code, the following output is seen − Original Image Enhanced Contrast Image Print Page Previous Next Advertisements ”;
Java DIP – Understand Convolution ”; Previous Next Convolution is a mathematical operation on two functions f and g. The function f and g in this case are images, since an image is also a two dimensional function. Performing Convolution In order to perform convolution on an image, following steps are taken − Flip the mask (horizontally and vertically) only once. Slide the mask onto the image. Multiply the corresponding elements and then add them. Repeat this procedure until all values of the image has been calculated. We use OpenCV function filter2D to apply convolution to images. It can be found under Imgproc package. Its syntax is given below − filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT ); The function arguments are described below − Sr.No. Argument & Description 1 src It is source image. 2 dst It is destination image. 3 depth It is the depth of dst. A negative value (such as -1) indicates that the depth is the same as the source. 4 kernel It is the kernel to be scanned through the image. 5 anchor It is the position of the anchor relative to its kernel. The location Point (-1, -1) indicates the center by default. 6 delta It is a value to be added to each pixel during the convolution. By default it is 0. 7 BORDER_DEFAULT We let this value by default. Example The following example demonstrates the use of Imgproc class to perform convolution on an image of Grayscale. import org.opencv.core.Core; import org.opencv.core.CvType; import org.opencv.core.Mat; import org.opencv.highgui.Highgui; import org.opencv.imgproc.Imgproc; public class convolution { public static void main( String[] args ) { try { int kernelSize = 3; System.loadLibrary( Core.NATIVE_LIBRARY_NAME ); Mat source = Highgui.imread(“grayscale.jpg”, Highgui.CV_LOAD_IMAGE_GRAYSCALE); Mat destination = new Mat(source.rows(),source.cols(),source.type()); Mat kernel = new Mat(kernelSize,kernelSize, CvType.CV_32F) { { put(0,0,0); put(0,1,0); put(0,2,0); put(1,0,0); put(1,1,1); put(1,2,0); put(2,0,0); put(2,1,0); put(2,2,0); } }; Imgproc.filter2D(source, destination, -1, kernel); Highgui.imwrite(“original.jpg”, destination); } catch (Exception e) { System.out.println(“Error:” + e.getMessage()); } } } Output In this example we convolve our image with the following filter(kernel). This filter results in producing original image as it is − 0 0 0 0 1 0 0 0 0 Original Image Convolved Image Print Page Previous Next Advertisements ”;
DIP – Create Zooming Effect
Java DIP – Create Zooming Effect ”; Previous Next Zooming is the process of enlarging an image so that the details in the image become more visible and prominent. We use OpenCV function resize to apply zooming to images. It can be found under Imgproc package. Its syntax is given below − Imgproc.resize(source,destination, destination.size(),zoomFactor,zoomFactor,Interpolation); In the resize function, we pass source image, destination image and its size, zooming factor, and the interpolation method to use. The interpolation methods available are described below − Sr.No. Interpolation method & Description 1 INTER_NEAREST It is nearest-neighbour interpolation. 2 INTER_LINEAR It is bilinear interpolation (used by default). 3 INTER_AREA It is resampling using pixel area relation. It may be a preferred method for image decimation, as it gives more-free results. 4 INTER_CUBIC It is a bi-cubic interpolation over 4×4 pixel neighbourhood. 5 INTER_LANCZOS4 It is a Lanczos interpolation over 8×8 pixel neighbourhood. Apart from the resize method, there are other methods provided by the Imgproc class. They are described briefly − Sr.No. Method & Description 1 cvtColor(Mat src, Mat dst, int code, int dstCn) It converts an image from one color space to another. 2 dilate(Mat src, Mat dst, Mat kernel) It dilates an image by using a specific structuring element. 3 equalizeHist(Mat src, Mat dst) It equalizes the histogram of a grayscale image. 4 filter2D(Mat src, Mat dst, int ddepth, Mat kernel, Point anchor, double delta) It convolves an image with the kernel. 5 GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) It blurs an image using a Gaussian filter. 6 integral(Mat src, Mat sum) It calculates the integral of an image. Example The following example demonstrates the use of Imgproc class to apply zooming to an image. import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.highgui.Highgui; import org.opencv.imgproc.Imgproc; public class Main { public static void main( String[] args ) { try { int zoomingFactor = 2; System.loadLibrary( Core.NATIVE_LIBRARY_NAME ); Mat source = Highgui.imread(“image.jpg”, Highgui.CV_LOAD_IMAGE_GRAYSCALE); Mat destination = new Mat(source.rows() * zoomingFactor, source.cols()* zoomingFactor,source.type()); Imgproc.resize(source, destination, destination.size(), zoomingFactor,zoomingFactor,Imgproc.INTER_NEAREST); Highgui.imwrite(“zoomed.jpg”, destination); } catch (Exception e) { System.out.println(“Error: “+e.getMessage()); } } } Output When you execute the given code, the following output is seen − Original Image Zoomed Image(Zooming factor − 2) Print Page Previous Next Advertisements ”;
Java BufferedImage Class ”; Previous Next Java BufferedImage class is a subclass of Image class. It is used to handle and manipulate the image data. A BufferedImage is made of ColorModel of image data. All BufferedImage objects have an upper left corner coordinate of (0, 0). Constructors This class supports three types of constructors. The first constructor constructs a new BufferedImage with a specified ColorModel and Raster. BufferedImage(ColorModel cm, WritableRaster raster, boolean isRasterPremultiplied, Hashtable<?,?> properties) The second constructor constructs a BufferedImage of one of the predefined image types. BufferedImage(int width, int height, int imageType) The third constructor constructs a BufferedImage of one of the predefined image types: TYPE_BYTE_BINARY or TYPE_BYTE_INDEXED. BufferedImage(int width, int height, int imageType, IndexColorModel cm) Sr.No Method & Description 1 copyData(WritableRaster outRaster) It computes an arbitrary rectangular region of the BufferedImage and copies it into a specified WritableRaster. 2 getColorModel() It returns object of class ColorModel of an image. 3 getData() It returns the image as one large tile. 4 getData(Rectangle rect) It computes and returns an arbitrary region of the BufferedImage. 5 getGraphics() This method returns a Graphics2D, retains backwards compatibility. 6 getHeight() It returns the height of the BufferedImage. 7 getMinX() It returns the minimum x coordinate of this BufferedImage. 8 getMinY() It returns the minimum y coordinate of this BufferedImage. 9 getRGB(int x, int y) It returns an integer pixel in the default RGB color model (TYPE_INT_ARGB) and default sRGB colorspace. 10 getType() It returns the image type. Example The following example demonstrates the use of java BufferedImage class that draw some text on the screen using Graphics Object − import java.awt.Graphics; import java.awt.Image; import java.awt.image.BufferedImage; import javax.swing.JFrame; import javax.swing.JPanel; public class Test extends JPanel { public void paint(Graphics g) { Image img = createImageWithText(); g.drawImage(img, 20,20,this); } private Image createImageWithText() { BufferedImage bufferedImage = new BufferedImage(200,200,BufferedImage.TYPE_INT_RGB); Graphics g = bufferedImage.getGraphics(); g.drawString(“www.tutorialspoint.com”, 20,20); g.drawString(“www.tutorialspoint.com”, 20,40); g.drawString(“www.tutorialspoint.com”, 20,60); g.drawString(“www.tutorialspoint.com”, 20,80); g.drawString(“www.tutorialspoint.com”, 20,100); return bufferedImage; } public static void main(String[] args) { JFrame frame = new JFrame(); frame.getContentPane().add(new Test()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(200, 200); frame.setVisible(true); } } Output When you execute the given code, the following output is seen − Print Page Previous Next Advertisements ”;
DIP – Open Source Libraries
Java DIP – Open Source Libraries ”; Previous Next In this chapter, we explore some of the free image processing libraries that are widely used and can be easily integrated in the project. These libraries include − ImageJ Fiji Commons Imaging ImageMagick Endrov LeadTools OpenCv ImageJ ImageJ is a public domain Java image processing program inspired by NIH Image for the Macintosh. It can display, edit, analyze, process, save, and print 8-bit, 16-bit, and 32-bit images. Some of the basic features of ImageJ are described below − Sr.No. Feature & Description 1 Runs Everywhere ImageJ is written in Java, which allows it to run on Linux, Mac OS X and Windows, in both 32-bit and 64-bit modes. 2 Open Source ImageJ and its Java source code are freely available and in the public domain. 3 Toolkit Use ImageJ as an image processing toolkit (class library) to develop applets, servlets, or applications. 4 Data Types 8-bit grayscale or indexed color, 16-bit unsigned integer, 32-bit floating-point, and RGB color. 5 File Formats Open and save GIF, JPEG, BMP, PNG, PGM, FITS, and ASCII. Open DICOM. Open TIFFs, GIFs, JPEGs, DICOMs, and raw data using a URL. 6 Selections Create rectangular, elliptical, or irregular area selections. Create line and point selections. 7 Image Enhancement Supports smoothing, sharpening, edge detection, median filtering, and thresholding on both 8-bit grayscale and RGB color images. 8 Color Processing Split a 32-bit color image into RGB or HSV components. Merge 8-bit components into a color image. Fiji Fiji is an image processing package. It can be described as a distribution of ImageJ (and ImageJ2) together with Java, Java3D, and a lot of plug-ins organized into a coherent menu structure. Fiji compares to ImageJ as Ubuntu compares to Linux. Apart from the ImageJ basic features, some of the advanced features of Fiji are described below − Sr.No. Feature & Description 1 Registering 3D images This involves Elastic Alignment and Montage, Feature Extraction, Image Stabilizer etc. 2 Segmenting images It offers more than 35 types of segmentation. 3 Useful keyboard short cuts Fuji has a lot of keyboard short-cuts. 4 Scripting Allow scripting with Macros, in JavaScript, JRuby, Jython, Clojure, and Beanshell. 5 Developing Plug-ins Use the Script Editor to start developing plug-ins and then run the plug-ins. 6 ImageJ Tricks ImageJ is easy to use, but sometimes you wish for some function that is actually implemented, yet you do not know how to trigger. Commons Imaging Apache Commons Imaging, previously known as Apache Commons Sanselan, is a library that reads and writes a variety of image formats, including fast parsing of image information such as(size, color, space, ICC profile, etc.) and the meta data. Some of the basic features of ImageJ are described below − Sr.No. Feature & Description 1 Java Apache Commons Imaging is written in 100% pure Java. It executes on any JVM, and any platform, without modification. 2 Image Formats It reads and writes a wide variety of image formats, and supports some variations and encodings missed by all or most other libraries. 3 Metadata support It supports reading and writing a variety of meta data in a structured way, including EXIF meta data. 4 Network Friendly It is network-friendly. Commons Imaging only reads the data it needs, and caches what is read so that it is not too heavy on the network. 5 Easy to use It is designed to be very easy to use. It has a simple, clean interface. Most operations are a single Imaging method calls. 6 Transparent Commons Imaging aims to be transparent. There are no hidden buffers to dispose, no native memory to free, no background threads. 7 Open Source It is Free Software/Open Source. It is available under the Apache Software License. 8 Color Conversions The ColorConversions class offers methods to convert between the following color spaces − CIE-L*CH, CIE-L*ab, CIE-L*uv, CMY, CMYK, HSL, HSV, Hunter-Lab, RGB, XYZ, and YXY. ImageMagick ImageMagick is a software suite to create, edit, compose, or convert bitmap images. It can read and write images in more than 100 formats including DPX, EXR, GIF, JPEG, JPEG-2000, PDF, PNG, Postscript, SVG, and TIFF. Use ImageMagick to resize, flip, mirror, rotate, distort, shear, and transform images, adjust image colors, apply various special effects, or draw text, lines, polygons, ellipses, and Bezier curve. Some of the basic features of ImageMagick are described below − Sr.No. Feature & Description 1 Format conversion It converts an image from one format to another (e.g. PNG to JPEG). 2 Transform It can resize, rotate, crop, flip or trim an image. 3 Transparency It renders portions of an image invisible. 4 Draw It adds shapes or text to an image. 5 Decorate It adds a border or frame to an image. 6 Special effects It can Blur, sharpen, threshold, or tint an image. 7 Animation It can create a GIF animation sequence from a group of images. 8 Composite It can overlap one image over another. 9 Morphology of shapes It extracts features, describe shapes and recognize patterns in images. 10 Encipher or decipher an image It converts ordinary images into unintelligible gibberish and back again. Endrov Endrov is a multi-purpose image analysis program. It is written independently and designed to address many of the shortcomings of other free software and many commercial packages. Some of the basic features of Endrov are described below − Sr.No. Feature & Description 1 View data It views data, in 2D and 3D. Designed to handle complex 4D data schemes and unlimited number of channels, where each channel can have its own X, Y, and Z resolution. 2 Annotate your images It annotates your images, automatically or by hand, to understand them and get statistics. 3 Undo and Redo It can undo and redo for all operations. 4 Lazy Evaluation It is designed from the ground to handle large image sets. Endrov uses lazy evaluation, a concept mostly available in research programming languages. 5 Scripting language It supports graphical scripting language, as