目录

零、写在前面的话

一、图像色彩空间转换

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()

补充说明:

在OpenCV中,内置的灰度化处理函数是:

gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

默认的加权系数(BT.601标准)为:

Gray = 0.114 * B + 0.587 * G + 0.299 * R

这是基于人眼视觉特性制定的加权标准:

  • 人眼对 绿色最敏感,因此 G 权重大;
  • 蓝色最不敏感,因此 B 权重最小;
  • 红色则居中。

这个标准来自ITU-R BT.601视频色彩转换标准。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java TCP 通信详解:从基础到实战,彻底掌握面向连接的网络编程

作为一名 Java 开发工程师&#xff0c;你一定在实际开发中遇到过需要建立稳定连接、可靠传输、有序通信等场景。这时&#xff0c;TCP&#xff08;Transmission Control Protocol&#xff09; 通信就成为你必须掌握的重要技能之一。TCP 是一种面向连接、可靠、基于字节流的传输协…

HTML5 网页游戏设计开发——1、HTML基础

前言 互联网上的应用程序被称为Web程序&#xff0c;Web引用用程序是用Web文档&#xff08;网页&#xff09;累表现用户界面&#xff0c;而Web文档都遵守HTML格式。HTML5是最新的HTML标准。之前的版本HTML4.01于1999年发布&#xff0c;小20年过去了&#xff0c;互联网已经发声了…

opencv圖片標注

