Introduction


  • Simple Python and skimage (scikit-image) techniques can be used to solve genuine image analysis problems.
  • Morphometric problems involve the number, shape, and / or size of the objects in an image.

Image Basics


  • Digital images are represented as rectangular arrays of square pixels.
  • Digital images use a left-hand coordinate system, with the origin in the upper left corner, the x-axis running to the right, and the y-axis running down. Some learners may prefer to think in terms of counting down rows for the y-axis and across columns for the x-axis. Thus, we will make an effort to allow for both approaches in our lesson presentation.
  • Most frequently, digital images use an additive RGB model, with eight bits for the red, green, and blue channels.
  • skimage images are stored as multi-dimensional NumPy arrays.
  • In skimage images, the red channel is specified first, then the green, then the blue, i.e., RGB.
  • Lossless compression retains all the details in an image, but lossy compression results in loss of some of the original image detail.
  • BMP images are uncompressed, meaning they have high quality but also that their file sizes are large.
  • JPEG images use lossy compression, meaning that their file sizes are smaller, but image quality may suffer.
  • TIFF images can be uncompressed or compressed with lossy or lossless compression.
  • Depending on the camera or sensor, various useful pieces of information may be stored in an image file, in the image metadata.

Working with skimage


  • Images are read from disk with the iio.imread() function.
  • We create a window that automatically scales the displayed image with matplotlib and calling show() on the global figure object.
  • Colour images can be transformed to grayscale using skimage.color.rgb2gray() or, in many cases, be read as grayscale directly by passing the argument mode="L" to iio.imread().
  • We can resize images with the skimage.transform.resize() function.
  • NumPy array commands, such as image[image < 128] = 0, can be used to manipulate the pixels of an image.
  • Array slicing can be used to extract sub-images or modify areas of images, e.g., clip = image[60:150, 135:480, :].
  • Metadata is not retained when images are loaded as skimage images.

Drawing and Bitwise Operations


  • We can use the NumPy zeros() function to create a blank, black image.
  • We can draw on skimage images with functions such as skimage.draw.rectangle(), skimage.draw.disk(), skimage.draw.line(), and more.
  • The drawing functions return indices to pixels that can be set directly.

Creating Histograms


  • In many cases, we can load images in grayscale by passing the mode="L" argument to the iio.imread() function.
  • We can create histograms of images with the np.histogram function.
  • We can separate the RGB channels of an image using slicing operations.
  • We can display histograms using the matplotlib pyplot figure(), title(), xlabel(), ylabel(), xlim(), plot(), and show() functions.

Blurring Images


  • Applying a low-pass blurring filter smooths edges and removes noise from an image.
  • Blurring is often used as a first step before we perform thresholding or edge detection.
  • The Gaussian blur can be applied to an image with the skimage.filters.gaussian() function.
  • Larger sigma values may remove more noise, but they will also remove detail from an image.

Thresholding


  • Thresholding produces a binary image, where all pixels with intensities above (or below) a threshold value are turned on, while all other pixels are turned off.
  • The binary images produced by thresholding are held in two-dimensional NumPy arrays, since they have only one colour value channel. They are boolean, hence they contain the values 0 (off) and 1 (on).
  • Thresholding can be used to create masks that select only the interesting parts of an image, or as the first step before edge detection or finding contours.

Connected Component Analysis


  • We can use skimage.measure.label to find and label connected objects in an image.
  • We can use skimage.measure.regionprops to measure properties of labeled objects.
  • We can use skimage.morphology.remove_small_objects to mask small objects and remove artifacts from an image.
  • We can display the labeled image to view the objects coloured by label.

Capstone Challenge


  • Using thresholding, connected component analysis and other tools we can automatically segment images of bacterial colonies.
  • These methods are useful for many scientific problems, especially those involving morphometrics.