图像颜色特征提取(颜色直方图,颜色矩)–python

颜色直方图

颜色直方图用以反映图像颜色的组成分布,即各种颜色出现的概率。Swain和Ballard最先提出了应用颜色直方图进行图像特征提取的方法,首先利用颜色空间三个分量的剥离得到颜色直方图,之后通过观察实验数据发现将图像进行旋转变换、缩放变换、模糊变换后图像的颜色直方图改变不大,即图像直方图对图像的物理变换是不敏感的。因此常提取颜色特征并用颜色直方图应用于衡量和比较两幅图像的全局差。另外,如果图像可以分为多个区域,并且前景与背景颜色分布具有明显差异,则颜色直方图呈现双峰形。

颜色直方图也有其缺点:由于颜色直方图是全局颜色统计的结果,因此丢失了像素点间的位置特征。可能有几幅图像具有相同或相近的颜色直方图,但其图像像素位置分布完全不同。因此,图像与颜色直方图得多对一关系使得颜色直方图在识别前景物体上不能获得很好的效果。

考虑到颜色直方图的以上问题,主色调直方图便产生了。所谓主色调直方图基于假设少数几个像素的值能够表示图像中的绝大部分像素,即出现频率最高的几个像素被选为主色,仅用主色构成的主色调直方图描述一幅图像。这样的描述子并不会降低通过颜色特征进行匹配的效果,因为从某种角度将,频度出现很小的像素点可以被视为噪声。

颜色矩

颜色矩是一种有效的颜色特征,由Stricker和Orengo提出,该方法利用线性代数中矩的概念,将图像中的颜色分布用其矩表示。利用颜色一阶矩(平均值Average)、颜色二阶矩(方差Variance)和颜色三阶矩(偏斜度Skewness)来描述颜色分布。与颜色直方图不同,利用颜色矩进行图像描述无需量化图像特征。由于每个像素具有颜色空间的三个颜色通道,因此图像的颜色矩有9个分量来描述。

颜色直方图代码实现

颜色直方图一般用于统计图片不同通道像素强度的分布,并可以基于此来实现对比度提升、以及简单的目标识别、跟踪以及分割等任务。在openCV中集成了函数cv2.calcHist()来实现直方图的计算。
函数定义如下:

cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]]) → hist
其中images 可为单张或多张图像的array
channels 为要计算的通道数
mask 为图像掩膜
histSize 为直方图的柱子数量,即将数据分布在多少个区间上计数
range 为直方图取值范围
hist为返回值,不用填
accumulate 多张图的时候是否叠加
所以一般调用的时候只需要填上面四个参数,掩膜为None,范围0.0-255.0,数量255个:
hist = cv2.calcHist(img, [0], None,[256], [0.0,255.0])
# import the necessary packages
import numpy as np
import cv2class ColorDescriptor:def __init__(self, bins):# 存储 3D 直方图的数量self.bins = binsdef describe(self, image):# 将图像转换为 HSV 色彩空间并初始化# 用于量化图像的特征image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)features = []# 获取尺寸并计算图像的中心(h, w) = image.shape[:2](cX, cY) = (int(w * 0.5), int(h * 0.5))# 将图像分成四份 rectangles/segments (top-left,top-right, bottom-right, bottom-left)segments = [(0, cX, 0, cY), (cX, w, 0, cY), (cX, w, cY, h), (0, cX, cY, h)]# 构建代表图像中心的椭圆蒙版(axesX, axesY) = (int(w * 0.75) // 2, int(h * 0.75) // 2)ellipMask = np.zeros(image.shape[:2], dtype="uint8")cv2.ellipse(ellipMask, (cX, cY), (axesX, axesY), 0, 0, 360, 255, -1)# loop over the segmentsfor (startX, endX, startY, endY) in segments:# 为图像的每个角构建一个掩码,从中减去椭圆中心cornerMask = np.zeros(image.shape[:2], dtype="uint8")cv2.rectangle(cornerMask, (startX, startY), (endX, endY), 255, -1)cv2.ellipse(ellipMask, (cX, cY), (axesX, axesY), 0, 0, 360, 255, -1)# 从图像中提取颜色直方图,然后更新特征向量hist = self.histogram(image, cornerMask)features.extend(hist)# 从椭圆区域提取颜色直方图并更新特征向量hist = self.histogram(image, ellipMask)features.extend(hist)# 返回特征向量return featuresdef histogram(self, image, mask):# 使用提供的每个通道的 bin 数量,从图像的遮罩区域中提取 3D 颜色直方图hist = cv2.calcHist([image], [0, 1, 2], mask, self.bins, [0, 180, 0, 256, 0, 256])hist = cv2.normalize(hist, hist).flatten()# 返回直方图return hist

颜色矩代码实现

# import the necessary packages
import numpy as np
import cv2def color_moments(filename):img = cv2.imread(filename)if img is None:return# Convert BGR to HSV colorspacehsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)# Split the channels - h,s,vh, s, v = cv2.split(hsv)# Initialize the color featurecolor_feature = []# N = h.shape[0] * h.shape[1]# The first central moment - averageh_mean = np.mean(h)  # np.sum(h)/float(N)s_mean = np.mean(s)  # np.sum(s)/float(N)v_mean = np.mean(v)  # np.sum(v)/float(N)color_feature.extend([h_mean, s_mean, v_mean])# The second central moment - standard deviationh_std = np.std(h)  # np.sqrt(np.mean(abs(h - h.mean())**2))s_std = np.std(s)  # np.sqrt(np.mean(abs(s - s.mean())**2))v_std = np.std(v)  # np.sqrt(np.mean(abs(v - v.mean())**2))color_feature.extend([h_std, s_std, v_std])# The third central moment - the third root of the skewnessh_skewness = np.mean(abs(h - h.mean())**3)s_skewness = np.mean(abs(s - s.mean())**3)v_skewness = np.mean(abs(v - v.mean())**3)h_thirdMoment = h_skewness**(1./3)s_thirdMoment = s_skewness**(1./3)v_thirdMoment = v_skewness**(1./3)color_feature.extend([h_thirdMoment, s_thirdMoment, v_thirdMoment])return color_feature

