颜色聚合向量 Color Co-ccurrence Vector 介绍以及MATLAB代码实现

news2025/4/26 18:49:52

这件事情的起因是我想复习一下我在亚太杯数学建模当中使用过的CCV这种方法,但是CSDN平台上找了半天都没有,所以后来决定Google一下,终于找到了,甚至还有实现的代码,因此放上来。原文见Dr. Mahmoud Attia的博客。

一、颜色聚合向量的定义

颜色相干向量(CCV)是一种比颜色直方图更复杂的方法。它通过将每个像素分类为相干或不相干来进行工作。相干像素意味着它是一个大的连通分量(CC)的一部分,而不相干像素意味着它是一个小的连通组件的一部分。这种方法能够正常工作的一个关键步骤是我们决定一个连通分量是否大的标准。



二、颜色聚合向量如何在图像中提取特征

这些步骤旨在构建图像的低维表示。

  1. 对图像进行模糊处理(通过用周围相邻像素的平均值替换每个像素的值)。
  2. 将颜色空间(图像的颜色)量化为n个不同的颜色。
  3. 将每个像素分类为相干或不相干,这是通过以下步骤计算的:
  • 对每个量化颜色找到连通分量。
  • 确定 τ \tau τ 值( τ \tau τ 是用户指定的值,通常为图像大小的1%),对于像素数大于等于 τ \tau τ 的任何连通组件,其像素被视为相干,否则视为不相干。
  1. 对于每种颜色,计算两个值(C和N):
  • C是相干像素的数量。
    N是不相干像素的数量。
  • 显然,C和N中所有颜色的总和应等于像素的数量。

以上是这个方法的步骤,用于构建图像的低维表示。



三、聚合向量计算举例

假设我们的图片有30个不同的颜色,见下图:


在这里插入图片描述
现在我们将颜色量化为仅三种颜色(0:9、10:19、20:29)。这种量化实质上是将相似的颜色组合为单一的代表性颜色。


在这里插入图片描述
假设我们的 τ \tau τ 值为4,

  • 对于颜色0,我们有2个连通组件(8个相干像素)。

  • 对于颜色1,我们有1个连通组件(8个相干像素)。

  • 对于颜色2,我们有2个连通组件(6个相干像素和3个不相干像素)。

因此,我们的最终特征向量为:

在这里插入图片描述



四、定义一个距离方程

拥有距离函数的目的是量化任意两个图像之间的差异性。它补充了颜色描述符的实用性,例如,颜色描述符可以提取所有图像的特征并将其存储在数据库中,然后在图像检索阶段,距离函数将用于检索与原始查询图像具有最小距离的图像。

为了构建CCV的距离函数,我们使用计算得到的相干性和不相干性特征(每种颜色的C和N)在我们的距离函数中比较任意两个图像(假设它们分别为 a a a b b b,在下面的方程中表示)。

  • C i C_i Ci:颜色为 i i i 的相干像素数量
  • N i N_i Ni:颜色为 i i i 的非相干像素数量

D ( a , b ) = ∑ i = 0 n ( ∣ a C i − b C i ∣ ) + ( ∣ a N i − b N i ∣ ) D(a, b)=\sum_{i=0}^{n}\left(\left|a_{C_{i}}-b_{C_{i}}\right|\right)+\left(\left|a_{N_{i}}-b_{N_{i}}\right|\right) D(a,b)=i=0n(aCibCi)+(aNibNi)



五、颜色聚合向量的缺点

现在我们知道,颜色相干向量方法考虑了像素之间颜色空间分布的信息,但该方法也有一些缺点。本文的剩余部分将讨论其两个主要缺点。

CCV中的相干像素代表图像中可以被注意到的连通分量内的像素。然而,如果我们将所有这些组件合并为一个组件,最终我们将只得到一个更大的组件,其像素数量将等于两个原始大组件中的像素数量。

为了更清楚地说明,让我们看一下以下这些图片(假设 τ \tau τ 等于8)。


在这里插入图片描述


尽管它们是不同的图片,但它们具有相同的CCV。

可以清楚地看到,这个问题可以通过调整阈值 τ \tau τ 来解决,但调整它并不是一件简单的事情,因为在许多情况下,您需要在多个阈值之间进行选择,而每个阈值仍然不能完全正确地捕捉到图像数据集中大组件和小组件之间的差异。

我们可能遇到的另一个问题是这些可见的连接组件相对于彼此的位置。

