zoukankan      html  css  js  c++  java
  • 图像预处理(一)基本特征提取

    理解机器存储图像逻辑:

    上图是一个简单的表示“8”的图片,可被用来做为识别验证码

    它由一个个或白或灰或黑的小色块所组成,每一个小色块的长度和面积都相同,仅在亮度方面有所分别,它们是计算机表示的基本单元:像素点

    其在计算机中的表示形式如下:

    每一个像素对应(0-255)的灰度模式,0为黑色,255为白色

    所有的像素点以一种特定的规律组合在一起,才形成一张图片

    计算机以矩阵的方式存储图片,矩阵的大小取决于图片的像素点数量,一般来说,固定面积下,图片的像素点数量越多,图片质量越高,存储所需的矩阵也就越大,从而占用的计算机资源也就越多

     除了灰度模式表示外,计算机还有另外一种图像的表示方法:RGB模式

    Red(0-255),Green(0-255),Blue(0-255)

    由这三种颜色的组合,可模拟丰富多彩的各种现实世界的图像

    使用python进行图像特征提取:

    (一)灰度像素值作为特征

    从图像创建特征的最简单方法是将这些原始像素值用作单独的特征。

    image = imread('puppy.jpeg', as_gray=True) 
    image.shape

    (650, 450

    image.shape返回图片经过灰度处理后的像素点分布数量

    650*450=292500

    这292500个像素点就可以算作图像最原始的特征

    features = np.reshape(image, (650*450))
    features.shape, features
    (292500,)
    array([0.96470588, 0.96470588, 0.96470588, ..., 0.96862745, 0.96470588,
           0.96470588])

    (二)通道的平均像素值
    上面是以黑白像素点组成的灰度像素分布,如果想要保留原本的彩色特征呢?
    image = imread('puppy.jpeg') 
    image.shape
    (650, 450, 3)
    与上面相比,此次获得的像素点为650*450*3达到了877500
    这里的3就是通道数,分别代表RGB三个通道
    计算通道的平均像素值:
    for i in range(0,image.shape[0]):
        for j in range(0,image.shape[1]):
            feature_matrix[i][j] = ((int(image[i,j,0]) + int(image[i,j,1]) + int(image[i,j,2]))/3)
    features = np.reshape(feature_matrix, (650*450)) 
    features.shape
    (292500,)
    (三)边缘特征
    假设有如下的图片:

    我们需要分别提取图像的中的物体,这个时候使用简单的像素特征或是色彩通道均值特征都很难做到区分
    这里,就需要用到边缘特征
    边缘特征是什么?
    如下图:

    在一个具有图像变化的图片中,图像强度快速变化往往就称为图像边缘

    如下图:

    其中的数字就代表像素值,在计算机处理时,可以通过判断中心像素点周围的像素值差值从而判断中心像素点是否处在图像边缘

    如图中的像素点85周围,相互差值(89-78/68-56)都只在15以内,亮度变化并不明显,所以可以判断85像素点不处在像素边缘

    那么什么样的情况算处在图像边缘呢?

    如下图:

    125像素点周围,相互差值(111-68/96-89)最大的已经达到了43,这种程度的亮度变化已经可以被肉眼识别到了,就此可以判断125像素点处于图像边缘

    用python识别图像边缘:
    #importing the required libraries
    import numpy as np
    from skimage.io import imread, imshow
    from skimage.filters import prewitt_h,prewitt_v
    import matplotlib.pyplot as plt
    %matplotlib inline
    
    #reading the image 
    image = imread('puppy.jpeg',as_gray=True)
    
    #calculating horizontal edges using prewitt kernel
    edges_prewitt_horizontal = prewitt_h(image)
    #calculating vertical edges using prewitt kernel
    edges_prewitt_vertical = prewitt_v(image)
    
    imshow(edges_prewitt_vertical, cmap='gray')

    参考资料

    https://www.analyticsvidhya.com/blog/2019/08/3-techniques-extract-features-from-image-data-machine-learning-python/?#

    https://wlgls.github.io/posts/%E7%AC%AC%E4%BA%8C%E8%8A%82-%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89-%E8%BE%B9%E7%BC%98%E6%A3%80%E6%B5%8B

  • 相关阅读:
    update 更改字段
    查看 links
    oracle 统计字段空值数
    查看oracle 数据库编码个格式
    oracle 数据库DBA权限
    一文弄懂 Golang 排序
    Golang Linux、Windows、Mac 下交叉编译
    go 简单封装数学运算包
    [Vue warn]: Unknown custom element: did you register the component correctly?
    深度图怎么看行情走势
  • 原文地址:https://www.cnblogs.com/J14nWe1/p/14374261.html
Copyright © 2011-2022 走看看