第一章 数字图像本质及基础操作

news2024/11/15 11:11:52

系列文章目录

第一章 图像本质及基础操作


文章目录

  • 系列文章目录
  • 前言
  • 一、数字图像的本质
  • 二、图像基础理论
    • 1.色彩空间
      • 1.1 RGB模型
      • 1.2 HSV模型
      • 1.3 HSL模型
      • 1.4 YUV模型
      • 1.5 灰度图
      • 1.6 OpenCV中色彩空间转换
    • 2.图片的存储
    • 3.图像参数
  • 三、图像的基础操作及OpenCV画图
    • 1.图像的基础操作
      • 1.1 OpenCV 窗口界面
  • 总结


前言

本章主要讲述数字图像的本质及一些基础操作和一些基础知识。

一、数字图像的本质

数字图像的本质总而言之 言而总之就是由数字构成,其中数字的含义是亮度

对于一个简单的灰度图来说图像就是由一个矩阵所构成,每个矩阵中的元素都表示由黑到白的一个量化,每个元素常用8位二进制表示,十进制范围为0~255
灰度图:请添加图片描述
放大:由灰度点所组成请添加图片描述
量化矩阵:注意数字图像的原点位于左上角,其中正x轴向下延伸,正y轴向右延伸
在这里插入图片描述

对于一个RGB的彩色图来讲,图像由三个矩阵“叠加”而成,或者称之为由三维矩阵构成,其中每个像素由红绿蓝三种光混合而成,因此RGB称为数字图像的三原色。
在这里插入图片描述
在这里插入图片描述

不同于小时候学的绘画的三原色—红黄蓝,因为他们表现颜色的方式不太一样,图画的三原色是一种减色原理,数字图像的显色原理是一种加色原理,具体可百度。

二、图像基础理论

1.色彩空间

1.1 RGB模型

根据光学的三原色而来,图像中的一个像素点由一个数组 [R,G,B] 构成,一般该数组的类型为一个字节的无符号整型

**而在OpenCV中,采用的是反人类的 [B, G, R]

1.2 HSV模型

HSV模型的像素点也是通过一个三维向量进行表示:

  • Hue:色相,将所有颜色通过一个数值进行表示
  • Saturation:饱和度,颜色与白色的混合程度
  • Value:明度, 颜色的明亮程度请添加图片描述

RGB模型可转到HSV模型,具体可参考网上,有具体的公式。

1.3 HSL模型

整个形式和HSV类似

  • Hue:色相, 与HSV类似
  • Saturation:饱和度,颜色的稀释程度
  • Lightness/Brightness:被灯光照的的亮度

比较:

色相饱和度明亮度
HSV所有颜色色相中混入白色的量色相中混入黑色的量
HSL所有颜色色相被稀释的程度拿灯光照射的情况,没光线就黑,强烈光线就白

1.4 YUV模型

  • 作用:可以对色彩空间进行压缩,说人话就是缩减了用来表示像素颜色的数据量,这就使得该模型在图像、视频压缩上应用广泛。
  • 思想:由于人眼对颜色的感知能力较弱,反而对光影关系(黑白图)更为敏感。所以,在YUV模型中,精确保留了图片的黑白关系,而对颜色信息进行了部分删除。
  • 通道
    • Y:该通道存储的是黑白关系,即灰度图
    • UV:这两个通道存储了颜色信息。在对图片颜色时,首先就会对这两个通道的颜色数据进行丢弃。
  • 色彩空间压缩:设有4个像素,每个像素都要3个通道值表示颜色,一个通道为一个字节,那么所有数据一共就有4 × 3 ×1 B = 12 B。现在通过YUV模型对图片进行压缩,丢掉一半的颜色信息,Y通道全部保留4 × 1B = 4B, UV通道丢弃一半就是4 × 2 × 1 B / 2 = 4B,最后数据大小就为4B + 4B = 8B
  • 采样方式: 对于Y全部保留, 对UV进行不同程度的取舍
  • RGB与YUV转换
    [ Y U V ] = [ 0.299 0.587 0.114 − 0.187 − 0.3313 0.5 0.5 − 0.4187 − 0.0813 ] [ R G B ] + [ 0 128 128 ] \begin{bmatrix} Y\\ U\\ V\end{bmatrix} =\begin{bmatrix} 0.299 & 0.587 & 0.114\\ -0.187 & -0.3313 & 0.5\\ 0.5 & -0.4187 & -0.0813\end{bmatrix}\begin{bmatrix} R\\ G\\ B\end{bmatrix} + \begin{bmatrix} 0\\ 128\\ 128\end{bmatrix} YUV = 0.2990.1870.50.5870.33130.41870.1140.50.0813 RGB + 0128128