以下图片具有相同的CCV,但外观不同:


在这里插入图片描述


有许多解决这个问题的方法。例如,可以在特征向量中添加另一个维度,以捕捉组件相对位置的信息,从而打破这种限制关系。

附录

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%ColorCoherenceVector
%====================
%
%Color Coherence Vector is a powerful color-based image retrieval 
%Parallel implementation based on this paper : Comparing Images Using Color Coherence Vectors (1996) - http://goo.gl/LkWkbi -
%CCV = getCCV(img, coherentThreshold, numberOfPixels)
%getCCV function takes an image and return the Color Coherence Vector that describe this Image. You can compare images using this vector.
%
%Input:
%img : The Image (3-channel Image)
%
%Optional Input:
%coherentPrec: The percentage of the image size to consider a component's pixels are coherent (default = 1%)
%numberOfColors: The number of different colors in the Color Coherence Vector (default = 27 colors). 
%				Note it'll be changed a little bit to ensure the same different values for RGB channel
%
%Output :
%CCV: a (2*numberOfColors) matrix represents your image. This can be used for matching.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%coherentPrec,认为一个颜色像素是聚合情况下,图像尺寸大小占比

function CCV = getCCV(img,coherentPrec, numberOfColors)
%
    if ~exist('coherentPrec','var')
        coherentPrec = 1;
    end
    if ~exist('numberOfColors','var')
        numberOfColors = 27;
    end


    CCV = zeros(2,numberOfColors);
    
    Gaus = fspecial('gaussian',[5 5],2);%2表示高斯滤波器的标准差
    img = imfilter(img,Gaus,'same');
    
    [img, updNumOfPix]= discretizeColors(img,numberOfColors);
    
    imgSize = (size(img,1)*size(img,2));
    thresh = int32((coherentPrec/100) *imgSize);%计算出认定颜色是聚合像素的门限值
    
    parfor i=0:updNumOfPix-1
        BW = img==i;
        CC = bwconncomp(BW);%查找二值图像 BW 中的连通分量 CC 并对其计数
        compsSize = cellfun(@numel,CC.PixelIdxList);
        incoherent = sum(compsSize(compsSize>=thresh));
        CCV(:,i+1) = [incoherent; ...
            sum(compsSize) - incoherent];
    end

end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/692572.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA中的伪共享与缓存行

一.伪共享与缓存行 1.CPU缓存架构 CPU 是计算机的心脏,所有运算和程序最终都要由它来执行。 主内存(RAM)是数据存放的地方,CPU 和主内存之间有好几级缓存,因为即使直接访问主内存也是非常慢的。 CPU的速度要远远大…

一图看懂CodeArts Board 5大特性,带你玩转看板服务

华为云看板服务CodeArts Board,通过构建研发效能度量体系,实现软件研发过程的可视化、软件交付的可管理可跟踪可量化,及时识别研发过程的堵塞点和改进点,通过数据驱动运营和治理,不断提升企业的软件能力和研发效能。

详解JAVA序列化

目录 1.什么是序列化 2.JAVA中的序列化 2.1.成员变量必须可序列化 2.2.transient关键字,可避免被序列化 2.3.无法更新状态 2.4.serialVersionUID 3.JDK序列化算法 4.序列化在实际中的一些应用 1.什么是序列化 序列化就是将对象转换为二进制格式的过程。对象…

Maven安装和配置详细教程

Maven安装和配置详细教程 1、Maven简介 Maven 是 Apache 软件基金会的一个开源项目,是一个优秀的项目构建工具,它用来帮助开发者管理项目中的 jar,以及 jar 之间的依赖关系、完成项目的编译、测试、打包和发布等工作。 2、Maven下载 点击Maven下载官方地址下载Maven。或者去…

postman持续集成-Jenkins自动构建

自动构建,就是设置一个定时器,定时时间到, Jenkins 自动执行测试用例 比如说,我设置下午五点,那么jenkins就是自动执行命令,自动生成报告,后续还可加上邮箱,会把报告发至邮箱 1. Jenkins 首页,点击任务名:如&#xff…

数据库—关系代数

传统的集合运算 在数据库中的关系代数运算有以下三种基本运算 并交差 必须满足两个表之间的属性个数必须一样。(必须具有相容性) 投影与选择运算 投影:π L _L L​( R ) 解释->π是投影符号,L是R表中的属性列,从…

临时文件中转服务的搭建-chfs软件的使用

