机器视觉学习(四)—— 图像的色彩

news2024/9/24 9:22:40

目录

一、图像的基础知识

二、NumPy模块

三、图像色彩变化

3.1 RGB图像的分通道显示

3.2 HSV图像的分通道显示


一、图像的基础知识

总结的笔记:

"""
二值图:   每个像素取值 0或1,图像显示出来只有黑白色;     黑色:0      白色:1
灰度图:   每个像素8位表示(0~255)单通道显示亮度;     黑色:0     白色:255
彩色图:   每个像素有RGB三个通道分量表示,每个分量0~255,每个通道单拿出来都是一张灰度图;
   黑色(0,0,0)     白色(255,255,255)
RGB:        R:红色              G:绿色                  B:蓝色
Image(BGR),Merge(RGB):  三个图层的顺序不同,由上到下
HSV:        H:色相              S:饱和度                V:明度

OpenCV的 HSV格式中, H(色彩/色度)的取值范围是 [0,180], 
S(饱和度)的取值范围 [0,255], V(亮度)取值范围 [0,255]


图像色彩空间转换:
    cv2.cvtColor(img,code)
        img:        要更改其色彩空间的图像
        code:       色彩空间转换的代码
            cv2.COLOR_BGR2GRAY:         表示从 BGR转换为灰度图像
            cv2.COLOR_BGR2HSV:          表示从 BGR转换为 HSV图像


图层(通道)分离:
    cv2.split(img)
        img:        要分离的图像


图层(通道)合并:
    cv2.merge((a,b,c))
        a,b,c:      要合并的色彩通道


"""

二、NumPy模块

NumPy(Numerical Python)是Python科学计算的核心库之一,提供了高性能的多维数组对象(ndarray)和用于数组操作的函数。它还包括用于处理线性代数、傅里叶变换和随机数生成的工具。

下面是一些常用的 numpy 模块函数的表格:

函数描述
numpy.array()创建一个数组
numpy.zeros()创建一个指定形状和数据类型的全零数组
numpy.ones()创建一个指定形状和数据类型的全1数组
numpy.arange()创建一个指定范围和步长的数组
numpy.linspace()创建一个指定范围内等间距的数组
numpy.reshape()改变数组的形状
numpy.ndim()返回数组的维度
numpy.size()返回数组中的元素数目
numpy.dtype()返回数组的数据类型
numpy.min()返回数组的最小值
numpy.max()返回数组的最大值
numpy.mean()返回数组的平均值
numpy.sum()返回数组的和
numpy.var()返回数组的方差
numpy.std()返回数组的标准差
numpy.dot()计算两个数组的点积
numpy.transpose()反转数组的维度
numpy.vstack()垂直堆叠数组
numpy.hstack()水平堆叠数组
numpy.concatenate()按指定的维度连接数组
numpy.split()将数组分割为多个子数组
numpy.insert()将元素插入到数组的指定位置
numpy.delete()删除数组中的指定元素
numpy.copy()复制数组
numpy.sort()对数组进行排序
numpy.unique()返回数组中的唯一值
numpy.where()返回满足条件的数组元素的坐标
numpy.isnan()检查数组元素是否为 NaN
numpy.isinf()检查数组元素是否为无穷大

这只是一小部分 numpy 模块函数的示例,numpy 模块提供了许多其他功能强大的函数。你可以在 numpy 官方文档中找到更多信息:https://numpy.org/doc/icon-default.png?t=N7T8https://numpy.org/doc/

三、图像色彩变化

图像颜色通道是指图像中的每个像素所包含的颜色信息。

在彩色图像中,通常有三个颜色通道,分别是红色通道(R通道)、绿色通道(G通道)和蓝色通道(B通道)。每个通道都包含着图像中相应颜色的亮度信息,通过对这些通道的组合和调整,可以得到不同的颜色效果和色彩变化。

除了RGB颜色模式外,还有其他的颜色模式,如CMYK模式(青、品红、黄、黑)等,这些颜色模式也有对应的通道。在灰度图像中,只有一个颜色通道,代表灰度级别。

示例:(简易代码)

import cv2

# 加载图像
image = cv2.imread("image.jpg") # 在运行代码时将image.jpg替换为您的图像文件路径


# 分割图像的RGB通道
blue, green, red = cv2.split(image)

# 修改蓝色通道为0
blue = blue * 0