图像颜色特征提取(颜色直方图,颜色矩)--python相关推荐

  1. 图像特征(一)——颜色特征(颜色直方图,颜色矩,颜色集,颜色聚合向量和颜色相关图)

    本文主要是为了更好地理解图像特征,理解各方法的原理. 转载请注明出处 https://mp.csdn.net/console/editor/html/105090183 图像模式识别的一般步骤为:输入 ...

  2. 颜色矩特征提取matlab,求matlab彩色图片的颜色特征提取算法的代码,和纹理特征提取的? 爱问知识人...

    其实学数字图像处理,关键的不是源代码(和一般编程还是有区别的,这个是经验之谈,其实一般博导未必会编程,但是你和他说说你的方法,他一般都能切中要害),而是你能理解基于概念及适用场所. 基于颜色.纹理.形 ...

  3. 图像特征分析---颜色特征描述---颜色距和颜色直方图

    一.颜色距 转自:https://blog.csdn.net/jaych/article/details/51137341 1.颜色距离 颜色距离指的是两个颜色之间的差距,通常距离越大,两个颜色相差越 ...

  4. python怎么设置颜色深浅变化_机器学习中减弱不同图像数据色调及颜色深浅差异...

    关键词:消除不同图像数据色调差异/消除颜色深浅差异/病理/机器学习/深度学习/人工智能 机器学习训练图像数据时可能会因为图像数据之间的颜色深浅,色调等影响训练和预测结果,本方法可以减弱颜色深浅/色调不 ...

  5. python 图像快速替换某种颜色

    文章目录 一.通过遍历替换 二.通过矩阵操作加快替换 三.结果对比 四.程序解释 五.完整的测试程序 最近的对图像数据进行处理的时候需要将图像中的某个颜色替换为另一个颜色,但是网络上找到的方法都是通过 ...

  6. 怎么提取图片里的颜色?图像颜色特征提取

    图像的颜色一直是研究和关注的热点,也是特征工程不可或缺的feature,今天就简单介绍一种非常基础的颜色的rgb特征. 目的: 我们希望图片的rgb特征转化成一个可衡量的指标,例如人的身高.体重 这样 ...

  7. 02 数字图像技术——颜色空间转换与颜色空间分割实验结果与分析——python

    04 数字图像技术--图像特征提取之实验结果与分析 03 数字图像技术--频域滤波实验结果与分析 02 数字图像技术--颜色空间转换与颜色空间分割实验结果与分析 01 数字图像基本操作--图像采样.量 ...

  8. python使用matplotlib中的errorbar函数可视化误差条、并自定义数据点标记、数据点大小、数据点颜色、数据点边缘颜色、误差棒颜色、误差棒线条宽度、误差棒边界线长度、误差棒边界线厚度等

    python使用matplotlib中的errorbar函数可视化误差条.并自定义数据点标记.数据点大小.数据点颜色.数据点边缘颜色.误差棒颜色.误差棒线条宽度.误差棒边界线长度.误差棒边界线厚度等 ...

  9. Python的IDE之PyCharm:PyCharm的使用技巧图文教程(修改Pycharm默认风格颜色、编辑器内代码注释区域的颜色、编辑器内的Python Interpreter等)之详细攻略

    Python的IDE之PyCharm:PyCharm的使用技巧图文教程(修改Pycharm默认风格颜色.编辑器内代码注释区域的颜色.编辑器内的Python Interpreter等)之详细攻略 目录 ...

最新文章

  1. JavaScript instanceof 运算符深入剖析
  2. WITH AS【原创】
  3. 页面布局_word页面布局
  4. CF1139D-Steps to One【期望dp,莫比乌斯反演】
  5. jeecg-framework-3.3.2-RELEASE 最新版本发布
  6. ES6中关于set数据结构详解
  7. Ubuntu16.04下 shell脚本中C语言形式的for循环用法
  8. 海龟交易法则09_海龟式积木
  9. EDA实验课课程笔记(四)——TCL脚本语言的学习2
  10. 计算生物学_01机器学习理论部分
  11. inDesign教程,如何控制文档中的页数?
  12. ssh-key生成密钥及SSH无密码登录的配置(转载)
  13. 企业常用网管软件介绍及配置说明
  14. 网络版库存管理系统如何共享库存信息
  15. jpeg 与 png 图片格式的区别
  16. 程序员必看之文章(转)
  17. 【愚公系列】2022年11月 uniapp专题-优购电商-个人中心页面
  18. 康特EPON OLT开局配置
  19. [CTFSHOW]命令执行
  20. 刷脸支付只是开端 浅谈3D视觉如何推进新零售崛起

热门文章

  1. 金字塔原理 读书心得
  2. 网络策略控制集群内部通信-networkpolicy
  3. 靠着这份面试题跟答案,BAT大厂面试总结
  4. Python基础——工作日天天向上的力量
  5. Solana生态-什么是Saber
  6. 蒙特卡罗强化学习算法
  7. 深圳公司法人变更的条件是什么?
  8. 什么叫类与对象? 详解~
  9. (一)概述:NGS测序在病原微生物检测中的应用
  10. 解决夜神模拟器与Eclipse断开连接,逍遥模拟器与Eclipse断开连接问题