因为经常用到远程桌面连接,所以本地pc和远程pc间的文件传输一直是个经常遇到的问题,尝试过用vftp搭建ftp服务,但是该服务在许多vps上被禁用,且windows上使用也要进行设置,比较麻烦。所幸发现了ods-im/CuteHttpFileServ…

接口测试如何做?你真的会做吗?全网超全整理实战案例...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 API测试的流程 准…

分布式事务Seate

一、Seata简介 1、Seata的核心组件 TC (Transaction Coordinator)事务协调者:维护全局和分支事务的状态,协调全局事务提交或回滚。TM (Transaction Manager)事务管理器:定义全局事务的范围、开始全局事务、提交或回滚全局事务。RM (Resourc…

2023下半年北京/上海/深圳软考(中/高级)认证招生

软考是全国计算机技术与软件专业技术资格(水平)考试(简称软考)项目,是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试,既属于国家职业资格考试,又是职称资格考试。 系统集成…

Docker安装与启动

Docker安装与启动 文章目录 Docker安装与启动前言容器与虚拟机比较 1、安装Docker2、设置ustc的镜像3、Docker的启动与停止总结 前言 容器与虚拟机比较 虚拟机(VM)是计算机系统的仿真。简而言之,它可以在实际上是一台计算机的硬件上运行看起…

Docker教程

Docker 能解决的问题 ⾸先,我们先来看⼏个问题: 1. 合作开发的时候,在本机可以运⾏,在别⼈的电脑上跑不起来。 这⾥我们以 Java Web 应⽤程序为例,⼀个 Java Web 应⽤程序涉及很多东⻄,⽐如 JDK 、 Tomc…

机器学习 day21(Tensorflow代码实现)

Tensorflow代码实现 在tensorflow中训练神经网络模型的步骤:第一步:指定模型,并告诉tensorflow按何种方式计算。第二步:使用特定的损失函数编译模型。第三步:训练模型

企业知识管理要怎么做,才能清晰有序?

在当今快速变化的商业环境中,企业知识管理的重要性日益凸显。有效的知识管理可以帮助企业整理、保存和传递知识,提高员工的工作效率和创新能力,从而为企业获得竞争优势奠定基础。本文将介绍企业在进行知识管理时应采取的措施,以确…

微型导轨的使用寿命能达到多久?

微型导轨,顾名思义就是体积很小的导轨,一般是应用在小型化设备中的,像半导体设备,医疗设备,IC制造设备,X-Y table,精密测量及检测仪器,高速皮带驱动设备,高速移载设备等都…

传说中,让测试猿分分钟心酸的五大谣言

谣传1:测试无聊 综观现今软件测试的一些轶事,我对某些错误想法的频繁出现感到吃惊。尽管有很多可以罗列,但是我还是想分享测试的五个最常见的谣传(基于我短暂的经验)。我发现前三个盛行于一些主流的新闻文章&#xff…

STM32F407系统时钟的配置和查看方法

1、系统时钟的来源 STM32F407具有两个PLL,用于产生不同的时钟信号。这里主要来讨论主PLL时钟。主PLL时钟的时钟源有两个信号,分别是上边提到的HIS信号和HSE信号。PLL通过把这两个信号倍频,分频等达到更高频率的时钟信号。一般来说&#xff0…

Linux6.yum,git,gdb

1.yum三板斧 yum list :显示所有能安装的软件。 yum lisy | grep 软件 :搜索软件。 yum install -y :安装软件。 yum remove -y 软件 :删除已经安装的软件。 2.git git clone 仓库网址 :添加仓库,按回车之后。需要输入账户和密码。 git add 文件 :把文件添加…

图像几何变换、仿射变换、透视变换

图像几何变换:平移、缩放、旋转 图像旋转变换:(x,y)为原图像坐标系,(x’,y’)为以(x0,y0)为中心的笛卡尔坐标系,图像以x0,y0)为中心进行旋转。 图像坐标系->笛卡尔坐标系->图像坐标系。如果是以图像中心旋转,则left=W/2,right=H/2,其中W和H为图像旋转…

MinGW 编译jsoncpp 的下载和编译

目录 1. jsoncpp 的下载 1.1 下载地址,点击可直接下载 1.2 下载完解压内容如下 2. jsoncpp 的编译 2.1 配置 2.2 生成 3. jsoncpp测试使用 1. jsoncpp 的下载 1.1 下载地址,点击可直接下载 mirrors / open-source-parsers / jsoncpp GitCode 1…