系列文章目录
第一章 图像本质及基础操作
文章目录
- 系列文章目录
- 前言
- 一、数字图像的本质
- 二、图像基础理论
- 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.299−0.1870.50.587−0.3313−0.41870.1140.5−0.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提供了大量能使我们快速便捷地处理数据的函数和方法。