功能使用python opencv, 將文字信息標注在圖片中同一張圖片中涉及多次標注文字大小為標注框的0.3倍使用多綫程運行import cv2 import threading import numpy as npdef draw_annotations(item, annotations):"""在图片上绘制标注框和文本annotations: 标注列表…

矩阵SVD分解计算

对于有数学库的时候,进行矩阵相关计算还是不复杂,但是没有数学库就很麻烦,利用算法实现了矩阵奇异值分解。 void decompose(const std::vector<std::vector<double>>& A, std::vector<std::vector<double>>& U, std::vector<dou…

Flutter基础(前端教程①⑦-Column竖直-Row水平-Warp包裹-Stack堆叠)

MainAxisAlignment 是一个枚举类&#xff0c;用于控制主轴&#xff08;Main Axis&#xff09; 方向上子组件的排列和对齐方式。MainAxisAlignment 的常用取值及效果&#xff1a;MainAxisAlignment.start子组件沿主轴的起点对齐&#xff08;Row 左对齐&#xff0c;Column 顶部对…

构建智能视频中枢--多路RTSP转RTMP推送模块在轨道交通与工业应用中的技术方案探究

1️⃣ 行业背景与技术需求&#x1f688; 轨道交通行业对视频监控的深度依赖在现代城市轨道交通系统中&#xff0c;视频监控已不仅仅是安防的一部分&#xff0c;更是贯穿于运营管理、车辆调度、应急指挥和安全保障的核心技术手段。列车车载监控 ——列车上普遍部署多路高清摄像头…

【Android Studio 2025 汉化教程】

废话不多说&#xff0c;直接上干货。 前提&#xff1a;JeBrains系列2025版已经集成中文插件&#xff0c;用户不需下载&#xff0c;只要设置下即可&#xff0c;但Android Studio并不内置也不提供汉化插件。需要工具&#xff1a; 1.IDEA&#xff08;其他JeBrains系列也可以&#…

网络安全初级(前端页面的编写分析)

源代码index.html<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>登录页面</title><!--…

RAG项目实战:LangChain 0.3集成 Milvus 2.5向量数据库,构建大模型智能应用

项目背景 最近&#xff0c;有时间&#xff0c;想着动手实战一下&#xff0c;从0到1搭建一个 RAG 系统&#xff0c;也是想通过实战的方式来更进一步学习 RAG。因此&#xff0c;就定下了以项目实战为主&#xff0c;书籍为辅的执行方式。&#xff08;书籍是黄佳老师著的《RAG 实战…

docker build 和compose 学习笔记

目录 docker build 笔记 1. 路径解析 2. 关键注意事项 2. docker compose up -d 核心区别对比 常见工作流 补充说明 1. 功能区别 2. 协作关系 场景 1&#xff1a;Compose 自动调用 Build 场景 2&#xff1a;先 Build 后 Compose 3. 关键区别 4. 为什么需要协作&…

Java学习第六十六部分——分布式系统架构

目录 一、前言提要 二、核心目标 三、核心组件与技术 1. 服务拆分与通信 2. 服务注册与发现 3. 配置中心 4. 负载均衡 5. 熔断、降级与限流 6. API 网关 7. 分布式数据管理 8. 分布式追踪与监控 9. 容器化与编排 四、典型Java分布式技术栈组合 五、关键…

Pycharm的Terminal打开后默认是python环境

Pycharm的Terminal打开后默认是python环境解决方案Pycharm的Terminal打开后默认是python环境&#xff0c;无法执行pip等命令&#xff0c;也没办法退出 解决方案 点击Settings -> Tools -> Terminal 可以看到当前默认打开的是torch19py38环境中的python.exe&#xff08;…

LVS——nat模式

一、搭建nat模式下LVS的实验环境1.创建四台虚拟机client——客户端&#xff1a;192.168.134.111/24&#xff08;nat模式&#xff09;LVS——调度器【双网卡】&#xff1a;192.168.134.112/24&#xff08;nat模式&#xff09;、172.25.254.111/24&#xff08;仅主机模式&#xf…

ElasticSearch是什么

ElasticSearch是什么 ElasticSearch 是一个基于 Apache Lucene 的开源分布式搜索引擎&#xff0c;用于全文搜索、日志分析、实时数据分析等场景。它以高性能、分布式架构和易用性著称&#xff0c;支持 JSON 格式的数据存储和查询&#xff0c;广泛应用于日志监控、搜索服务、企业…

linxu CentOS 配置nginx

1、准备要发布的文件夹sudo mkdir -p /var/www/myfiles # 创建文件夹&#xff08;如果不存在&#xff09; sudo chmod -R 755 /var/www/myfiles # 设置权限&#xff08;确保 Nginx 可以读取&#xff09; sudo chown -R nginx:nginx /var/www/myfiles # 修改所有者&#xff0…

内网穿透利器:基于HTTPHTTPS隧道的代理工具深度解析

内网穿透利器&#xff1a;基于HTTP/HTTPS隧道的代理工具深度解析 一、引言 在渗透测试和内网渗透中&#xff0c;HTTP/HTTPS隧道技术是突破网络边界的关键手段。它通过将TCP流量封装在HTTP协议中&#xff0c;穿透防火墙/NACL策略&#xff0c;实现内网横向移动。本文以reGeorg为…

容器编排K8S

k8s概述 容器部署优势:部署方便,不依赖底层环境,升级镜像 本质是一个容器编排工具,golang语言开发 master master管理节点:kube-api-server请求接口,kube-scheduler调度器,kube-controller-manager控制器/管理器,etcd分布式存储数据库 work node服务节点:kubelet代理保…

C语言:深入理解指针(1)

1. 内存和地址在了解指针前&#xff0c;我们需要知道内存和地址是什么。1.1 内存首先来看内存。举个例子&#xff1a;当你在酒店找房间时&#xff0c;你并不是一层一层一间一间找&#xff0c;而是通过酒店为每间房子设置的门牌号直接找到你的房间&#xff0c;这样的效率就会快很…

完整的 SquareStudio 注册登录功能实现方案:已经烧录到开发板正常使用

根据你的需求&#xff0c;我将提供完整的实现方案&#xff0c;解决按钮同时执行多个动作的问题&#xff0c;并确保注册登录功能正常工作。所需文件结构需要创建和修改的文件如下&#xff1a;ui_events.h - 事件处理函数声明events.c - 实际的事件处理逻辑ui.c - UI 初始化和事件…

OkHttp 与 Chuck 结合使用:优雅的 Android 网络请求调试方案

前言在 Android 应用开发过程中&#xff0c;网络请求调试是日常工作中不可或缺的一部分。Chuck 是一个轻量级的 OkHttp 拦截器&#xff0c;能够在应用内直接显示网络请求和响应的详细信息&#xff0c;无需连接电脑或使用额外工具。本文将详细介绍如何将 OkHttp 与 Chuck 结合使…