当前位置: 首页 > news >正文

【基于OpenCV的图像处理】图像预处理之图像色彩空间转换以及图像灰度化处理

目录

零、写在前面的话

一、图像色彩空间转换

1.1 RGB颜色空间

1.1.1 RGB颜色空间概念

1.1.2 RGB颜色模型​编辑

1.1.3 关于颜色加法

1.1.4 颜色加权加法

1.2 HSV颜色空间

1.2.1 HSV颜色空间概念

1.2.2 HSV颜色模型

1.2.3 应用意义

1.3 颜色转换

1.3.1 转换方法

1.3.2 RGB转Gray, RGB转HSV

二、图像灰度化处理

2.1 概念基础

2.1.1 灰度图

2.1.2 转化为彩色图

2.1.3 两个极端的灰度值

2.2 灰度化处理方法

2.2.1 最大值法

2.2.2 平均值法

2.2.3 加权均值法


零、写在前面的话

        在这个阶段的学习里,初学者们应该持着正确的学习心态,注重基础操作、多敲代码;遇到搞不懂的原理和难题可以先跳过,先把基础概念以及方法的使用弄明白,待度过“黑盒阶段”后再补理论也是可以的。还有一点,要善用社区资源,可以多看技术文档与相关文章。

        学习图像处理道阻且艰,都说图像预处理是“脏活累活”,但其直接影响后续高级任务的性能,打好基础很重要。那么我们现在就一起开始学习吧。

一、图像色彩空间转换

  • OpenCV中,图像色彩空间转换是一个非常基础且重要的操作,就是将图像从一种颜色表示形式转换为另一种表示形式的过程。
  • 通过将图像从一个色彩空间转换到另一个色彩空间,可以更好地进行特定类型的图像处理和分析任务。
  • 常见的颜色空间包括RGB、HSV、YUV等。

1.1 RGB颜色空间

1.1.1 RGB颜色空间概念

  • RGB代表红色(Red)、绿色(Green)和蓝色(Blue),这三种颜色通过不同强度的光的组合来创建其他颜色。
  • RGB颜色空间是我们接触最多的颜色空间,是一种用于表示和显示彩色图像的一种颜色模型。

1.1.2 RGB颜色模型

RGB颜色模型基于笛卡尔坐标系,RGB颜色空间可以产生大约1600万种颜色,几乎包括了世界上的所有颜色,也就是说可以使用RGB颜色空间来生成任意一种颜色。

注意

  • 在OpenCV中,颜色是以BGR的方式进行存储的,而不是RGB,这也是上面红色的像素值是(0,0,255)而不是(255,0,0)的原因。

1.1.3 关于颜色加法

(1)注意点:两个图像应该具有相同的大小和类型。

(2)方法:

  • 使用OpenCV的 cv.add() 函数。
  • 通过numpy操作添加两个图像,如res = img1 + img2。

(3)区别:OpenCV加法和Numpy加法之间存在差异。OpenCV的加法是饱和操作,而Numpy添加是模运算

1.1.4 颜色加权加法

(1)方法:

cv2.addWeighted(src1,alpha,src2,deta,gamma)

(2)参数解释:

  • src1src2:输入图像。

  • alphabeta:两张图象权重。

  • gamma:亮度调整值。

    • gamma > 0,图像会变亮。

    • gamma < 0,图像会变暗。

    • gamma = 0,则没有额外的亮度调整。

(3)代码演示:

仍沿用之前的图片文件夹位置

import cv2 as cv
import numpy as npcao = cv.imread("../images/cao.png")
pig = cv.imread("../images/pig.png")# 饱和操作
add1 = cv.add(cao, pig)# print(cao)
# print(pig)
# print(add)# numpy是取模运算
add2 = cao + pig
# 一样大小的图片可以进行加法运算
x = np.uint8([[250]])
y = np.uint8([[10]])
xy1 = cv.add(x, y)
xy2 = x + y
print(xy1)
print(xy2)# 加权加法 cv.addWeighted(img1, a, img2, b, c)  c是亮度调节
add3 = cv.addWeighted(cao, 0.3, pig, 0.7, -20)cv.imshow("add", add1)
cv.imshow("add2", add2)
cv.imshow("add3", add3)
# cv.imshow("cao", cao)
# cv.imshow("pig", pig)
cv.waitKey(0)
cv.destroyAllWindows()