1.5 灰度图

灰度图是指一幅图像中每个像素点的亮度只有一个值,而没有颜色信息的图像。通常将灰度值从0~255之间的整数表示,灰度值越大,表示像素越亮,反之则越暗。灰度图常用于图像处理、计算机视觉、医学图像、机器人控制等领域。

1.6 OpenCV中色彩空间转换

import cv2

# 读入一张RGB图像
img = cv2.imread('image.jpg')

# 将RGB图像转换为灰度图像
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 将灰度图像转换为RGB图像
rgb_img = cv2.cvtColor(gray_img, cv2.COLOR_GRAY2BGR)

其中,第一个参数是要转换的图像,第二个参数是转换类型。可以使用cv2.COLOR_前缀下的常量来表示不同的色彩空间。例如,BGR转换为灰度图使用cv2.COLOR_BGR2GRAY,灰度图转换为RGB图像使用cv2.COLOR_GRAY2BGR。

除了常用的色彩空间转换之外,还可以使用cv2.cvtColor()函数将HSV、YUV等颜色空间相互转换。

2.图片的存储

  • Python实现:读取的图片类型为**<class ‘numpy.ndarray’>**, 即图片其实是一个数据
    • uint8: 一字节的无符号整数
    • 数据维度: 三维,【高度像素下标,宽度像素下标,RGB值】
  • C++底层实现: Python的OpenCV其实就是对C++的版本进行了再次封装实现。在C++中采用数据结构Mat来对图片进行存储。
class CV EXPORTS Mat{
 public:
     int dims;//维数
     int roWs,cols;//行列数
     unsigned char * data;//存储数据的指针
     int* refcount;//引用计数
    ........
}

从Mat中可以看出,图片数据其实存放在unsigned char *指针指向的一片内存中,也就是说图片数据与Mat类型是分开存放的,这就存在深浅拷贝问题。而Numpy也很好的将该结构继承了下来。

  • Numpy深浅拷贝:
    NumPy的深浅拷贝和Python的深浅拷贝类似,同样也会涉及到数据的内存管理问题。

首先,NumPy的浅拷贝操作可以使用数组的view()方法。view()方法创建一个新的数组对象,与原始数组共享相同的数据缓冲区,但视图对象本身是新的。改变视图对象的形状或维度会更改原始数组的形状或维度。下面是一个使用view()方法的例子:

import numpy as np

# 创建原始的NumPy数组
a = np.array([[1, 2, 3], [4, 5, 6]])

# 使用view()方法创建视图数组
b = a.view()

# 改变视图数组的形状
b.shape = (3,2)

# 查看原始数组和视图数组
print(a)    # 输出 [[1, 2], [3, 4], [5, 6]]
print(b)    # 输出 [[1, 2], [3, 4], [5, 6]]

在上述例子中,通过view()方法创建了视图数组b,原始数组a和视图数组b共享数据缓冲区,因此b的形状的更改也会影响到a的形状。

其次,NumPy的深拷贝操作需要使用copy()方法。与Python的深拷贝类似,copy()方法将复制原始数组及其数据缓冲区,并创建一个新的数组对象,这个新的数组对象是完全独立于原始数组的。下面是一个使用copy()方法的例子:

import numpy as np

# 创建原始的NumPy数组
a = np.array([[1, 2, 3], [4, 5, 6]])

# 使用copy()方法创建深拷贝数组
b = a.copy()

# 改变深拷贝数组的值
b[0,0] = 7

# 查看原始数组和深拷贝数组
print(a)    # 输出 [[1, 2, 3], [4, 5, 6]]
print(b)    # 输出 [[7, 2, 3], [4, 5, 6]]

在上述例子中,使用copy()方法创建了深拷贝数组b,并将b的第一个元素修改为7,而原始数组a并没有受到影响。

需要注意的是,在使用NumPy进行数组操作时,浅拷贝和深拷贝的使用方法与传统的Python列表有所不同。建议在具体使用时,根据需求选择合适的拷贝方式。

3.图像参数

  • 像素: 图片中的一个颜色块
  • 颜色通道: 表示一个像素(颜色)的向量的分量,一个分量就是一个颜色通道,例如RGB模型,像素的组成就为 【R, G, B】 , 这就有三个颜色通道
  • 位深: 一个颜色通道值由几位二进制数表示
  • 像素块坐标: 图片的左上角为坐标原点,一个坐标对应一个像素
  • 分辨率: 图像像素的宽度 ×图像像素的高度

三、图像的基础操作及OpenCV画图

