美文网首页程序员
基本的图像数据处理和分析

基本的图像数据处理和分析

作者: UlissesJr | 来源:发表于2018-10-24 22:22 被阅读36次

    skimage的基本用法

    #skimage
    import skimage 
    import matplotlib.pyplot as plt
    import numpy as np
    #随机生成500*500的多维数组
    random_image = np.random.random([500,500])
    plt.imshow(random_image,cmap='gray')
    plt.colorbar()
    
    from skimage import data
    #加载skimage中的coin数据
    coins = data.coins()
    
    print(type(coins),coins.dtype,coins.shape)
    plt.imshow(coins,cmap='gray')
    plt.colorbar()
    
    #图片基本信息
    cat = data.chelsea()
    print("图片形状:",cat.shape)
    print("最大值,最小值:",cat.min(),cat.max())
    plt.imshow(cat)
    plt.colorbar()
    
    #红色通道
    plt.imshow(cat[:,:,0])
    plt.colorbar()
    
    #在图片上叠加一个红色的方块
    cat[10:110,10:110,:] = [255,0,0] #[red,green,blue]
    plt.imshow(cat)
    
    #数据类型和像素值
    #生成0-1间的2500个数据
    linear0 = np.linspace(0,1,2500).reshape((50,50))
    #生成0-255之间的2500个数据
    linear1 = np.linspace(0,255,2500).reshape(50,50).astype(np.uint8)
    
    print("linear0:",linear0.dtype,linear0.min(),linear0.max())
    print("linear1:",linear1.dtype,linear1.min(),linear1.max())
    
    fig,(ax0,ax1) = plt.subplots(1,2)
    ax0.imshow(linear0,cmap="gray")
    ax1.imshow(linear1,cmap="gray")
    
    #显示图像
    image = data.camera()
    fig,(ax_jet,ax_gray) = plt.subplots(ncols=2,figsize=(10,5))
    #使用不同的color map
    ax_jet.imshow(image,cmap='jet')
    ax_gray.imshow(image,cmap='gray')
    
    #通过数组切片操作获取人脸区域
    face = image[80:160,200:280]
    fig,(ax_jet,ax_gray) = plt.subplots(ncols=2)
    ax_jet.imshow(face,cmap="jet")
    ax_gray.imshow(face,cmap="gray")
    

    #图像的IO操作
    from skimage import io
    image = io.imread('./images.png')
    print(type(image))
    plt.imshow(image)
    #同时加载多个图像
    ic = io.imread_collection('./*.png')
    print(type(ic),'\n\n',ic))
    
    f,axes = plt.subplots(nrows=1,ncols=len(ic),figsize(15,10))
    #enumerate返回的是带索引的(枚举) 对象
    for i,image in enumerate(ic):
        axes[i].imshow(image)
        axes[i].axis('off')
    
    #保存图像
    saved_img = ic[0]
    io.imsave('./',saved_img)
    
    #色彩转换
    #RGB转GRAY
    skimage.color.rgb2gray()
    #颜色直方图
    #直方图是一种快速的描述图像整体像素分布的统计信息
    skimage.exposure.histogram
    #可以根据直方图选定阈值用于调节图像对比度
    

    直方图是在展平图像上计算的:对于彩色图像,应在每个通道上单独使用该功能,以获得每个颜色通道的直方图。
    exposure.histogram()
    输入:
    图像:数组 输入图像。
    nbins:int 用于计算直方图的区间数。整数数组将忽略此值。

    返回值:
    hist:数组 直方图的值。
    bin_centers:数组 bins中心的值。

    如果您想在曲线下方填充颜色,请使用fill_between()

    #彩色图像直方图
    cat = data.chelsea()
    
    #R通道
    hist_r,bin_centers_r = exposure.histogram(cat[:,:,0])
    #G通道
    hist_g,bin_centers_g = exposure.histogram(cat[:,:,1])
    #B通道
    hist_b,bin_centers_b = exposure.histogram(cat[:,:,2])
    
    fig,(ax_r,ax_g,ax_b) = plt.subplots(ncols=3,figsize=(10,5))
    #ax = plt.gca()
    ax_r.fill_between(bin_centers_r,hist_r)
    ax_g.fill_between(bin_centers_g,hist_g)
    ax_b.fill_between(bin_centers_b,hist_b)
    

    对比度

    • 增强图像数据的对比度有利于特征的提取,不论是从肉眼还是算法来看都有帮助
    • 更改对比范围
      skimage.exposure.rescale_intensity(image,in_range=(min,max))
      元图数据中,小于min的像素值设为0,大于max的像素值设为255
    • 直方图均衡化
      自动调整图像的对比度skimage.exposure.equalize_hist(image)
      [注意】均衡化后的图像数据范围是[0,1]
    #原图像
    image = data.camera()
    hist,bin_centers = exposure.histogram(image)
    
    #改变对比度
    #image中小于10的像素值设为0,大于180的像素值设为255
    high_contrast = exposure.rescale_intensity(image,in_range=(10,180))
    hist2,bin_center2 = exposure.histogram(high_contrast)
    #图像对比
    fig,(ax_1,ax_2) = plt.subplots(ncols=2,figsize=(10,5))
    ax_1.imshow(image,cmap='gray')
    ax_2.imshow(high_contrast,cmap='gray')
    
    fig,(ax_hist1,ax_hist2) = plt.subplots(ncols=2,figsize=(10,5))
    ax_hist1.fill_between(bin_centers,hist)
    ax_hist2.fill_between(bin_center2,hist2)
    

    skimage.exposure.rescale_intensity(image,in_range = None,out_range = None)
    拉伸或收缩其强度水平后返回图像。均匀地重新调整图像强度,使得由in_range给出的最小值和最大值匹配由out_range给出的值。
    参数:
    image:数组 图像数组。
    in_range:2元组(浮点数,浮点数)
    最小和最大允许输入图像的强度值。如果为None,则 允许的最小值/最大值设置为输入图像中的实际最小值/最大值。
    out_range:2元组(浮点数,浮点数)
    输出图像的最小和最大强度值。如果为None,则使用图像数据类型的最小/最大强度。

    返回值:
    out:数组
    重新调整其强度后的图像数组。该图像与输入图像的dtype相同。


    直方图均衡化
    #直方图均衡化
    equalized = exposure.equalize_hist(image)
    hist3,bin_center3 = exposure.histogram(equalized)
    
    #图像对比
    fig,(ax_1,ax_2) = plt.subplots(ncols=2,figsize=(10,5))
    ax_1.imshow(image,cmap='gray')
    ax_2.imshow(equalized,cmap='gray')
    fig,(ax_hist1,ax_hist2) = plt.subplots(ncols=2,figsize=(10,5))
    ax_hist1.fill_between(bin_centers,hist)
    ax_hist2.fill_between(bin_center3,hist3)
    
    

    在这里exposure.equalize_hist(image)效果更好,衣服上的褶皱能很清楚的看到。


    滤波分析


    图像滤波

    • 滤波是处理图像数据的常用基础操作
    • 滤波操作可以去除图像中的噪声点,由此增强图像的特征。

    中值滤波

    skimage.filters.rank.median()
    如图:把像素点排序,取中位数,用中位数填充。是一种平滑处理。


    #中值滤波
    from skimage.morphology import disk
    from skimage.filters.rank import median
    
    img = data.camera()
    med1 = median(img,disk(3)) #3*3的中值滤波
    med2 = median(img,disk(20)) #5*5的中值滤波
    
    #图像对比
    fig,(ax_1,ax_2,ax_3) = plt.subplots(ncols=3,figsize=(15,10))
    ax_1.imshow(img,cmap='gray')
    ax_2.imshow(med1,cmap='gray')
    ax_3.imshow(med2,cmap='gray')
    

    高斯滤波

    skimage.filters.gaussian

    from skimage import data
    from skimage.morphology import disk
    from skimage.filters import gaussian
    
    img = data.camera()
    gas1 = gaussian(img, sigma=3) # sigma=3
    gas2 = gaussian(img, sigma=5) # sigma=5
    
    # 图像对比 
    fig, (ax_1, ax_2, ax_3) = plt.subplots(ncols=3, figsize=(15, 10))
    ax_1.imshow(img, cmap='gray')
    ax_2.imshow(gas1, cmap='gray')
    ax_3.imshow(gas2, cmap='gray')
    

    OpenCV部分

    opencv io

    img = cv2.imread('./images/messi.jpg', cv2.IMREAD_GRAYSCALE)
    cv2.imshow('messi', img)
    k = cv2.waitKey(0)
    if k == 27:
        # ESC键->关闭窗口
        cv2.destroyAllWindows()
    elif k == ord('s'): 
        # 's'键->保存灰度图像并关闭窗口
        cv2.imwrite('./output/messi_gray.png', img)
        cv2.destroyAllWindows()
    

    中值滤波

    img = cv2.imread('./')
    denoise_img1 = cv2.medianBlur(img, ksize=3)
    denoise_img2 = cv2.medianBlur(img, ksize=5)
    
    cv2.imshow('original', img)
    cv2.imshow('denoised1', denoise_img1)
    cv2.imshow('denoised2', denoise_img2)
    k = cv2.waitKey(0)
    

    平滑均值滤波

    img = cv2.imread('./')
    blured_img1 = cv2.blur(img, ksize=(3, 3))
    blured_img2 = cv2.blur(img, ksize=(5, 5))
    
    cv2.imshow('original', img)
    cv2.imshow('blured1', blured_img1)
    cv2.imshow('blured2', blured_img2)
    k = cv2.waitKey(0)
    

    平滑高斯滤波

    img = data.camera()
    gaussian_img1 = cv2.blur(img, ksize=(3, 3))
    gaussian_img2 = cv2.blur(img, ksize=(5, 5))
    
    cv2.imshow('original', img)
    cv2.imshow('gaussian1', gaussian_img1)
    cv2.imshow('gaussian2', gaussian_img2)
    k = cv2.waitKey(0)
    

    常用的图像特征

    • 颜色特征
    from skimage import data, img_as_float, exposure
    
    # 如果需要使用参数nbins,需要将图像数据从[0, 255]转换到[0, 1]
    camera = img_as_float(data.camera())
    
    # 颜色直方图
    hist, bin_centers = exposure.histogram(camera, nbins=10)
    print(hist)
    print(bin_centers)
    
    结果如下:
    [51199  8554  6922  8834 31923 45742 82660 23862  1470   978]
    [ 0.05  0.15  0.25  0.35  0.45  0.55  0.65  0.75  0.85  0.95]
    
    • SIFT 特征 (DAISY特征)
      图像形状特征
      • 形状特征的表达必须以对图像中物体或区域的分割为基础
      • SIFT (Scale-invariant feature transform),在尺度空间中所提取的图像局部
      特征点。SIFT特征点提取较为方便,提取速度较快,对于图像的缩放等变换比
      较鲁棒,因此得到了广泛的应用。
      http://docs.opencv.org/trunk/da/df5/tutorial_py_sift_intro.html
    from skimage.feature import daisy
    import matplotlib.pyplot as plt
    %matplotlib inline
    
    daisy_feat, daisy_img = daisy(camera,step=180, radius=58, rings=2, histograms=6, visualize=True)
    #daisy_feat, daisy_img = daisy(camera, visualize=True)
    print(daisy_feat.shape)
    plt.imshow(daisy_img)
    
    from skimage.feature import hog
    import matplotlib.pyplot as plt
    %matplotlib inline
    
    hog_feat, hog_img = hog(camera, visualise=True)
    print(hog_feat.shape)
    plt.imshow(hog_img)
    
    • skimage -- HOG 特征
      图像形状特征
      • HOG (Histogram of Oriented Gradient),用于检测物体的特征描述,通过 计算和统计图像局部区域的梯度方向直方图来构建特征
      • 由于HOG是在图像的局部方格单元上操作,所以它对图像几何的和光学的形变 都能保持很好的不变性
      • 在粗的空域抽样、精细的方向抽样以及较强的局部光学归一化等条件下,只要 行人大体上能够保持直立的姿势,可以容许行人有一些细微的肢体动作,这些 细微的动作可以被忽略而不影响检测效果
      • HOG特征特别适合于做图像中的人体检测 http://mccormickml.com/2013/05/09/hog-person-detector-tutorial/
    import cv2
    image = cv2.imread('./images/messi.jpg',0)
    hog = cv2.HOGDescriptor()
    hog_feat = hog.compute(image)
    print(hog_feat)
    print(hog_feat.shape)
    
    结果如下:
    [[ 0.1394383 ]
     [ 0.03070632]
     [ 0.02309218]
     ..., 
     [ 0.11105878]
     [ 0.15578346]
     [ 0.13455178]]
    (3704400, 1)
    

    参考:
    • 深度 | 微软亚洲研究院常务副院长郭百宁:计算机视觉的最新研究与应用 http://chuansong.me/n/401296742796
    • scikit-image官网 http://scikit-image.org/
    • 中值滤波 http://homepages.inf.ed.ac.uk/rbf/HIPR2/median.htm
    • 高斯滤波 http://homepages.inf.ed.ac.uk/rbf/HIPR2/gsmooth.htm
    • OpenCV 3.2.0 官方教程 http://docs.opencv.org/3.2.0/d6/d00/tutorial_py_root.html

    相关文章

      网友评论

        本文标题:基本的图像数据处理和分析

        本文链接:https://www.haomeiwen.com/subject/ackxtqtx.html