传统图像处理之颜色特征

简介: 传统图像处理之颜色特征

颜色特征


对于颜色特征,我们在描述它之前,我们首先要选择合适的颜色空间来描述颜色特征,颜色空间包括灰度图,RGB、HIS、HSL、HSV、HSB、YCrCB、CIE、XYZ、CIE、Lab等;其次,我们要采用一定的零花方法将颜色特征表达为向量的形式;最后,还要定义相似度。


RGB颜色特征


色彩三原色应该都听过,及品红,黄,青(不是蓝色),这是我们在平时所使用的,但是对于计算机来说,他们呢的显示屏使用的则是:红、绿、蓝。他们对应的波长为700nm,546


.1nm,435.8nm。这三种颜色可以根据不同的比例组成不同的颜色,而他们混合后就是白色。


ec2356f149c019bc9ba603bf3703f552_613fe5fba38640f6ae2f4d9b626a4e16.jpeg


RGB模式是如何定义的喃?根据不同的亮度值,将每种颜色分为0~255,所有颜色可以用三种颜色混合得到。那么一共有(256x256x256=16777216种。例如纯黑色(0,0,0)和纯白色(255,255,255)。


import cv2
img=cv2.imread('F:\Image\\test1.jpg',cv2.IMREAD_COLOR)
print(img)



[[[180 204 220] [176 200 219] [171 192 216] ... [144 169 217] [142 168 219] [145 173 223]] [[171 195 211] [167 190 209] [161 183 207] ... [133 157 206] [131 157 207] [133 162 212]] [[165 189 205] [161 184 203] [155 177 201] ... [124 149 197] [122 149 199] [125 154 204]] ...


...

... [ 35 60 113] [ 51 77 130] [ 65 91 144]]]


看上面图片的矩阵输出,你们会发现,它的值都是在0~255之间,这就是因为他们都是色彩三原色构成,组成一个三维矩阵。所以我们如果要对图片操作,就只需要对三维矩阵操作就可以了。博主有一篇文章就是介绍这个的,比如打马赛克,当然,后面的学习会更精彩。言归正传,除了RGB色彩,我们还需要认识其他的颜色空间。


HIS颜色空间


HIS模式是从人的视觉系统出发,用色调,饱和度和亮度来描述色彩。因为该颜色空间非常的逼近人的视觉系统,因此,用HIS来处理图像非常的逼真,当然,除此之外,还有一个原因是现在的很多图像处理算法都是关于HIS的,所以,使用HIS更加方便我们操作。


HIS颜色空间,H指色调或色相,表示光线的波长,取值范围为0~360度;S指饱和度,表示色彩的纯度,取值范围为0~100%(饱和);I指亮度,表示敏感程度,取值范围为0~100%。 如果想实现颜色空间转化,那么我们只需要用到cv2.cvtColor(img,cv2.COLOR_BGR2RGB).第二个参数为转换方式:


函数转换解释文档


点击这个解释文档,就可以得到转换方式。太多了,博主就不一一介绍了,基本上就是COLOR_BGR2**,后面的就是要转换的格式,如RGB,HIS,YCrCb等,当然,opencv2版本则不一样,官网会有介绍。


import cv2
img=cv2.imread('F:\Image\\test1.jpg',cv2.IMREAD_COLOR)
cv2.imshow('1',img)
#转换为rgb颜色空间
rgb=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
cv2.imshow('2',rgb)
#转换为hls颜色空间
his=cv2.cvtColor(img,cv2.COLOR_BGR2HLS)
cv2.imshow('3',his)
#转换为灰度图像
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imshow('4',gray)
cv2.waitKey(0)



上面的图片展示了不同的颜色空间下的图片,我们可以发现,不同的颜色空间对应的图片也是不同的,所以如果要使用图片,就要根据当时的情况来进行选择。


HSV颜色空间


HSV颜色空间的模型和HIS相似,依据色泽,明暗和色调来定义颜色,其中H代表色度,S代表饱和度,V代表亮度,要注意的是这里的色度、饱和度的定义均和HIS颜色空间不同。该空间比RGB模式更接近于人对色彩的感知,在计算机领域应用最为广泛。


c670f5bdb1d7a57f6193606dcb07bc91_0aa523b241c74956a4d00aae4d95e041.jpeg