1.图像的基础操作

1.1 OpenCV 窗口界面

OpenCV中有关界面的一些函数:

# 导入 OpenCV
import cv2

# 创建窗口,
cv2.namedWindow('window',cv2.WINDOW_NORMAL)

cv2.namedWindow(winname, flags)
其中:

  • winname 参数是要创建的窗口的名称,类型为字符串;
  • flags 参数是窗口的属性标志,类型为整数。默认值为cv2.WINDOW_AUTOSIZE,表示窗口大小自动调整为显示的图像大小。也可以设置为 cv2.WINDOW_NORMAL,表示可以重新调整窗口大小。
# 更改窗口:window_autosize,设置大小无用
cv2.resizeWindow('window',width=800,height=600)

# 展示窗口、图片等
cv2.imshow('window',0)

# 等待按键
# 1. 将窗口堵塞。等带按键、并会返回按键的ASCII码
# 2. 可以设置等待的时间,单位 ms
# 3. 等待时间为 0 ,则为一直等待 
key = cv2.waitKey(0)

# ord():获取字符的ASCII码
# key & 0xFF:将 int 类型的低字节给提去出来,因为ASCII码为一字节
if key & 0xFF == ord('q'):
    # 销毁窗口
    cv2.destroyAllWindows()

总结

提示:这里对文章进行总结:

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

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

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

相关文章

Hololens2开发指南

练习 - 导入和配置资源 - Training | Microsoft Learn unity需要高版本 用2019.4.30支持平台这没有openxr 用2020.3.36可以&#xff0c;2021版本也可以出现

代码随想录算法训练营第三十天 | 航班问题、二维回溯

回溯法小结 本周小结&#xff01;&#xff08;回溯算法系列三&#xff09; | 代码随想录 (programmercarl.com) 性能分析 子集问题分析&#xff1a; 时间复杂度&#xff1a;O(n 2n)&#xff0c;因为每一个元素的状态无外乎取与不取&#xff0c;所以时间复杂度为O(2n)&…

蚁群算法-车辆配载率的路径优化

车辆配送路径优化问题可描述为&#xff1a;某商超配送中心要使用一定数量的车辆对一批货物进行配送服务&#xff0c;要求在不超过车辆的额定载重量和额定容积的条件下&#xff0c;安排这些货物的装载&#xff0c;使得车辆利用率最高。 针对以上问题做出假设&#xff1a; (1) 只…

Python学习笔记(1)

《Python编程&#xff1a;从入门到实践》学习笔记 python编程软件PyCharm Community Edition 2022.3.2&#xff0c;快捷键&#xff1a;Ctrl/ 表示注释Python代码。 一、变量的命名和使用 1.变量名只能包含字母、数字和下划线。变量名可以字母或下划线打头&#xff0c;但不能以数…

Java开发初学者实用网站

1.慕课网&#xff08;http://www.imooc.com&#xff09;&#xff1a;提供了大量的Java在线教程和视频。 优点 1.广泛的开放性&#xff1a;大规模、开放性和受众广 2.透明性&#xff1a;根据不同兴趣、准备情况和时间来学习所需课程 3.优质资源易获取性&#xff1a;让每位学生…

Python每日一练(20230504)

目录 1. 课程表 Course Schedule I 2. 课程表 Course Schedule II &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 课程表 Course Schedule I 你这个学期必须选修 numCourses 门课程&a…

linux ll命令是什么

ll并不是linux下一个基本的命令&#xff0c;它实际上是ls -l的一个别名。 # 查看指定目录下的内容&#xff0c;默认查看当前目录下内容 ls [-ald] [目录名] # 目录名不填写&#xff0c;默认为当前目录。 # -a&#xff1a;列出的全部的文件&#xff0c;包括隐藏文件 # -l&#x…

医院PACS系统源码,各种类型图像专业的图像处理功能,海量数据存储与检索

RIS/PACS系统源码 RIS/PACS系统源码在预约登记、分诊叫号、技师检查、诊断报告、临床浏览、科室管理等环节满足全院相关科室的要求。在医学影像下载、浏览、处理中满足速度快、强化常用功能、方便阅片等要求。满足放射、超声、内镜、病理等影像科室的业务需求。通过与HIS、LIS…

阿里云AMD服务器CPU:AMD EPYC Genoa 9T34处理器性能

阿里云AMD服务器AMD EPYC Genoa 9T34处理器&#xff0c;主频3.4 GHz&#xff0c;单核睿频最高3.75 GHz&#xff0c;计算性能稳定&#xff0c;阿里云百科分享AMD EPYC™ Genoa 9T34性能测评&#xff1a; 目录 AMD EPYC™ Genoa 9T34 AMD EPYC™ Genoa 9T34 阿里云AMD服务器性…