1.2 HSV颜色空间

1.2.1 HSV颜色空间概念

  • HSV颜色空间指的是HSV颜色模型,这是一种与RGB颜色模型并列的颜色空间表示法。
  • HSV颜色空间使用色调(Hue)、饱和度(Saturation)和亮度(Value)三个参数来表示颜色,色调H表示颜色的种类,如红色、绿色、蓝色等;饱和度表示颜色的纯度或强度,如红色越纯,饱和度就越高;亮度表示颜色的明暗程度,如黑色比白色亮度低。

1.2.2 HSV颜色模型

HSV颜色模型是一种六角锥体模型:

附图:HSV颜色模型

色调 H: 0 ~ 180

饱和度 S: 0 ~ 255

亮度 V: 0 ~ 255

附图:颜色对照表

1.2.3 应用意义

  • 使用HSV空间处理图像可以更直观地调整颜色和进行色彩平衡等操作,更符合人类的感知习惯。
  • 在HSV颜色空间中,色调、饱和度和亮度的调整都是直观的,而在RGB颜色空间中调整颜色不那么直观。
  • 在图像处理中,降维处理可以减少计算的复杂性和计算量。HSV颜色空间相对于RGB颜色空间,减少了两个维度(红、绿、蓝),这有利于进行一些计算和处理任务,比如色彩分割、匹配等。

因此,在进行图片颜色识别时,我们会将RGB图像转换到HSV颜色空间,然后根据颜色区间来识别目标颜色。

1.3 颜色转换

1.3.1 转换方法

方法:cv2.cvtColor(img,code)

  • img:输入图像,可以是一个Numpy数组绘着一个OpenCV的Mat对象

    • Mat 是一个核心的数据结构,主要用于存储图像和矩阵数据。在 Python 中使用 OpenCV 时,通常直接处理的是 NumPy 数组,cv2 模块自动将 Mat 对象转换为 NumPy 数组。二者之间的转换是透明且自动完成的。例如,当你使用 cv2.imread() 函数读取图像时,返回的是一个 NumPy 数组,但在C++中则是 Mat 对象。

  • code:指定转换的类型,可以使用预定义的转换代码。

    • 例如cv2.COLOR_RGB2GRAY表示从rgb到灰度图像的转换。

1.3.2 RGB转Gray, RGB转HSV

代码演示:

import cv2 as cv# 读取图片
img = cv.imread("../images/1.jpg")# 转换为HSV cv.cvtColor(img, code)
hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
rgb = cv.cvtColor(img, cv.COLOR_BGR2RGB)cv.imshow("hsv", hsv)
cv.imshow("gray", gray)
cv.imshow("rgb", rgb)cv.waitKey(0)
cv.destroyAllWindows()

二、图像灰度化处理

将彩色图像转换为灰度图像的过程称为灰度化,这种做法在图像处理和计算机视觉领域非常常见。

2.1 概念基础

2.1.1 灰度图

  • 灰度图像与黑白图像不同,在计算机图像领域中黑白图像只有黑色与白色两种颜色;但是,灰度图像在黑色与白色之间还有许多级的颜色深度。
  • 灰度图像经常是在单个电磁波频谱如可见光内测量每个像素的亮度得到的,用于显示的灰度图像通常用每个采样像素8位的非线性尺度来保存,这样可以有256级灰度。

2.1.2 转化为彩色图

灰度图与彩色图最大的不同就是:彩色图是由R、G、B三个通道组成,而灰度图只有一个通道,也称为单通道图像,所以彩色图转成灰度图的过程本质上就是将R、G、B三通道合并成一个通道的过程。

2.1.3 两个极端的灰度值

在灰度图像中,“极端”的灰度值指的是亮度的两个极端:最暗和最亮的值。

  • 最暗的灰度值:0。这代表完全黑色,在灰度图像中没有任何亮度。

  • 最亮的灰度值:255。这代表完全白色,在灰度图像中具有最大亮度。

2.2 灰度化处理方法

2.2.1 最大值法

对彩色图像的每个像素,从R、G、B三个通道的值中选出最大的一个,并将其作为灰度图像中对应位置的像素值。

