数据预处理与特征工程—10.图像切割与特征提取

2023-11-19


水质图像数据—百度网盘链接提取码:1234


引言

  本文以水质图像为例,进行图像切割与特征提取

一、图像切割

  一般情况下,采集到的水样图片包含盛水容器,且容器颜色与水体颜色差异较大,同时水体位于图片中央,所以为了提取水色特征,就需要提取水样图片中央部分具有代表意义的图像,具体实施方式是提取水样图像中央101×101像素的图像。设原始图像的大小是M×N,则截取宽从第M/2 -50个像素点到第M/2+50个像素点,高从第N/2 -50个像素点到第N/2+50个像素点的子图像

二、特征提取

  图像特征主要包括颜色特征、纹理特征、形状特征、空间关系特征等。与几何特征相比,颜色特征更为稳健,对于物体的大小和方向均不敏感,表现出较强的鲁棒性。本案例中,由于水色图像是均匀的,故主要关注颜色特征即可。颜色特征是一种全局特征,它描述了图像或图像区域所对应的景物的表面性质。一般颜色特征是基于像素点的特征,所有属于图像或图像区域的像素都有各自的贡献。在利用图像的颜色信息进行图像处理、识别、分类的研究实现方法上已有大量的研究成果,主要采用颜色处理常用的直方图法颜色矩方法等。
  颜色直方图是最基本的颜色特征表示方法,它反映的是图像中颜色的组成分布即出现了哪些颜色以及各种颜色出现的概率。其优点在于它能简单描述一幅图像中颜色的全局分布,即不同色彩在整幅图像中所占的比例,特别适用于描述那些难以自动分割的图像和不需要考虑物体空间位置的图像。其缺点在于它无法描述图像中颜色的局部分布及每种色彩所处的空间位置,即无法描述图像中的某一具体的对象或物体。
  基于颜色矩提取图像特征数学基础在于图像中任何的颜色分布均可以用它的矩来表示。根据概率论的理论,随机变量的概率分布可以由其各阶矩唯一地表示和描述,一副图像的色彩分布也可认为是一种概率分布,那么图像可以由其各阶矩来描述。颜色矩包含各个颜色通道的一阶距、二阶矩和三阶矩,对于一副RGB颜色空间的图像,具有R、G和B3个颜色通道,则有9个分量。
  颜色直方图产生的特征维数一般大于颜色矩的特征维数,为了避免变量过多影响后续分类效果,选择基于颜色矩提取图像特征的方式,建立水样图像与反映该图像特征的数据信息之间的关系。

1.各阶颜色矩的计算公式

  一阶颜色矩采用一阶原点矩,反映了图像的整体明暗程度
在这里插入图片描述
  二阶颜色矩采用的是二阶中心距的平方根,反映了图像颜色的分布范围
在这里插入图片描述
  三阶颜色矩采用的是三阶中心距的立方根,反映了图像颜色分布的对称性
在这里插入图片描述

三、python实现

import numpy as np
import os, re
from PIL import Image


def get_ImgNames(path):
    """
    获取图片名称
    :param path: 路径
    :return: 名称列表
    """
    # os.listdir用于返回该路径下所包含的文件或文件夹的名字列表
    filenames = os.listdir(path=path)
    imgnames = []
    for i in filenames:
        # 在返回的文件名字中寻找正则表达式所匹配的所有字符串,如果不存在,返回空列表
        if re.findall('^\d_\d+\.jpg$', i) != []:
            imgnames.append(i)
    return imgnames


def Var(data=None):
    """
    获取三阶颜色矩
    :param p: 数据
    :return: 返回三阶颜色矩
    """
    x = np.mean((data - data.mean()) ** 3)
    return np.sign(x) * np.abs(x) ** 1 / 3


def imageCutting_FeatureExtraction(path, imgnames=None):
    """
    图像切割与基于颜色矩进行特征提取
    :param path: 路径
    :param imgnames: 所有图片的名称
    :return: 返回特征提取后的9个分量,以及对应标签
    """
    # 获取图片的数目
    n = len(imgnames)
    data = np.zeros((n, 9))  # 用来存放特征提取后的分量
    label = np.zeros((n))  # 用来存放样本标签

    # 对每一张图片进行图像分割,并计算9个分量
    for i in range(n):
        # 打开图像文件
        img = Image.open(path + imgnames[i])
        # 获取图片的尺寸
        M, N = img.size
        # 图像切割提取图样中间部分,img.crop返回图像的矩阵区域,参数为 (left, upper, right, lower)的元祖
        img = img.crop((M / 2 - 50, N / 2 - 50, M / 2 + 50, N / 2 + 50))
        # 将图像分割成3个通道,
        r, g, b = img.split()
        # 转化为数组数据并归一化,获得对应的像素矩阵
        rd = np.array(r, dtype=np.float32) / 255
        gd = np.array(g, dtype=np.float32) / 255
        bd = np.array(b, dtype=np.float32) / 255

        # 计算一阶颜色矩
        data[i, 0] = rd.mean()
        data[i, 1] = gd.mean()
        data[i, 2] = bd.mean()

        # 计算二阶颜色矩
        data[i, 3] = rd.std()
        data[i, 4] = gd.std()
        data[i, 5] = bd.std()

        # 计算三阶颜色矩
        data[i, 6] = Var(rd)
        data[i, 7] = Var(gd)
        data[i, 8] = Var(bd)

        # 获取样本标签-每个图片名的第一个数字代表类别
        label[i] = imgnames[i][0]
    return data, label


if __name__ == '__main__':
    # 获取所有图片的名称
    imgNames = get_ImgNames(path='data/images')
    # 图像切割与特征提取
    data, label = imageCutting_FeatureExtraction(path='data/images/', imgnames=imgNames)
    print(data)
    print(label)
[[ 5.82761228e-01  5.43678880e-01  2.52429008e-01 ... -6.69353919e-07
  -1.38143681e-06 -2.36883667e-05]
 [ 6.41877651e-01  5.70779204e-01  2.13561177e-01 ...  2.93149545e-07
  -1.79549140e-08 -1.63457360e-08]
 [ 6.03719652e-01  5.76788306e-01  2.82186657e-01 ... -3.50089095e-08
  -6.03366187e-09 -2.83770798e-07]
 ...
 [ 4.41249013e-01  5.15269458e-01  1.95367470e-01 ... -1.10455280e-07
  -3.80430407e-08  2.42072038e-07]
 [ 4.43658441e-01  5.25992572e-01  1.89627856e-01 ... -8.70575813e-08
  -1.16588505e-07  2.34214686e-07]
 [ 5.83821952e-01  5.80971777e-01  3.50630611e-01 ... -1.45945544e-07
  -2.41025039e-07 -1.40974301e-06]]
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
 1. 1. 1. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2.
 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 3.
 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3.
 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3.
 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3.
 3. 3. 3. 3. 3. 4. 4. 4. 4. 4. 4. 4. 4. 4. 4. 4. 4. 4. 4. 4. 4. 4. 4. 4.
 4. 4. 4. 4. 4. 5. 5. 5. 5. 5. 5.]

参考于《python数据分析与挖掘实战》


如果对您有帮助,麻烦点赞关注,这真的对我很重要!!!如果需要互关,请评论或者私信!
在这里插入图片描述


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据预处理与特征工程—10.图像切割与特征提取 的相关文章

  • 【ML on Kubernetes】第 7 章:模型部署和自动化

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore

随机推荐