基于YOLOv4的目标检测系统(附MATLAB代码+GUI实现)

摘要&#xff1a;本文介绍了一种MATLAB实现的目标检测系统代码&#xff0c;采用 YOLOv4 检测网络作为核心模型&#xff0c;用于训练和检测各种任务下的目标&#xff0c;并在GUI界面中对各种目标检测结果可视化。文章详细介绍了YOLOv4的实现过程&#xff0c;包括算法原理、MATLA…

Windows中批量修改DNS记录

最近由于公网映射的IP需要更换&#xff0c;有一批DNS记录需要修改。对于使用Windows管理的DNS记录&#xff0c;可以使用Powershell批量导出记录更新后再批量修改。 首先使用Powershell将DNS服务器上test.local这个区域里的所有A记录导出 Get-DnsServerResourceRecord -Comput…

计算机专业大一的一些学习规划建议!

大家好&#xff0c;我是小北。 五一嗖的一下就过啦~ 对于还在上学的同学五一一过基本上意味着这学期过半了&#xff0c;很多大一、大二的同学会有专业分流、转专业等事情。 尤其是大二的时候&#xff0c;你会发现身边有些同学都加入各种实验室了&#xff0c;有忙着打ACM、学生…

初级算法-贪心算法

主要记录算法和数据结构学习笔记&#xff0c;新的一年更上一层楼&#xff01; 初级算法-贪心算法 一、分发饼干二、摆动序列三、最大子序和四、买卖股票最佳时机五、跳跃游戏六、跳跃游戏二七、k次取反后最大化的数组和八、加油站九、分发糖果十、柠檬水找零十一、根据身高重建…

Python实现哈里斯鹰优化算法(HHO)优化随机森林分类模型(RandomForestClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 2019年Heidari等人提出哈里斯鹰优化算法(Harris Hawk Optimization, HHO)&#xff0c;该算法有较强的全…

SPSS如何检验非参数之案例实训?

文章目录 0.引言1.卡方检验2.二项检验3.双独立样本检验4.多独立样本检验5.双配对样本检验6.多配对样本检验7.游程检验8.单样本K-S检验 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对SPSS进行了学习&#xff0c;本文通过《SPSS统计分析从入门到精通》及其配套素材结…

文献集锦 | 非因空间多组学技术在胰腺癌肿瘤微环境中的研究策略

胰腺导管腺癌(PDAC)仍然是一种难治性疾病&#xff0c;5年总生存率&#xff08;OS&#xff09;仅不到9%&#xff0c;且诊断时多为晚期&#xff0c;治疗手段有限&#xff0c;除了传统的手术切除、放化疗之外&#xff0c;目前越来越多采用新辅助治疗的方法。利用空间组学分析平台深…

报错yarn create @umijs/umi-app Command failed, 文件名、目录名或卷标语法不正确

报错内容&#xff1a; 报错解决&#xff1a; 方法一&#xff1a; 1、我是用 npm 安装的 yarn &#xff1a; npm i yarn tyarn -g 2、我重新设定了 npm 全局包的安装位置 和 缓存位置。 // 查看 npm 全局包的安装位置 npm config get prefix // 查看 npm 缓存位置 npm co…

DTC 2023 | GBASE:构筑完备产品体系 释放数据全量价值

2023年4月7-8日&#xff0c;第十二届『数据技术嘉年华』(DTC 2023) 在京盛大召开。GBASE南大通用受邀参会&#xff0c;携核心产品亮相展区&#xff0c;并就数据库热门话题发表主题分享。 本届大会以“开源融合数字化——引领数据技术发展&#xff0c;释放数据要素价值”为议题…

mvn help:effective-pom命令的作用

无论 POM 文件中是否显示的声明&#xff0c;所有的 POM 均继承自一个父 POM&#xff0c;这个父 POM 被称为 Super POM。在pom的继承关系中&#xff0c;子pom可以覆盖父pom中的配置&#xff1b;如果子pom没有覆盖&#xff0c;那么父pom中的配置将会被继承。按照这个规则&#xf…

lammps教程:斜交转正交的方法

大家好&#xff0c;我是小马老师。 本文介绍lammps斜交模型转正交模型的方法。 多数晶体的模型都能在网上下载到对应的cif文件&#xff0c;但很多cif文件初始结构不是正交的&#xff0c;如sio2的初始结构&#xff1a; 对这种结构进行扩胞后&#xff0c;得到的模型也是一个斜交…