# 修改绿色通道为255
green = green * 0 + 255

# 修改红色通道为0
red = red * 0

# 合并修改后的通道
modified_image = cv2.merge((blue, green, red))

# 显示修改后的图像
cv2.imshow("Modified Image", modified_image)
cv2.waitKey(0)               # 等待用户按下任意键
cv2.destroyAllWindows()
 

复杂代码(需理解):

import cv2
import numpy as np

# 读取图像
image = cv2.imread('image.png')    # 在运行代码时将image.png替换为您的图像文件路径

# 提取RGB颜色通道
red_channel = image[:,:,2]
green_channel = image[:,:,1]
blue_channel = image[:,:,0]

# 将RGB颜色通道转换为不同颜色值
red_channel = np.zeros(red_channel.shape, dtype=np.uint8)  # 设置红色通道为0
green_channel = np.zeros(green_channel.shape, dtype=np.uint8)  # 设置绿色通道为0
blue_channel = np.ones(blue_channel.shape, dtype=np.uint8) * 255  # 设置蓝色通道为255

# 将修改后的颜色通道重新组合成图像
new_image = cv2.merge((blue_channel, green_channel, red_channel))

# 显示原始图像和修改后的图像
cv2.imshow('Original Image', image)        # 名称可修改
cv2.imshow('Modified Image', new_image)    # 名称可修改

# 保存修改后的图像
cv2.imwrite('output.jpg', new_image)

# 等待按下任意键关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
 

3.1 RGB图像的分通道显示

在OpenCV中,图像通道表示图像中的颜色信息。通常,一个彩色图像会有三个通道,分别是红色通道、绿色通道和蓝色通道。每个通道都表示了图像中对应颜色的亮度或强度。

在OpenCV中,可以使用函数cv2.split()来将彩色图像分离为各个通道。这个函数将返回一个包含各个通道的列表。

以下是一个使用OpenCV分离RGB图像通道的例子:

import cv2

# 读取彩色图像
image = cv2.imread('image.jpg')

# 分离通道
b, g, r = cv2.split(image)

# 显示分离的通道
cv2.imshow('Blue', b)
cv2.imshow('Green', g)
cv2.imshow('Red', r)

# 等待按下任意按键继续程序
cv2.waitKey(0)
cv2.destroyAllWindows()

在上面的例子中,cv2.split()函数将彩色图像分离为红色通道(r 通道)、绿色通道(g 通道)和蓝色通道(b 通道)。我们通过cv2.imshow()函数将每个通道显示出来。

注意:

在将通道分离后,每个通道的数据类型是uint8,并且只包含该通道的像素值。

3.2 HSV图像的分通道显示

cv2.cvtColor()函数是OpenCV库中用于图像颜色空间转换的函数。该函数的返回值是转换后的图像。它的原型为:

cv2.cvtColor(src, code[, dst[, dstCn]]) -> dst

参数解释:

  • src:输入图像,可以是NumPy数组或图片文件的路径。
  • code:颜色空间转换的代码,可以是下面这些之一:
    • cv2.COLOR_BGR2GRAY:BGR彩色图像转灰度图。
    • cv2.COLOR_BGR2HSV:BGR彩色图像转HSV颜色空间。
    • cv2.COLOR_BGR2RGB:BGR彩色图像转RGB颜色空间。
    • cv2.COLOR_BGR2LAB:BGR彩色图像转Lab颜色空间。
    • cv2.COLOR_BGR2YCrCb:BGR彩色图像转YCrCb颜色空间。
  • dst可选参数,输出的图像数组。如果不提供该参数,函数会自动创建一个与输入图像相同类型和大小的数组。
  • dstCn可选参数,输出图像的通道数。如果该参数为0,则输出图像和输入图像通道数相同。否则,输出图像将被重新处理为指定的通道数。

以下是一个使用OpenCVBGR转换为 HSV图像再进行分离图像通道的例子:

import cv2 as cv

img = cv.imread("D:/Open_CV/OpenCV_demo/Pictures/r4.png",1)     
# 或 img = cv.imread("Pictures/r4.png",cv.IMREAD_COLOR)

img = cv.resize(img,(320,320),interpolation=cv.INTER_AREA)       # 图像缩放 (长,宽)

R,G,B = cv.split(img)
MergeRGB = cv.merge((R,G,B))                # 三个图层的顺序不同,由上到下
MergeBGR = cv.merge((B,G,R))