圆锥的顶面对应于亮度V=1(最亮)。色度H由目标位置绕V轴的旋转角给定:0°对应红色,120°对应绿色,240°对应蓝色(正好为RGB三原色)。在HSV空间中,每种颜色和他的补色相差180°。饱和度S取值范围为0~1,对应圆锥顶面的半径为1.要注意的是饱和度为1的颜色,其纯度一般小于1.在圆锥的顶点处,V=0,H和S无定义表示最暗的黑色;在原罪的顶面中心处,S=0,V=1,H无定义,代表最亮的白色。从该点到原点,代表亮度渐暗的灰色,对于这些点,S0,H均无定义。在圆锥顶面的圆周上的颜色,V=1,S=1,即纯色。如图,斜边表示亮度V,每个圆面的半径方向表示饱和度S。


我们来看一下HSV图片的矩阵形式:


BGR:
[[[180 204 220] [176 200 219] [171 192 216] ... [144 169 217] [142 168 219] [145 173 223]] [[171 195 211] [167 190 209] [161 183 207] ... [133 157 206] [131 157 207] [133 162 212]] [[165 189 205] [161 184 203] [155 177 201] ... [124 149 197] [122 149 199] [125 154 204]] ...
...
... [ 35 60 113] [ 51 77 130] [ 65 91 144]]]
HSV
[[[ 18 46 220] [ 17 50 219] [ 14 53 216] ... [ 10 86 217] [ 10 90 219] [ 11 89 223]] [[ 18 48 211] [ 16 51 209] [ 14 57 207] ... [ 10 90 206] [ 10 94 207] [ 11 95 212]] [[ 18 50 205] [ 16 53 203] [ 14 58 201] ... [ 10 94 197] [ 11 99 199] [ 11 99 204]] ...
...
... [ 10 176 113] [ 10 155 130] [ 10 140 144]]]


32554fbaee0c69e7b37d896a82219f5e_469bf6dd7f1b4ec08a37b1a72492ebf8.jpeg


颜色直方图


颜色直方图是在图像检索中被广泛采用的颜色特征。他所描述的是不同色彩在整幅图像中所占的比例,而与每种颜色所处位置无关,既无法描述图像中的具体物体。因此,颜色直方图对物体识别基本没有帮助,但特别适合处理难以进行自动分割的图像。


由于颜色空间太大,计算颜色直方图需要将颜色空间划分成若干个小区间,每个小区间成为直方图的一个bin,这个过程称为颜色量化。然后,通过计算落在每个bin内的像素数量可以得到颜色直方图。颜色量化有多种方式,有向量量化,聚类方法和神经网络方法。最常用的就是向量量化,即将颜色空间的各个维度均匀的进行划分。


颜色直方图特征匹配方法:距离法,中心距法,直方图相交法、参考颜色表法、累加颜色直方图法等。


在OPenCV中,我们使用函数cv2.calcHist()方法计算颜色直方图,此函数的可选参数:图像img、使用的通道channels、使用的掩模mask、大小HistSize和直方图柱的范围ranges。



337a74d230ea820c77b89981f4d0a183_f1ad9cd00cc04a98a96881d40502b0ca.png


import cv2
import matplotlib.pyplot as plt
img=cv2.imread('F:\Image\\test1.jpg',cv2.IMREAD_COLOR)
#展示原图片
cv2.imshow('',img)
cv2.waitKey(0)
#分为三个通道
color=('b','g','r')
for i,col in enumerate(color):
    histr=cv2.calcHist([img],[i],None,[256],[0,256])
   #画图
    plt.plot(histr,color=col)
plt.show()


上面第一个图象是原图,第二个就是实现对该图像进行颜色直方图的分析的线性图。然后覆盖了源代码。


OpenCV图像色调、对比度变化


毫无疑问,图像的色调、颜色、对比度、明暗度均可以调整,由于物体的类别与颜色关系不大,所以调整图片的色调和颜色也能够作为数据增强的手段之一。比如后面我们要介绍到的物体识别,图像检测等,都会把图像转变为灰色。


我么先来认识一下图像色调变化:


import cv2
import numpy as np
img=cv2.imread('F:\Image\\test2.jpg',cv2.IMREAD_COLOR)
cv2.imshow('原图片',img)
hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
#改变色调
hsv[:,:,0]=(hsv[:,:,0]+10)%180
#改变饱和度
hsv[:,:,1]=(hsv[:,:,1]+10)%255
#改变明暗度
hsv[:,:,2]=(hsv[:,:,2]+10)%255
#转化为RGB格式
img1=cv2.cvtColor(hsv,cv2.COLOR_HSV2BGR)
#显示图片
cv2.imshow('图片调整',img1)
cv2.waitKey(0)



上面的代码只是简单的对颜色转换进行了实现,大家可以根据博主前面介绍的方法取试验一下,能够将图片转化成各式各样的。好了,本节内容就到此结束了!拜了个拜!

相关文章
|
机器学习/深度学习 算法 测试技术
低照度增强算法(图像增强+目标检测+代码)
低照度增强算法(图像增强+目标检测+代码)
|
机器学习/深度学习 API Python
100天搞定机器学习 番外:使用FastAPI构建机器学习API
100天搞定机器学习 番外:使用FastAPI构建机器学习API
100天搞定机器学习 番外:使用FastAPI构建机器学习API
|
3月前
|
机器学习/深度学习 数据可视化 算法
数据分布不明确?5个方法识别数据分布,快速找到数据的真实规律
本文深入探讨了数据科学中分布识别的重要性及其实践方法。作为数据分析的基础环节,分布识别影响后续模型性能与分析可靠性。文章从直方图的可视化入手,介绍如何通过Python代码实现分布特征的初步观察,并系统化地讲解参数估计、统计检验及distfit库的应用。同时,针对离散数据、非参数方法和Bootstrap验证等专题展开讨论,强调业务逻辑与统计结果结合的重要性。最后指出,正确识别分布有助于异常检测、数据生成及预测分析等领域,为决策提供可靠依据。作者倡导在实践中平衡模型复杂度与实用性,重视对数据本质的理解。
293 3
数据分布不明确?5个方法识别数据分布,快速找到数据的真实规律
|
1月前
|
弹性计算 开发工具 git
通义灵码助你打造专属高德 MCP 服务
如果现有的MCP服务不满足您的需求,通义灵码智能体能够帮助您开发专属MCP服务,直达业务目标。本案例以高德提供的基础MCP服务为基础,借助智能体开发一个订制旅游攻略的高级MCP服务。
|
6月前
|
人工智能 前端开发 程序员
通义灵码2.0 AI 程序员体验
通义灵码AI程序员全面上线,作为国内首个真正落地的AI程序员,支持Qwen2.5-Max等模型并适配VS Code与JetBrains IDEs。它在新功能开发中快速生成代码框架,助力跨语言编程、自动生成单元测试,还能智能分析错误信息提供修复建议。体验活动显示,通义灵码2.0在代码生成、单元测试和跨语言编程上效率显著提升,极大优化开发者工作流程,成为不可或缺的智能助手。
204 3
|
6月前
|
数据采集 数据挖掘 API
深入探究小红书笔记详情页面数据采集接口
小红书作为当下热门的内容分享平台,涵盖时尚、美妆、旅游等领域,其笔记详情页数据对品牌方和市场研究者具有重要意义。通过数据采集接口,可获取标题、评论、点赞等信息,用于竞品分析、内容营销效果评估及趋势预测。例如,企业可通过分析用户兴趣优化产品策略,研究新兴消费趋势指导市场推广。文中还提供了Python请求示例,帮助开发者快速上手使用API接口。
|
机器学习/深度学习 vr&ar 异构计算
diffusers
【9月更文挑战第22天】
645 75
WK
|
10月前
|
机器学习/深度学习 人工智能 算法
那C++适合开发哪些项目
C++ 是一种功能强大、应用广泛的编程语言,适合开发多种类型的项目。它在游戏开发、操作系统、嵌入式系统、科学计算、金融、图形图像处理、数据库管理、网络通信、人工智能、虚拟现实、航空航天等领域都有广泛应用。C++ 以其高性能、内存管理和跨平台兼容性等优势,成为众多开发者的选择。
WK
502 1
|
区块链 Python
最详细Python打包exe教程,并修改图标,只需30秒
最详细Python打包exe教程,并修改图标,只需30秒
664 4
最详细Python打包exe教程,并修改图标,只需30秒