图像特征计算——颜色特征


一、颜色特征

  在图像处理领域,图像的颜色特征是一个非常重要的特征,有时候根据图像的颜色特征就可以得出一些非常重要的信息。
  自然界常见的各种颜色光,都是由红( R)、绿(G)、蓝(B)三种颜色光按不同比例相配而成,同样绝大多数颜色也可以分解成红、绿、蓝三种色光,这就是色度学中最基本的原理—三基色原理。
  256级的RGB色彩总共能组合出约1678万种色彩,即256×256×256=16777216。
通常也被简称为1600万色或千万色。也称为24位色(2的24次方)。
在这里插入图片描述
  除了RGB彩色图像表示法,还有HSV表示法。HSV是一种将RGB色彩空间中的点在倒圆锥体中的表示方法。HSV即色相(Hue)、饱和度(Saturation)、明度(Value),又称HSB(B即Brightness)。色相是色彩的基本属性,就是平常说的颜色的名称,如红色、黄色等。饱和度(S)是指色彩的纯度,越高色彩越纯,低则逐渐变灰,取0-100%的数值。明度(V),取0-max(计算机中HSV取值范围和存储的长度有关)。HSV颜色空间可以用一个圆锥空间模型来描述。圆锥的顶点处,V=0,H和S无定义,代表黑色。圆锥的顶面中心处V=max,S=0,H无定义,代表白色。
在这里插入图片描述
  RGB颜色空间中,三种颜色分量的取值与所生成的颜色之间的联系并不直观。而HSV颜色空间,更类似于人类感觉颜色的方式,封装了关于颜色的信息:“这是什么颜色?深浅如何?明暗如何?”
此外介绍一下RGB和HSV的相互转化规则:
在这里插入图片描述
在这里插入图片描述

二、颜色特征表示

1. 颜色特征的特点
颜色与图像中包含的物体或场景关系密切;
颜色特征对图象尺寸、方向、视角等的依赖性小;
2. 需要解决的两个问题
选择合适的颜色空间计算颜色特征
选择合适的方法将颜色特征量化
3. 表示的主要方法
颜色直方图、颜色矩、颜色集

1.颜色直方图

  直方图原理就不赘述了,参考了以下一些博客:
https://blog.csdn.net/zhu_hongji/article/details/80443585
https://blog.csdn.net/qq_20199965/article/details/102561054?
代码实现如下:

//提取颜色特征
//★★★非常重要:calcHist统计后的数组hist,假设是三维(dims=3),bin=256 ,那么hist(6,7,8)代表的是0通道像素为6
//1通道像素为7,2通道像素为8的像素点的个数   
//统计H、S、V的直方图可以利用三层for循环
//(bin常常取更小,bin的作用的划分更小的区间,若为256则hist太大,那么可以取bin=32即把256划为32份)
/*============calcHist函数原型===================
void calcHist(const Mat* arrays,     //图像数组
              int narrays,           //需要统计的图像数组中的元素个数,单个统计为1即可
              const int* channels,   //统计的通道数
              InputArray mask,       //掩模,没有直接Mat()即可
              OutputArray hist,      //输出的直方图数组
              int dims,              //输出的直方图数组的维数
              const int* histSize,   //确定统计区间,histSize中一般常常存放h_bins,s_bins,v_bins,确定直方图数组下标(例:取histSize={50,60,60},那么hist数组的最后一个元素是hist[49][59][59])
              const float** ranges,  //确定每个bin的上下界范围,如果是rgb图像通常情况下像素值最大为255那么三个通道都为0-256,hsv图像中
              bool uniform=true,     //统计的直方图是否均匀
              bool accumulate=false )  
=================================================*/
#include <iostream>
#include <vector>
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <opencv2\imgproc\types_c.h>

using namespace std;
using namespace cv;

