>>> import numpy as np
>>> import pylab as pl
>>> from scipy import ndimage

1.5.11.4. Example of solution for the image processing exercise: unmolten grains in glass

../../_images/MV_HFV_012.jpg
  1. 打开图像文件MV_HFV_012.jpg并显示。浏览imshow文档字符串中的关键字参数,以“右”方向显示图像(原点在左下角,而不是标准数组的左上角)。

    >>> dat = pl.imread('data/MV_HFV_012.jpg')
    
  2. 裁剪图像以删除带有测量信息的下面板。

    >>> dat = dat[:-60]
    
  3. 使用中值滤波器稍微滤波图像,以便改进其直方图。检查直方图的变化。

    >>> filtdat = ndimage.median_filter(dat, size=(7,7))
    
    >>> hi_dat = np.histogram(dat, bins=np.arange(256))
    >>> hi_filtdat = np.histogram(filtdat, bins=np.arange(256))
    ../../_images/exo_histos.png
  4. 使用滤波图像的直方图,确定允许定义沙像素,玻璃像素和气泡像素的蒙版的阈值。其他选项(家庭作业):写一个函数,从直方图的最小值自动确定阈值。

    >>> void = filtdat <= 50
    
    >>> sand = np.logical_and(filtdat > 50, filtdat <= 114)
    >>> glass = filtdat > 114
  5. 显示其中三个相用三种不同颜色着色的图像。

    >>> phases = void.astype(np.int) + 2*glass.astype(np.int) + 3*sand.astype(np.int)
    
    ../../_images/three_phases.png
  6. 使用数学形态学来清洁不同的相。

    >>> sand_op = ndimage.binary_opening(sand, iterations=2)
    
  7. 为所有气泡和砂粒标记属性,并从砂面中移除小于10像素的颗粒。为此,请使用ndimage.sumnp.bincount计算粒度。

    >>> sand_labels, sand_nb = ndimage.label(sand_op)
    
    >>> sand_areas = np.array(ndimage.sum(sand_op, sand_labels, np.arange(sand_labels.max()+1)))
    >>> mask = sand_areas > 100
    >>> remove_small_sand = mask[sand_labels.ravel()].reshape(sand_labels.shape)
    ../../_images/sands.png
  8. 计算气泡的平均尺寸。

    >>> bubbles_labels, bubbles_nb = ndimage.label(void)
    
    >>> bubbles_areas = np.bincount(bubbles_labels.ravel())[1:]
    >>> mean_bubble_size = bubbles_areas.mean()
    >>> median_bubble_size = np.median(bubbles_areas)
    >>> mean_bubble_size, median_bubble_size
    (1699.875, 65.0)