hsv_img = cv.cvtColor(img,cv.COLOR_BGR2HSV)                 # 表示从 BGR转换为 HSV图像
H,S,V = cv.split(hsv_img)                   # 图层(通道)分离成 H,S,V
MergeHSV = cv.merge((H,S,V))                # 将 H,S,V 合并

cv.imshow('R4',img)
cv.imshow("B",B)
cv.imshow("G",G)
cv.imshow("R",R)
cv.imshow("MergeRGB",MergeRGB)
cv.imshow("MergeBGR",MergeBGR)

cv.imshow("H",H)
cv.imshow("S",S)
cv.imshow("V",V)
cv.imshow("MergeHSV",MergeHSV)

xin = cv.waitKey(0)                 # 按 ESC键关闭所有窗口
if xin == 27:               
    cv.destroyAllWindows()

运行结果:

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

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

相关文章

CSDN学习笔记总索引(2024)——我的创作纪念日(1024)

从2021-05-21至2024-03-21,我的CSDN博文学习笔记中,收集并展示浏览阅读,点赞收藏评论等数据,以浏览阅读量排逆序展示。 (笔记模板由python脚本于2024年03月21日 10:07:07创建,本篇笔记适合熟悉Python,对其基…

spring boot3登录开发-2(2短信验证码接口实现)

⛰️个人主页: 蒾酒 🔥系列专栏:《spring boot实战》 🌊山高路远,行路漫漫,终有归途 目录 写在前面 上文衔接 内容简介 短信验证码接口实现 1.依赖导入 2.接口分析 3.实现思路 3.功能实现 创建发送短信…

PTA L2-041 插松枝 代码附注释

人造松枝加工场的工人需要将各种尺寸的塑料松针插到松枝干上,做成大大小小的松枝。他们的工作流程(并不)是这样的: 每人手边有一只小盒子,初始状态为空。每人面前有用不完的松枝干和一个推送器,每次推送一…

一些刷题需要用的大数据

无符号版本和有符号版本的区别就是有符号类型需要使用一个bit来表示数字的正负。 如果需声明无符号类型的话就需要在类型前加上unsigned。 整型的每一种都分为:无符号(unsigned)和有符号(signed)两种类型(f…

【小沐学AI】Google AI大模型的一点点学习(Python)

文章目录 1、Google AI简介1.1 Google AI Studio1.2 Bard1.3 PaLM1.4 Gemini1.5 Gemini API1.6 Vertex AI1.7 Gemma 2、Google AI开发2.1 快速入门2.1.1 配置开发环境2.1.2 列出所有模型2.1.3 从文本输入生成文本2.1.4 从图像和文本输入生成文本2.1.5 聊天对话 结语 1、Google …

(vue)新闻列表与图片对应显示,体现选中、移入状态

(vue)新闻列表与图片对应显示&#xff0c;体现选中、移入状态 项目背景&#xff1a;郑州院XX项目首页-新闻展示模块&#xff0c;鼠标移入显示对应图片&#xff0c;且体现选中和移入状态 首次加载&#xff1a; 切换列表后&#xff1a; html: <el-row :gutter"20"…

k8s系列之十五 Istio 部署Bookinfo 应用

Bookinfo 应用中的几个微服务是由不同的语言编写的。 这些服务对 Istio 并无依赖&#xff0c;但是构成了一个有代表性的服务网格的例子&#xff1a;它由多个服务、多个语言构成&#xff0c;并且 reviews 服务具有多个版本。 该应用由四个单独的微服务构成。 这个应用模仿在线书…

javaSwing日记管理系统

一、简介 使用 Java Swing 开发日记管理系统 在今天的博客中&#xff0c;我将向您介绍如何使用 Java Swing 开发一个简单而功能强大的日记管理系统。这个系统将具有登录、注册、找回密码、写日志以及切换主题等功能。我们将使用 MySQL 数据库来存储用户信息和日记内容。 二、…

Springboot集成shiro框架

前言 以前的项目代码&#xff0c;整理记录一下。 一、什么是shiro 官方&#xff1a;Shiro是一个功能强大且易于使用的Java安全框架&#xff0c;可以运行在JavaSE和JavaEE项目中&#xff0c;可执行身份验证、授权、加密和会话管理。 二、Shiro核心组件 1、UsernamePasswordT…

面试真经(运维工程师)

1.熟悉的排序算法有哪些&#xff0c;它们的时间空间复杂度如何? 排序算法主要分为内部排序和外部排序。内部排序指的是数据记录在内存中进行排序&#xff0c;而外部排序则适用于排序的数据量很大&#xff0c;一次不能容纳全部排序记录的情况&#xff0c;需要在排序过程中访问…

【爬虫】专栏文章索引

为了方便 快速定位 和 便于文章间的相互引用等 作为一个快速准确的导航工具 爬虫 目录&#xff1a; &#xff08;一&#xff09;web自动化和接口自动化 &#xff08;二&#xff09;实战-爬取Boss直聘信息数据

为什么物联网网关需要边缘计算能力?边缘计算应用场景有哪些?

【前言】本篇为物联网硬件系列学习笔记&#xff0c;分享学习&#xff0c;欢迎评论区交流~ 什么是边缘计算&#xff1f; 边缘计算&#xff08;Edge Computing&#xff09;是一种分布式计算范式&#xff0c;旨在将计算和数据存储功能放置在接近数据源或终端设备的边缘位置&#…

一代大神跌落神坛——Java炸了!

曾经它是只手遮天的一大计算机语言.......可现如今&#xff0c;腹背受敌、大势已去&#xff0c;一代神话跌落神坛&#xff01; Java薪水20k降至15k难掩颓势&#xff0c;事业编3k升至3500尽显嫡道风范&#xff01;嫡嫡道道、嫡嫡道道~ 没错&#xff0c;就是它&#xff01;Java…

【C语言】模拟实现 atoi

文章目录 atoi()函数模拟实现思路分析代码呈现 atoi()函数 通过上述cplusplus和MSDN对atoi函数的介绍我们可以得出以下几个关键点 库函数&#xff1a; <stdlib.h>形参&#xff1a;const char * str返回值&#xff1a; int作用&#xff1a;atoi函数是将一个字符串转化成一…

运维篇SHELL脚本实战案例

统计出每个IP的访问量有多少&#xff1f; 检查是否提供了日志文件的路径作为参数。使用awk从日志文件的每行中提取第一个字段&#xff08;假设这是IP地址&#xff09;。使用sort对提取的IP地址进行排序。使用uniq -c统计每个唯一IP地址的出现次数。最后&#xff0c;使用sort -…

Python模块-基础知识

Python模块-基础知识 1.模块分类&#xff1a; &#xff08;1&#xff09;自定义模块&#xff1a; 如果你自己写一个py文件&#xff0c;在文件内写入一堆函数&#xff0c;则它被称为自定义模块&#xff0c;即使用python编写的.py文件 &#xff08;2&#xff09;第三方模块&…

从0到1:Java构建高并发、高可用分布式系统的实战经验分享

文章目录 引言基础架构选择与设计微服务架构分布式储存与计算 高并发处理策略异步处理与消息队列并发控制与资源隔离 高可用性设计与故障恢复冗余与集群化容错与自我修复监控与运维自动化 引言 随着互联网业务的快速发展和技术迭代升级&#xff0c;作为Java架构师&#xff0c;…

springboot企业级抽奖项目业务一(登录模块)

开发流程 该业务基于rouyi生成好了mapper和service的代码&#xff0c;现在需要在controller层写接口 实际操作流程&#xff1a; 看接口文档一>controller里定义函数一>看给出的工具类一>补全controller里的函数一>运行测试 接口文档 在登录模块有登录和登出方…

虚拟内存页表和内存保护

前言 大家好我是jiantaoyab&#xff0c;这是我所总结作为学习的笔记第21篇&#xff0c;在这里分享给大家&#xff0c;这篇文章讲虚拟内存和内存之间的页表和内存安全问题。 虚拟内存 前面的文章提到过&#xff0c;程序装载到内存的过程。可以知道&#xff0c;程序并不直接访…

爬虫实战-Python爬取百度当天热搜内容

爬虫实战-Python爬取百度当天热搜内容 学习建议学习目标预期内容目标分解热搜地址热搜标题热搜简介热搜指数小总结 代码实现总结 学习建议 本文仅用于学习使用&#xff0c;不做他用&#xff1b;本文仅获取页面的内容&#xff0c;作为学习和对Python知识的了解&#xff0c;不会…