int main()
{
	Mat srcImage = imread("00001.jpg");
    Mat hsvImage;
    cvtColor(srcImage, hsvImage, COLOR_BGR2HSV);    //将rgb图转化为hsv图

    int h_bins = 50;
    int s_bins = 60; 
    int v_bins = 60;
    int histSize[] = { h_bins,s_bins ,v_bins};
    float h_ranges[] = { 0,180 };
    float s_ranges[] = { 0,256 };
    float v_ranges[] = { 0,256 };
    const float* ranges[] = { h_ranges,s_ranges,v_ranges };
    //只计算了h,s两个通道,所以channels是0和1
    int channels[] = { 0,1,2 };
    //MatND 类型的容器用于存储calcHist计算出的直方图
    Mat Hist;
    calcHist(&hsvImage, 1, channels, Mat(), Hist, 3, histSize, ranges, true, false);

    /*=======查看结果=================
    for (int i = 0; i < h_bins; i++)
    {
        for (int j = 0; j < s_bins; j++)
        {
            for (int z = 0; z < v_bins; z++)
            {
                cout << "[" << i << "]" << "[" << j << "]"<<"["<<z<<"]" << "=" << Hist.at<float>(i, j,z) << endl;
            }
        }
    }
    =================================*/

    //分别统计h,s,v的直方图
    vector<float> h_Hist(h_bins,0);
    vector<float> s_Hist(s_bins,0);
    vector<float> v_Hist(v_bins,0);

    for (int i = 0; i < h_bins; i++)
    {
        for (int j = 0; j < s_bins; j++)
        {
            for (int z = 0; z < v_bins; z++)
            {
                float value = Hist.at<float>(i, j, z);
                h_Hist[i] += value;
                s_Hist[j] += value;
                v_Hist[z] += value;
            }
        }
    }

    //绘制直方图:略,直接看其他人的博客即可

	return 0;
}

2.颜色矩

  1. 颜色矩是以数学方法为基础的,通过计算矩来描述每个颜色通道的分布。
  2. 颜色矩通常直接在RGB空间计算。
  3. 用每个颜色通道的前三阶矩表示。

  颜色通道的前三阶矩矩通俗来说就是一阶的均值,二阶的方差,三阶的斜度。公式如下:
在这里插入图片描述
直接在RGB颜色空间求取就行。

3.颜色集

  颜色集是对颜色直方图的一种近似,首先将图像从RGB颜色空间转换为视觉均衡的颜色空间(如HSV空间),并将颜色空间量化为若干个bins。然后,用色彩自动分割技术将图像分为若干个区域,每个区域用颜色空间的某个颜色分量来索引,将图像表达为一个二进制的颜色索引集。在图像匹配中,比较不同颜色集之间的距离和色彩区域的空间关系。

  颜色集同时考虑了颜色空间的选择和颜色空间的划分,通常使用HSL空间。

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
机器学习水果识别是一种利用机器学习算法和图像处理技术对水果进行自动识别的方法。其中,使用Python中的OpenCV库实现物体特征提取是一种常见的实现方式。 OpenCV是一个强大的开源计算机视觉库,提供了许多用于图像处理和分析的函数和工具。它可以辅助我们实现水果识别所需要的特征提取步骤。 首先,我们需要准备水果图像数据集。这些图像可以是不同种类的水果,每个水果都有多个不同视角的图像。接下来,我们使用OpenCV库中的函数加载和处理这些图像。 在特征提取中,我们可以使用很多不同的技术。其中,最常用的方法是使用图像颜色和纹理特征。在处理图像时,我们可以使用OpenCV中的函数计算这些特征。 例如,我们可以使用OpenCV中的函数提取图像颜色直方图。这可以帮助我们了解图像中不同颜色的比例和分布情况。在水果识别中,不同水果的颜色特征往往是不同的。 此外,我们还可以使用OpenCV中的纹理特征提取方法,比如局部二值模式(Local Binary Patterns)。这可以帮助我们分析图像中的纹理信息,如图像的细节和纹理变化。这些纹理特征在识别不同类型的水果时也是有用的。 最后,我们可以使用机器学习算法,如支持向量机(SVM)或卷积神经网络(CNN),来训练一个分类模型。这个模型可以根据提取的特征来判断输入图像是否为某种水果。 总之,使用Python中的OpenCV库实现水果识别中的物体特征提取是一种非常有效的方法。通过提取图像颜色和纹理特征,并使用机器学习算法进行分类,我们可以实现一个准确和高效的水果识别系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值