图像基础—— 特征提取之颜色特征提取

图像特征是指可以对图像的特点或内容进行表征的一系列属性的集合,主要包括图像自然特征(如亮度、色彩、纹理等)和图像人为特征(如图像频谱、图像直方图等)。

图像特征提取根据其相对尺度可分为全局特征提取和局部特征提取两类。全局特征提取关注图像的整体表征。常见的全局特征包括颜色特征、纹理特征、形状特征、空间位置关系特征等。局部特征提取关注图像的某个局部区域的特殊性质。一幅图像中往往包含若干兴趣区域,从这些区域中可以提取数量不等的若干个局部特征。

  • 特征特点
  1. 代表性(可区分性)
  2. 稳定性
  3. 独立性

颜色特征是比较简单但是应用较广泛的一种视觉特征。颜色特征往往和图像中包含的对象或场景相关。与其他图像特征相比,颜色特征对图像的尺寸、方向、视角变化的依赖性较小,即相对于图像的尺寸、方向、视角变化具有较好的健壮性。

目前使用的颜色特征主要包括颜色直方图、颜色矩、颜色集、颜色聚合向量以及颜色相关图

颜色直方图

颜色直方图用于描述图像中像素颜色的数值分布情况,可以反映图像颜色的统计分布和图像的基本色调。颜色直方图仅可表征图像中某一颜色值出现的频数,无法描述图像像素分布的空间位置信息。

任意一幅图像都能唯一给出一幅与它对应的颜色直方图,但不同的图像可能有相同的颜色直方图,因此直方图与图像存在一对多的关系。

一般颜色直方图 cv2.calcHist

颜色直方图是最基本的颜色特征,它反映的是图像中像素颜色值的组成分布,即出现了哪些颜色以及各种颜色出现的概率。假设s(xi)为图像F中某一特定颜色xi的像素个数,则xi像素出现的频率为:

整个图像F的一般颜色直方图可以表示为:H(F)=[h(x1),h(x}xb2),…,h(xn)]

  • 方法说明

cv2.calcHist(image,channels,mask,histSize,ranges)
参数说明:
1、image:原始图像,需要[]括起来
2、channel:通道编号,需要[]括起来
3、mask:掩膜图像,当统计全局图像,值设为None,统计局部图像的直方图,需要使用到它
4、histSize:表示直方图的灰度级数,例如[0,255]一共256级
5、range:表示像素值范围[a,b],表示a到b
6、accumulate:表示累计标识,默认False,如果设为True,则直方图在开始计算时不会被清零,计算的是多个直方图的累积结果,用于对一组图像计算直方图。参数可选

import matplotlib.pyplot as plt
import cv2 as cv
from skimage import data
img = data.coffee()
hist0 = cv.calcHist([img],[0],None,[256],[0,255])
hist1 = cv.calcHist([img],[1],None,[256],[0,255])
hist2 = cv.calcHist([img],[2],None,[256],[0,255])

全局累加直方图 np.cumsum()

当图像中的颜色值不能取遍所有可能的颜色值时,一般颜色直方图中就会出现一些零值。这些零值的出现会影响相似性的度量,进而会使计算出的相似度不能准确反映图像之间的颜色分布差异。
为了弥合一般颜色直方图法的上述缺陷,在一般直方图方法的基础之上,通过对直方图元素进行累加,消除零值影响,形成全局累加直方图。

img = data.coffee()
hist0 = np.cumsum(cv.calcHist([img],[0],None,[256],[0,255]))
hist1 = np.cumsum(cv.calcHist([img],[1],None,[256],[0,255]))
hist2 = np.cumsum(cv.calcHist([img],[2],None,[256],[0,255]))
plt.figure(figsize=(6,6))
plt.plot(range(256),hist0,label = 'R')
plt.plot(range(256),hist1,label = 'G')
plt.plot(range(256),hist2,label = 'B')
plt.legend()                 
plt.title("累积直方图")

主色调直方图

在一幅图像中,不同颜色值出现的概率不尽相同,且通常情况下少数几种颜色就能涵盖整幅图像的主色调。基于该思想,主色调直方图法会计算出图像中每种颜色出现的频率,选择出现频率最高的几种颜色并将其作为主色调。

总结

  • 优点

计算简单,对图像的平移和旋转变换不敏感,能简单描述图像中颜色的全局分布情况。

  • 缺点

无法捕捉(即会丢失)颜色组成之间的空间位置关系。

颜色矩

矩是非常重要的统计量,用于表征数据分布的特点。在统计中,一阶矩表示数据分布的均值,二阶矩表示数据分布的方差,三阶矩表示数据分布的偏移度。

图像的颜色矩用于对图像内的颜色分布进行表征,是比较重要的一种全局图像特征表示。图像的颜色矩特征提取时主要瞄准图像颜色矩中的一阶矩、二阶矩和三阶矩,对于图像而言,这3种统计特征已经足以表达数字图像的颜色分布。相对于颜色直方图特征提取,颜色矩特征提取的优点是无须对颜色特征进行提前量化。

  • 原理

对于数字图像P,其一阶颜色矩的定义为:

其中Pij表示数字图像P的第i个图像通道的第j个像素的像素值,N表示图像中像素的个数。

二阶颜色矩的定义为:

三阶颜色矩的定义为:

其中一阶矩可以表征该颜色通道的平均响应强度,二阶矩可以表示该颜色通道的响应方差,三阶矩可以表征该颜色通道数据分布的偏移度。针对彩色图像,图像的颜色矩一共有9个分量,每个颜色通道均有3个低阶矩。

def color_comment(img):
    r,g,b = cv.split(img)
    color_featrue = []
    # 一阶矩
    r_mean = np.mean(r)
    g_mean = np.mean(g)
    b_mean = np.mean(b)
    # 二阶矩
    r_std = np.std(r)
    g_std = np.std(g)
    b_std = np.std(b)
    #三阶矩
    r_offset = (np.mean(np.abs((r - r_mean)**3)))**(1./3)
    g_offset = (np.mean(np.abs((g - g_mean)**3)))**(1./3)
    b_offset = (np.mean(np.abs((b - b_mean)**3)))**(1./3)
    color_featrue.extend([r_mean,g_mean,b_mean,r_std,g_std,b_std,r_offset,g_offset,b_offset])
    return color_featrue
print(color_comment(img))

[158.5690875, 85.794025, 51.48475, 62.9728671221504, 60.958103707650785, 52.93569362069574, 73.2849737717244, 69.97427088321201, 67.60422322535385]

颜色矩的特点:图像的颜色矩有9个分量(3个颜色通道,每个通道上3个低阶矩);与其他颜色特征相比非常简洁;分辨力较弱;颜色矩一般和其他特征结合使用,可以起到缩小范围的作用。

颜色聚合向量

参考

针对颜色直方图和颜色矩无法表达图像色彩的空间位置的缺点,有人提出了图像的颜色聚合向量。

其核心思想是将属于颜色直方图的每个颜色量化区间的像素分为两部分,如果该颜色量化区间中的某些像素占据的连续区域的面积大于指定阈值,则将该区域内的像素作为聚合像素,否则作为非聚合像素。

颜色聚合向量可表示为<(α1,β1),(αn,βn)>,其中αi与βi分别代表颜色直方图的第i个颜色量化区间中的聚合像素和非聚合像素的数量。颜色聚合向量除了包含颜色频率信息外,也包含颜色的部分空间分布信息,因此其可以获得比颜色直方图更好的表示效果。

  • 步骤

1、量化

颜色聚合向量算法的第一步与求普通的颜色直方图类似,即对图像进行量化处理。一般采用均匀量化处理方法,量化的目标是使图像中只保留有限个颜色区间。

2、连通区域划分

针对重新量化后的像素值矩阵,根据像素间的连通性把图像划分成若干个连通区域。

3、判断聚合性

统计每个连通区域中的像素数目,根据设定的阈值判断该区域中的像素是聚合的,还是非聚合,得出每个颜色区间中聚合像素和非聚合像素的数量αi和βi。

4、 聚合向量形成

图像的聚合向量可以表示为〈(α1,β1),(αn,βn)〉

颜色相关图

颜色相关图是图像颜色分布的另外一种表达方式。颜色相关图不仅可以显示像素在图像中的占比,也可以反映不同颜色对间的空间位置的相关性。颜色相关图利用颜色对间的相对距离分布来描述空间位置信息。

  • 原理

颜色相关图是一张用颜色对<i,j>索引的表,其中<i,j>的第k个分量表示颜色为c(i)的像素和颜色为c(j)的像素之间的距离等于k的概率。设I表示整张图像的全部像素,Ic(i)表示颜色为c(i)的所有像素,则图像的颜色相关图可以表达为:

|p1-p2|表示像素p1和p2之间的距离

def is_vaild(X,Y,point): #判断像素分布点是否超出图像范围,超出返回False
    if point[0] < 0 or point[0] >= X:
        return False
    if point[1] < 0 or point[1] >= Y:
        return False
    return True
    
def getNeighbors(X,Y,x,y,dist):  # 输入图片的一个像素点的位置,返回它的8邻域
    cn1 = (x+dist,y+dist)
    cn2 = (x+dist,y)
    cn3 = (x+dist,y-dist)
    cn4 = (x,y-dist)
    cn5 = (x-dist,y-dist)
    cn6 = (x-dist,y)
    cn7 = (x-dist,y+dist)
    cn8 = (x,y+dist)
    point = (cn1,cn2,cn3,cn4,cn5,cn6,cn7,cn8)
    Cn = []
    for i in point:
        if is_vaild(X,Y,i):
            Cn.append(i)
    return Cn
        
def corrlogram(img,dist):
    xx,yy,tt = img.shape
    cgram = np.zeros((256,256),np.uint8)
    for x in range(xx):
        for y in range(yy):
            for t in range(tt):
                color_i = img[x,y,t]   # X的某一个通道的像素值
                neighbors_i = getNeighbors(xx,yy,x,y,dist)
            for j in neighbors_i:
                j0 = j[0]
                j1 = j[1]
                color_j = img[j0,j1,t]   #X的某一个邻域像素点的某一个通道的像素值
                cgram[color_i,color_j] +=  1  #统计像素值i核像素值j的个数
    return cgram
crgam = corrlogram(img,4)  # 4 
plt.imshow(crgam)
plt.show()

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值