前言:这篇文章开始讲解CNN,此前讲解的人工神经网络(ANN)如果有小伙伴还不清楚,一定要多看,多练习,继续一起努力前进吧!
CNN(Convolutional Neural Network,卷积神经网络)是一种专门用于处理网格结构数据(如图像、音频、文本序列)的深度学习模型。它在计算机视觉(CV)和自然语言处理(NLP)中广泛应用,尤其在图像分类、目标检测、语义分割等任务中表现优异。
在介绍CNN之前,我们需要先对图像有一个认识。
简单来说,图像一般分为二值图像、灰度图像、索引图像和真彩色RGB图像。
一、二值图像
二值图像是二维图像,仅由0、1两个值构成,“0”代表黑色,“1”代白色。由于每一像素(矩阵中每一元素)取值仅有0、1两种可能,所以计算机中二值图像的数据类型通常为1个二进制位。二值图像通常用于文字、线条图的扫描识别(OCR)和掩膜图像的存储。
黑白图:
PyTorch代码实现:
import numpy as np
import matplotlib.pyplot as plt
#绘制黑色图像
plt.imshow(np.zeros((100,100)),cmap='gray')
plt.show()
二、*灰度图像
灰度图像也是二维图像,矩阵元素的取值范围通常为[0,255]。因此其数据类型一般为8位无符号整数的(int8),这就是人们经常提到的256灰度图像。**“0”表示纯黑色,“255”表示纯白色,中间的数字从小到大表示由黑到白的过渡色。**二值图像可以看成是灰度图像的一个特例。
灰图:
PyTorch代码实现:
import random
# 创建灰度图像数组(单通道)
# 值范围0-255,dtype=np.uint8
gray_image = np.random.randint(0, 255, (height, width), dtype=np.uint8)
# 显示图像
plt.imshow(gray_image, cmap='gray') # 必须指定cmap='gray'
plt.axis('off')
plt.show()
三、索引图像
索引图像照样是二维图像,但它的文件结构比较复杂,除了存放图像的二维矩阵外,还包括一个称之为颜色索引矩阵MAP的二维数组。MAP的大小由存放图像的矩阵元素值域决定,如矩阵元素值域为[0,255],则MAP矩阵的大小为256Ⅹ3,用MAP=[RGB]表示。MAP中每一行的三个元素分别指定该行对应颜色的红、绿、蓝单色值,MAP中每一行对应图像矩阵像素的一个灰度值,如某一像素的灰度值为64,则该像素就与MAP中的第64行建立了映射关系,该像素在屏幕上的实际颜色由第64行的[RGB]组合决定。也就是说,图像在屏幕上显示时,每一像素的颜色由存放在矩阵中该像素的灰度值作为索引通过检索颜色索引矩阵MAP得到。
索引图:
PyTorch代码实现:
# 设置图像大小和颜色数量
height, width = 256, 256
num_colors = 16
# 生成随机索引矩阵
random_indices = np.random.randint(0, num_colors, (height, width))
# 使用Matplotlib内置的colormap
plt.imshow(random_indices, cmap='viridis', vmin=0, vmax=num_colors-1)
plt.colorbar(label='Color Index')
plt.axis('off')
plt.show()
四、真彩色RGB图像
RGB图像与索引图像一样都可以用来表示彩色图像。与索引图像一样,它分别用红(R)、绿(G)、蓝(B)三原色的组合来表示每个像素的颜色。但与索引图像不同的是,RGB图像每一个像素的颜色值(由RGB三原色表示)直接存放在图像矩阵中,由于每一像素的颜色需由R、G、B三个分量来表示,**M、N分别表示图像的行列数,三个M x N的二维矩阵分别表示各个像素的R、G、B三个颜色分量。**RGB图像的数据类型一般为8位无符号整形。注意:通道的顺序是 BGR 而不是 RGB。
RGB彩图:
PyTorch代码实现:
plt.imshow(plt.imread(r'D:\深度学习\04_数据集\data\img.jpg'))
plt.show()
最后,分享一段代码,生成一片星空,送给大家:
# 创建全蓝图像
blue_img = np.zeros((200, 200, 3)) # 初始化全黑图像
blue_img[:, :, 2] = 1 # # RGB通道:蓝色=1.0(Matplotlib取值范围0~1)
for _ in range(num_points):
y = np.random.randint(0, 200) # 随机行坐标
x = np.random.randint(0, 200) # 随机列坐标
blue_img[y, x] = [1, 1, 1] # 设为白色
radius = np.random.randint(0, 2) # 随机半径0~2像素
draw_circle(blue_img, y, x, radius=radius)
plt.imshow(blue_img) #渲染
plt.axis('off') # 关闭坐标轴
plt.show() #显示图像
星空图
晚安。
今天的分享到此结束。