1、图片的加载
# 导入OpenCV库
import cv2
# 读取图像文件
# imread()函数用于从指定路径加载图像
image = cv2.imread('D:\\Torch\\Picture\\monkey.png')
# 检查图像是否成功加载
# 如果图像未加载成功,imread()会返回None
if image is None:
print("Error: Unable to load image.")
else:
print("Image loaded successfully.")
# 显示图像
# imshow()函数用于在窗口中显示图像
cv2.imshow('Loaded Image', image)
# 等待用户按任意键关闭窗口
# waitKey(0)表示无限等待,直到用户按键
cv2.waitKey(0)
RGB 颜色模型
- RGB 颜色模型 是一种基于加法混色的颜色表示法,用于在电子显示器、数字图像、传感器等中表示颜色。
- 每个像素的 RGB 值 包含三个分量,每个分量通常用一个 8 位整数表示,因此每个分量的值范围是 0 到 255。
2:图像的矩阵表示
灰度图像:如果图像是灰度图像(即黑白图像),那么它可以表示为一个二维矩阵。矩阵的每个元素对应图像中的一个像素点,元素的值表示该像素点的灰度值(通常在 0 到 255 之间),0 表示黑色,255 表示白色,中间的值表示不同的灰度级别。
eg:图像分辨率:宽高=500480
灰度图像→二维矩阵→csv文件:500列 480行→每一个单元格对应一个像素
彩色图像:如果图像是彩色图像(如 RGB 图像),则它可以表示为一个三维矩阵。这个三维矩阵由三个二维矩阵组成,每个二维矩阵分别表示红色(R)、绿色(G)、蓝色(B)通道的值。每个通道矩阵的大小与图像的分辨率相同。每个通道的矩阵值范围通常也是 0 到 255,表示对应颜色通道的强度。
3:图片的灰度化(使用Pillow)
image_path = 'D:\\Torch\\Picture\\monkey.png'
# 打开彩色图像
color_image = Image.open(image_path)
# 将彩色图像转换为灰度图像
gray_image = color_image.convert('L')
# Gray=0.299×R+0.587×G+0.114×B
# 将灰度图像转换为二维矩阵
gray_image = np.array(gray_image)
print(f"图像数据类型: {gray_image.dtype}")
cv2.imwrite('D:\\Torch\\Picture\\Monkey_gray.jpg', gray_image)
print("图片已保存")
# 保存灰度矩阵为CSV文件
with open('D:\\Torch\\Picture\\monkey_gray_matrix.csv', 'w', newline='') as file:
writer = csv.writer(file)
writer.writerows(gray_image)
Pillow库在进行灰度化转换时,使用的是以下加权平均法来计算灰度值,公式如下:
![](https://i-blog.csdnimg.cn/direct/0e3f80f6b7964785a8b9757158baf878.png)
Pillow 提供了多种图像模式,可以用于不同的转换和操作。常见的模式有:
'1'
: 1位像素,黑白图像,非零值为黑色。'L'
: 8位像素,灰度图像,灰度值范围从0到255。'RGB'
: 3x8位像素,真彩色图像,每个像素由红、绿、蓝三色组成。'RGBA'
: 4x8位像素,具有透明度通道的真彩色图像。'CMYK'
: 4x8位像素,颜色分量为青、洋红、黄、黑,常用于印刷。'HSV'
: 色调、饱和度、明度模式。'P'
: 8位像素,使用调色板映射到任何其他模式。
4:灰度翻转
通过计算 **
255 - gray_image
** 对每个像素值进行反转操作。
# 定义图片的路径
image_path = 'D:\\Torch\\Picture\\monkey_gray.png'
# 读取灰度图像
gray_image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
# 进行灰度反转
inverted_image = 255 - gray_image
cv2.imwrite('D:\\Torch\\Picture\\monkey_gray_inverted.jpg', inverted_image)
5:图像的仿射变换
1. 线性变换
线性变换是仿射变换的一个组成部分,主要涉及对图像进行旋转、缩放、剪切等操作。在线性变换中,图像的各个点的坐标会通过一个矩阵乘法进行变换,从而改变图像的几何形状。
- 旋转:将图像围绕某个点(通常是图像的中心)旋转一定的角度。旋转可以改变图像的方向。
- 缩放:调整图像的大小。缩放操作可以使图像变大或变小。
- 剪切:改变图像形状,使图像看起来像被倾斜的效果。
2. 平移
将图像在空间中的位置进行移动。通过平移,可以将图像整体向左、向右、向上或向下移动,而不会改变图像的形状或大小。
平移通过在点的坐标上加上一个常量值来实现。例如,如果要将图像向右移动10个像素,则可以将每个点的x坐标加上10。
3. cv2.getRotationMatrix2D
# 读取图像
image = cv2.imread('D:\\Torch\\Picture\\monkey.png')
# 获取图像的高度和宽度
(h, w) = image.shape[:2]
# 设置旋转中心为图像的中心
center = (w // 2, h // 2)
# 设置旋转角度(比如旋转45度)和缩放比例(1.0表示不缩放)
angle = 75 # 旋转角度,正值表示逆时针旋转,负值表示顺时针旋转
scale = 1 # 缩放比例,1.0 表示原始大小
# 生成旋转矩阵
# getRotationMatrix2D返回一个2x3的旋转矩阵
rotation_matrix = cv2.getRotationMatrix2D(center, angle, scale)
# 进行仿射变换(旋转变换)
# warpAffine(image, M, dsize) 使用指定的旋转矩阵 M 进行仿射变换
rotated_image = cv2.warpAffine(image, rotation_matrix, (w, h))
print(f"{type(rotated_image)}")
# 保存旋转后的图像
cv2.imwrite('D:\\Torch\\Picture\\rotated_monkey.png', rotated_image)
**cv2.getRotationMatrix2D(center, angle, scale)**函数相当于为你自动计算好了旋转矩阵的各个参数。它通过你提供的旋转角度、中心点和缩放比例,生成一个用于图像旋转和缩放的 2x3 仿射变换矩阵。
这个矩阵本质上是一个简化了的仿射变换矩阵,已经包含了旋转和缩放的计算,所以你不需要手动计算每个像素的新位置。你只需要将这个矩阵传递给 **
cv2.warpAffine
** 函数,它就会根据矩阵自动对图像进行旋转和缩放操作。
6:对数变换
取对数的目的是为了压缩高亮区域的灰度值,使得亮度跨度大的图像在视觉上更加均匀。通过对数变换,高亮部分的灰度值变化被压缩,而暗部区域的细节得到增强。
# 将像素值转换为浮点数类型
image_float = np.float32(image)
# 对数变换公式:s = c * log(1 + r)
c = 255 / np.log(1 + np.max(image_float))
log_image = c * (np.log(1 + image_float))
# 归一化到0-255范围
log_image = np.uint8(log_image)
你想一下log函数,是不是亮度越低加成越大,亮度越高加成越小!
7:伽马变换
调整图像的亮度,使其符合人眼。也可以作为一种数据增强手段,增加数据的多样性,提高模型泛化能力。
- Gamma < 1:使图像变得更亮。
- Gamma > 1:使图像变得更暗。
gamma=2 gamma=0.5
8:直方图
- 灰度图像的直方图:在灰度图像中,像素值范围通常是 0 到 255,表示从黑到白的灰度级别。灰度图像的直方图只表示一个通道(灰度值),其横轴表示灰度值,纵轴表示每个灰度值出现的频率。
- RGB图像的直方图:在 RGB 图像中,每个像素由三个值(红、绿、蓝)组成,每个值通常在 0 到 255 之间。RGB 图像的直方图会有三个通道的直方图,分别对应红、绿、蓝三个颜色通道。每个通道的直方图独立显示该颜色通道的像素值分布。
9:直方图均衡化-----cv2.equalizeHist
为了增加对比度,让图像看起来更清楚。右图为均衡化后的灰度图。
直方图均衡化的工作原理
- 计算直方图:统计每个灰度级的像素数量。
- 计算累计直方图:计算每个灰度级的累计分布(所占比例,还要把前几级的灰度值占比也加 上)
- 映射灰度级:output=累计占比图片中最亮灰度级
10:空间域滤波
空间域指的是直接在图像像素上操作的方法。
滤波用于 突出特性 or 减少噪声。
核心概念是卷积操作,即使用一个小矩阵(称为滤波器或核)在图像的像素上进行移动,并对其覆盖的区域进行计算。这种操作可以实现模糊、锐化、边缘检测等。
- 模糊滤波:通过均值滤波器(如3x3的核)对图像进行平滑处理,去除细小的噪声,使图像看起来更柔和。
- 锐化滤波:通过增强图像的边缘,使图像中的细节更加清晰。
- 边缘检测:通过如Sobel滤波器,找出图像中的边缘特征,这在识别物体轮廓时非常有用。
平滑滤波
(1)平滑线性滤波器(盒装滤波器)
为了对感兴趣的物体得到一个粗略的描述而模糊一幅图像。模糊之后,小目标被拉的跟背景很接近,因此再根据大目标的灰度值选一个阈值,很好的提取目标。(右图9*9卷积核)
(2)中值滤波器
** **像素邻域内灰度的中值替换目标像素。去除椒盐噪声。由于椒盐噪声是极大值,极小值。而中值滤波相当于用中值替代。左:椒盐噪声图 右:中值去噪
(3)高斯滤波器
一种线性滤波器,取滤波器窗口内的像素的均值作为输出。
锐化滤波
突出灰度的过渡部分(比如寻找边界,增强图像),锐化操作主要是对图像求一阶导数和二阶导数。
(1)Prewitt算子
(2)Sobel算子
(3)拉普拉斯算子
11:频率域
该部分转载于:傅里叶
基于变换域的去噪技术是将数字图像通过某一方法从空间域变换至频率域进行表达与处理。由于频率域的噪声数据特征更容易分辨,有利于将噪声与图像信息分离。通 过频率域的去噪处理后,再将图像变换到空间域,实现去除噪声的目的。
任何周期函数都可以表示为不同频率的正弦和/余弦和的形式
很多在时域看似不可能做到的数学操作,在频域相反很容易。这就是需要傅里叶变换的地方。尤其是从某条曲线中去除一些特定的频率成分,这在工程上称为滤波,是信号处理最重要的概念之一,只有在频域才能轻松的做到。
1:先在频率域选择一个好的滤波器
2:该滤波器 由 傅里叶反变换 得到空间域的滤波器
3:再取样生成空间域的滤波模板
平滑滤波
(1)理想低通滤波器-ILPF
理想表明在半径确定的圆内,所有频率无衰减的通过。而在圆外则完全被衰减。(具有非常明确的频率截止点,滤波器内的所有频率分量都被保留,而超出截止频率的所有频率分量则被完全去除。)
- 该滤波器使得图像的过渡更加平滑,减少边缘和细节的锐度。
- 去除图像中的高频分量,可以有效减少噪声,但同时也会模糊图像细节。
- 振铃效应:即滤波后图像边缘附近出现伪影),过滤掉的频率越多,振铃效果越明显
截至频率10 截至频率66
(2)巴特沃斯低通滤波器-BLPF
与理想低通滤波器不同,巴特沃斯滤波器不会在某个截止频率处突然截断高频,而是随着频率的增加逐渐衰减。它的平滑特性使得滤波后的图像更自然,减少了理想低通滤波器可能带来的振铃效应
阶数越高,振铃效果越明显。
椒盐噪声表现为图像中的随机高亮或低亮像素(即白点或黑点),这些噪声通常被认为是图像的高频成分。BLPF通过在频域中衰减高频成分,从而降低噪声的影响。
(3)高斯低通滤波器-GLPF
通过调整截止频率,可以精确控制滤波的程度。
低→更强的平滑效果,
高→更多的图像细节
锐化滤波
12:低通/高通滤波
低频→缓慢变化的部分
高频→灰度的尖锐过渡(边缘和噪声)
1. 低通滤波(Low-Pass Filtering)
允许低频成分通过 而 阻止或减弱高频成分的滤波过程。
低频成分通常与图像或信号的整体结构和缓慢变化的部分有关。
- 在图像处理中的应用: - 平滑图像: 低通滤波器可以用来平滑图像,去除高频的噪声和细节,使图像看起来更柔和。常见的低通滤波器包括平均滤波器和高斯滤波器。- 降噪: 低通滤波器可以用来去除图像中的高频噪声,如细小的随机噪声,保留图像的主要结构。
- 效果: 经过低通滤波后的图像通常会变得模糊,因为高频的边缘细节被抑制。
2. 高通滤波(High-Pass Filtering)
允许高频成分通过而阻止或减弱低频成分。
高频成分通常与图像或信号的细节和边缘有关。
- 在图像处理中的应用:- 边缘检测: 高通滤波器可以用来提取图像中的边缘和细节部分,这对于图像分析和特征提取非常重要。常见的高通滤波器包括Sobel滤波器、Laplacian滤波器等。- 增强细节: 高通滤波可以增强图像中的细节,使边缘更加清晰突出。
- 效果: 经过高通滤波后的图像通常会突出边缘和细节部分,低频的背景部分则被抑制,因此图像可能会显得更锐利,但也可能会引入一些噪声。
13:形态学
(1)
(2)
14:评估指标
(1)PSNR
(2)
版权归原作者 kbabk 所有, 如有侵权,请联系我们删除。