import cv2 as cv
import numpy as nppig = cv.imread("../images/pig.png")
shape = pig.shape# 创建一张和原图大小一样的全零图片
gray = np.zeros((shape[0], shape[1]), dtype=np.uint8)# 灰度化,循环遍历每行的每一列
for i in range(shape[0]):for j in range(shape[1]):gray[i, j,] = max(pig[i, j, 0], pig[i, j, 1], pig[i, j, 2])cv.imshow("gray", gray)
cv.waitKey(0)
cv.destroyAllWindows()

2.2.2 平均值法

对彩色图像的每个像素,将其R、G、B三个通道的像素值全部加起来,然后再除以三,得到的平均值就是灰度图像中对应位置的像素值。

import cv2 as cv
import numpy as nppig = cv.imread("../images/pig.png")
shape = pig.shape# 创建一张和原图大小一样的全零图片
gray = np.zeros((shape[0], shape[1]), dtype=np.uint8)# 灰度化,循环遍历每行的每一列
for i in range(shape[0]):for j in range(shape[1]):gray[i, j] = np.uint8((int(pig[i, j, 0]) + int(pig[i, j, 1]) + int(pig[i, j, 2]))//3)cv.imshow("gray", gray)
cv.waitKey(0)
cv.destroyAllWindows()

2.2.3 加权均值法

  • 对于彩色图像的每个像素,按照一定的权重去乘以每个通道的像素值,并将其相加,得到最后的值就是灰度图像中对应位置的像素值。
  • 对于彩色图像的每个像素,它会按照一定的权重去乘以每个通道的像素值,并将其相加,得到最后的值就是灰度图像中对应位置的像素值。

将上面的代码改一下即可:

import cv2 as cv
import numpy as nppig = cv.imread("../images/pig.png")
shape = pig.shape# 创建一张和原图大小一样的全零图片
gray = np.zeros((shape[0], shape[1]), dtype=np.uint8)# 灰度化,循环遍历每行的每一列
# for i in range(shape[0]):
#   for j in range(shape[1]):
#       gray[i, j] = np.uint8((int(pig[i, j, 0]) + int(pig[i, j, 1]) + int(pig[i, j, 2]))//3)# 加权均值法
wb, wg, wr = 0.35, 0.59, 0.6
for i in range(shape[0]):for j in range(shape[1]):gray[i, j] = np.uint8((int(pig[i, j, 0]) * wb + int(pig[i, j, 1]) * wg + int(pig[i, j, 2]) * wr)//3)cv.imshow("gray", gray)
cv.waitKey(0)
cv.destroyAllWindows()

http://www.lryc.cn/news/597590.html

相关文章:

  • 【web页面接入Apple/google/facebook三方登录】
  • SQL基础⑥ | 聚合函数
  • Java项目中定时任务三方工具和技术的深度应用指南
  • Kubernetes 日志收集
  • biji 1
  • 事务与索引:数据库核心机制详解
  • 解析云蝠智能 VoiceAgent 的技术架构与应用实践
  • Linux第三天Linux基础命令(二)
  • 不同地区的主要搜索引擎工具
  • 原创-基于 PHP 和 MySQL 的证书管理系统 第三版
  • Windows 用 Python3 快速搭建 HTTP 服务器
  • 网络基础DAY18-动态路由协议基础
  • 观影《长安的荔枝》有感:SwiftUI 中像“荔枝转运”的关键技术及启示
  • Linux文件fd
  • 架构师--缓存场景
  • vmware分配了ubuntu空间但是ubuntu没有获取
  • python---列表(List)
  • 龙虎榜——20250723
  • 【Linux系统】基础IO(上)
  • 数字化转型:概念性名词浅谈(第三十四讲)
  • Web前端开发:JavaScript遍历方法详解与对比
  • 文字识别接口-文档识别技术-手写文字识别
  • VRRP的概念及应用场景
  • 字节 AI 编辑器 Trae 2.0 SOLO 出道! 国际版不充分指南及与国内版的对比
  • Python 程序设计讲义(8):Python 的基本数据类型——浮点数
  • day060-zabbix监控各种客户端
  • DPU 的基本运算单元是LUT吗?
  • 【笔记】wow-rag 第5课-流式部署
  • 进程间通信——POSIX 和 System V适用场景
  • c# sqlsuger 获取关联表中一个值