• 形态学处理,除了最基本的膨胀、腐蚀、开/闭运算、黑/白帽处理外,还有一些更高级的运用,如凸包,连通区域标记,删除小块区域等。 1、凸包 凸包是指一个凸多边形,这个凸多边形将图片中所有的白色像素点都包含...

    转:https://www.cnblogs.com/denny402/p/5166258.html

    形态学处理,除了最基本的膨胀、腐蚀、开/闭运算、黑/白帽处理外,还有一些更高级的运用,如凸包,连通区域标记,删除小块区域等。

    1、凸包

    凸包是指一个凸多边形,这个凸多边形将图片中所有的白色像素点都包含在内。

    函数为:

    skimage.morphology.convex_hull_image(image)

    输入为二值图像,输出一个逻辑二值图像。在凸包内的点为True, 否则为False

    例:

    复制代码

    import matplotlib.pyplot as plt
    from skimage import data,color,morphology
    
    #生成二值测试图像
    img=color.rgb2gray(data.horse())
    img=(img<0.5)*1
    
    chull = morphology.convex_hull_image(img)
    
    #绘制轮廓
    fig, axes = plt.subplots(1,2,figsize=(8,8))
    ax0, ax1= axes.ravel()
    ax0.imshow(img,plt.cm.gray)
    ax0.set_title('original image')
    
    ax1.imshow(chull,plt.cm.gray)
    ax1.set_title('convex_hull image')

    复制代码

    convex_hull_image()是将图片中的所有目标看作一个整体,因此计算出来只有一个最小凸多边形。如果图中有多个目标物体,每一个物体需要计算一个最小凸多边形,则需要使用convex_hull_object()函数。

    函数格式:skimage.morphology.convex_hull_object(imageneighbors=8)

    输入参数image是一个二值图像,neighbors表示是采用4连通还是8连通,默认为8连通。

    例:

    复制代码

    import matplotlib.pyplot as plt
    from skimage import data,color,morphology,feature
    
    #生成二值测试图像
    img=color.rgb2gray(data.coins())
    #检测canny边缘,得到二值图片
    edgs=feature.canny(img, sigma=3, low_threshold=10, high_threshold=50) 
    
    chull = morphology.convex_hull_object(edgs)
    
    #绘制轮廓
    fig, axes = plt.subplots(1,2,figsize=(8,8))
    ax0, ax1= axes.ravel()
    ax0.imshow(edgs,plt.cm.gray)
    ax0.set_title('many objects')
    ax1.imshow(chull,plt.cm.gray)
    ax1.set_title('convex_hull image')
    plt.show()

    复制代码

    2、连通区域标记

    在二值图像中,如果两个像素点相邻且值相同(同为0或同为1),那么就认为这两个像素点在一个相互连通的区域内。而同一个连通区域的所有像素点,都用同一个数值来进行标记,这个过程就叫连通区域标记。在判断两个像素是否相邻时,我们通常采用4连通或8连通判断。在图像中,最小的单位是像素,每个像素周围有8个邻接像素,常见的邻接关系有2种:4邻接与8邻接。4邻接一共4个点,即上下左右,如下左图所示。8邻接的点一共有8个,包括了对角线位置的点,如下右图所示。

    在skimage包中,我们采用measure子模块下的label()函数来实现连通区域标记。

    函数格式:

    skimage.measure.label(image,connectivity=None)

    参数中的image表示需要处理的二值图像,connectivity表示连接的模式,1代表4邻接,2代表8邻接。

    输出一个标记数组(labels), 从0开始标记。

    复制代码

    import numpy as np
    import scipy.ndimage as ndi
    from skimage import measure,color
    import matplotlib.pyplot as plt
    
    #编写一个函数来生成原始二值图像
    def microstructure(l=256):
        n = 5
        x, y = np.ogrid[0:l, 0:l]  #生成网络
        mask = np.zeros((l, l))
        generator = np.random.RandomState(1)  #随机数种子
        points = l * generator.rand(2, n**2)
        mask[(points[0]).astype(np.int), (points[1]).astype(np.int)] = 1
        mask = ndi.gaussian_filter(mask, sigma=l/(4.*n)) #高斯滤波
        return mask > mask.mean()
    
    data = microstructure(l=128)*1 #生成测试图片
    
    labels=measure.label(data,connectivity=2)  #8连通区域标记
    dst=color.label2rgb(labels)  #根据不同的标记显示不同的颜色
    print('regions number:',labels.max()+1)  #显示连通区域块数(从0开始标记)
    
    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 4))
    ax1.imshow(data, plt.cm.gray, interpolation='nearest')
    ax1.axis('off')
    ax2.imshow(dst,interpolation='nearest')
    ax2.axis('off')
    
    fig.tight_layout()
    plt.show()

    复制代码

    在代码中,有些地方乘以1,则可以将bool数组快速地转换为int数组。

    结果如图:有10个连通的区域,标记为0-9

    如果想分别对每一个连通区域进行操作,比如计算面积、外接矩形、凸包面积等,则需要调用measure子模块的regionprops()函数。该函数格式为:

    skimage.measure.regionprops(label_image)

    返回所有连通区块的属性列表,常用的属性列表如下表:

    属性名称 类型 描述
    area int 区域内像素点总数
    bbox tuple 边界外接框(min_row, min_col, max_row, max_col)
    centroid array   质心坐标
    convex_area int 凸包内像素点总数
    convex_image ndarray 和边界外接框同大小的凸包  
    coords ndarray 区域内像素点坐标
    Eccentricity  float 离心率
    equivalent_diameter  float 和区域面积相同的圆的直径
    euler_number int   区域欧拉数
    extent  float 区域面积和边界外接框面积的比率
    filled_area int 区域和外接框之间填充的像素点总数
    perimeter  float 区域周长
    label int 区域标记

     

    3、删除小块区域

    有些时候,我们只需要一些大块区域,那些零散的、小块的区域,我们就需要删除掉,则可以使用morphology子模块的remove_small_objects()函数。

    函数格式:skimage.morphology.remove_small_objects(armin_size=64connectivity=1in_place=False)

    参数:

    ar: 待操作的bool型数组。

    min_size: 最小连通区域尺寸,小于该尺寸的都将被删除。默认为64.

    connectivity: 邻接模式,1表示4邻接,2表示8邻接

    in_place: bool型值,如果为True,表示直接在输入图像中删除小块区域,否则进行复制后再删除。默认为False.

    返回删除了小块区域的二值图像。

    复制代码

    import numpy as np
    import scipy.ndimage as ndi
    from skimage import morphology
    import matplotlib.pyplot as plt
    
    #编写一个函数来生成原始二值图像
    def microstructure(l=256):
        n = 5
        x, y = np.ogrid[0:l, 0:l]  #生成网络
        mask = np.zeros((l, l))
        generator = np.random.RandomState(1)  #随机数种子
        points = l * generator.rand(2, n**2)
        mask[(points[0]).astype(np.int), (points[1]).astype(np.int)] = 1
        mask = ndi.gaussian_filter(mask, sigma=l/(4.*n)) #高斯滤波
        return mask > mask.mean()
    
    data = microstructure(l=128) #生成测试图片
    
    dst=morphology.remove_small_objects(data,min_size=300,connectivity=1)
    
    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 4))
    ax1.imshow(data, plt.cm.gray, interpolation='nearest')
    ax2.imshow(dst,plt.cm.gray,interpolation='nearest')
    
    fig.tight_layout()
    plt.show()

    复制代码

    在此例中,我们将面积小于300的小块区域删除(由1变为0),结果如下图:

     

     4、综合示例:阈值分割+闭运算+连通区域标记+删除小区块+分色显示

    复制代码

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.patches as mpatches
    from skimage import data,filter,segmentation,measure,morphology,color
    
    #加载并裁剪硬币图片
    image = data.coins()[50:-50, 50:-50]
    
    thresh =filter.threshold_otsu(image) #阈值分割
    bw =morphology.closing(image > thresh, morphology.square(3)) #闭运算
    
    cleared = bw.copy()  #复制
    segmentation.clear_border(cleared)  #清除与边界相连的目标物
    
    label_image =measure.label(cleared)  #连通区域标记
    borders = np.logical_xor(bw, cleared) #异或
    label_image[borders] = -1
    image_label_overlay =color.label2rgb(label_image, image=image) #不同标记用不同颜色显示
    
    fig,(ax0,ax1)= plt.subplots(1,2, figsize=(8, 6))
    ax0.imshow(cleared,plt.cm.gray)
    ax1.imshow(image_label_overlay)
    
    for region in measure.regionprops(label_image): #循环得到每一个连通区域属性集
        
        #忽略小区域
        if region.area < 100:
            continue
    
        #绘制外包矩形
        minr, minc, maxr, maxc = region.bbox
        rect = mpatches.Rectangle((minc, minr), maxc - minc, maxr - minr,
                                  fill=False, edgecolor='red', linewidth=2)
        ax1.add_patch(rect)
    fig.tight_layout()
    plt.show()

    复制代码

    展开全文
  • skimage提供了io模块,顾名思义,这个模块是用来图片输入输出操作的。为了方便练习,也提供一个data模块,里面嵌套了一些示例图片,我们可以直接使用。 引入skimage模块可用: ...读取单张彩色rgb图片,使用...
  • 2.图像处理分类 低级处理:输入,输出都是图像,例如降噪,对比度增强,图像锐化 中级处理:输入,输出都为图像特征,边缘,轮廓,物体标识 高级処理:输入为图像,输出涉及理解,识别目标总体 ...
  • python图像处理基础(一) 写在前面的话: 方便以后查文档,且这篇文章会随着学习一直更(因为还有opencv还没怎么学,目前是一些基本的操作)。都是跟着学习资料巩固的,只供学习使用。 第一部分—— 图像基本操作 ...
  • 假设f(x,y),g(x,y)分别为两幅已知的图像图像的线性操作就是直接在每个位置的像素上做运算(两幅图像的尺寸需保持一致),最终得到的图像s(x,y),可能会出现以下问题: 1)会出现不在 [ 0-255 ] 之间的像素点存在,最...
  • python数字图像处理 2018-06-15 15:32:40
    PIL(python2) Pillow(python3) opencv scikit-image matplotlib
  • python数字图像处理-图像的基本结构和基础知识一、python实现BMP图像的读取和显示BMP文件格式,又称为Bitmap(位图)或是DIB(Device-Independent Device,设备无关位图),是Windows系统中广泛使用的图像文件格式。...
  • 这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、...
  • 图像的形变与缩放,使用的是skimage的transform模块,函数比较多,功能齐全。 1、改变图片尺寸resize 函数格式为: skimage.transform.resize(image, output_shape) image: 需要改变尺寸的图片 ...
  • 我的Windows由于TensorFlow环境关系,安装了python3.7.1和3.6两个版本,IDLE spyder同样,因此这里我就都给安装了。 【1】3.7.1的skimage安装 ☞功能键+R,打开窗口,再打开CMD命令行窗口 ☞用pip安装:pip ...
  • Python数字图像处理 2017-06-22 20:18:26
    转:宁静家园python数字图像处理(1):环境安装和配置python数字图像处理(2):图像的读取、显示与保存python数字图像处理(3):图像像素的访问与裁剪python数字图像处理(4):图像数据类型及颜色空间转换python...
  • python数字图像处理-图像噪声与去噪算法图像噪声椒盐噪声概述: 椒盐噪声(salt & pepper noise)是数字图像的一个常见噪声,所谓椒盐,椒就是黑,盐就是白,椒盐噪声就是在图像上随机出现黑色白色的像素。...
  • 在前面的python数字图像处理(10):图像简单滤波 中,我们已经讲解了很多算子用来检测边缘,其中用得最多的canny算子边缘检测。 本篇我们讲解一些其它方法来检测轮廓。 1、查找轮廓(find_contours) ...
  • 一提到数字图像处理编程,可能大多数人就会想到matlab,但matlab也有自身的缺点: 1、不开源,价格贵 2、软件容量大。一般3G以上,高版本甚至达5G以上。 3、只能做研究,不易转化成软件。 因此,我们这里使用...
  • 有时候需要对一批图片处理。这时候可以调用程序自带的图片集合来处理。 skimage.io.ImageCollection(load_pattern,load_func=None)这个函数是在io模块内,带两个参数,第一个必啊哈四图片数组路径,可以时候一个str...
  • https://www.cnblogs.com/denny402/p/5123772.html
  • 图像处理中,直方图是非常重要,也是非常有用的一个处理要素。 在skimage库中对直方图的处理,是放在exposure这个模块中。 1、计算直方图 函数:skimage.exposure.histogram(image, nbins=256) 在...
  • 本文提供更多更强大的滤波方法,这些方法放在filters.rank子模块内。 这些方法需要用户自己设定滤波器的形状和大小,因此需要导入morphology模块来设定。 1、autolevel ...这个词在photoshop里面翻译成自动色阶,...
1 2 3 4 5 ... 20
收藏数 36,070
精华内容 14,428