【灰度实验】——图像预处理(OpenCV)

目录

[1 灰度图](#1 灰度图)

[2 最大值法](#2 最大值法)

[3 平均值法](#3 平均值法)

[4 加权均值法](#4 加权均值法)

[5 两个极端的灰度值](#5 两个极端的灰度值)


将彩色图转为灰度图地过程称为灰度化。

灰度图是单通道图像,灰度化本质就是将彩色图的三通道合并成一个通道的过程。三种合并方法:最大值法,平均值法和加权均值法。

1 灰度图

灰度图像与黑白图像不同,在计算机图像领域中黑白图像只有黑色与白色两种颜色;但是,灰度图像在黑色与白色之间还有许多级的颜色深度。灰度图像经常是在单个电磁波频谱如可见光内测量每个像素的亮度得到的,用于显示的灰度图像通常用每个采样像素8位的非线性尺度来保存,这样可以有256级灰度。

2 最大值法

从彩色图像的R、G、B三个通道的值中选出最大的一个作为灰度图像中对应位置的像素值。

例如某图像中某像素点的像素值如上图所示,那么在使用最大值法进行灰度化时,就会从该像素点对应的RGB通道中选取最大的像素值作为灰度值,所以在灰度图中的对应位置上,该像素点的像素值就是121。

案例:

python 复制代码
import cv2 as cv
import numpy as np
# 灰度化:最大值法:图像大小不变,像素点个数不变,通道数由3变1,像素值会变,变成三个通道里的最大值
pig = cv.imread("../day02/images/pig.png")
# 获取原图大小,形状
h,w,_ = pig.shape
# 创建一个和原图一样大小的图像,放像素,拿这张图就是灰度化后的图
gray = np.zeros((h,w),dtype=np.uint8)
# 遍历原图,取出每个像素点,拿到三个通道里面的最大像素值,放进创建的图像里面
# 遍历行
for i in range(h):
    # 遍历列
    for j in range(w):
        # 取出每个像素点 img[i,j] [200,200,99]
        # gray[i,j] = max(pig[i,j][0],pig[i,j][1],pig[i,j][2])
        gray[i,j]=max(pig[i,j])
# 显示图像,看看效果
cv.imshow("pig",pig)
cv.imshow("gray",gray)
cv.waitKey(0)
cv.destroyAllWindows()

输出:

|----------------------------------------------------------------------------|----------------------------------------------------------------------------|
| | |
| 原图 | 灰度图(最大值法) |

3 平均值法

从彩色图像的R、G、B三个通道取平均值作为灰度图像中对应位置的像素值。

例如某图像中某像素点的像素值如上图所示,那么在使用平均值进行灰度化时,其计算结果就是(91+121+46)/3=86(对结果进行取整),所以在灰度图中的对应位置上,该像素点的像素值就是86。

案例:

python 复制代码
import cv2 as cv
import numpy as np
# 灰度化:最大值法:图像大小不变,像素点个数不变,通道数由3变1,像素值会变,变成三个通道里的最大值
pig = cv.imread("../day02/images/pig.png")
# 获取原图大小,形状
h,w,_ = pig.shape
# 创建一个和原图一样大小的图像,放像素,拿这张图就是灰度化后的图
gray = np.zeros((h,w),dtype=np.uint8)
# 遍历原图,取出每个像素点,拿到三个通道里面的最大像素值,放进创建的图像里面
# 遍历行
for i in range(h):
    # 遍历列
    for j in range(w):
        gray[i,j] = np.uint8(((int(pig[i,j,0])+int(pig[i,j,1])+int(pig[i,j,2]))//3)) # 使用int()是为了防止np.uint8溢出,最后再转回去即可
# 取出每个像素点 img[i,j] [200,200,99]
# 显示图像
cv.imshow("pig",pig)
cv.imshow("gray",gray)
print(pig.shape,gray.shape)
cv.waitKey(0)
cv.destroyAllWindows()

输出:

|----------------------------------------------------------------------------|----------------------------------------------------------------------------|
| | |
| 原图 | 灰度图(平均值法) |

4 加权均值法

彩色图像每个通道乘以一定的权重在相加得到灰度图像对应位置的像素值。

例如某图像中某像素点的像素值如上图所示,那么在使用加权平均值进行灰度化时,其计算结果就是10*0.299+121*0.587+46*0.114=79。所以在灰度图中的对应位置上,该像素点的像素值就是79。

案例:

python 复制代码
import cv2 as cv
import numpy as np
# 灰度化:最大值法:图像大小不变,像素点个数不变,通道数由3变1,像素值会变,变成三个通道里的最大值
pig = cv.imread("../day02/images/pig.png")
# 获取原图大小,形状
h,w,_ = pig.shape
# 定义三个通道上的权重
wr = 0.299
wg = 0.587
wb = 0.114
# 创建一个和原图一样大小的图像,放像素,拿这张图就是灰度化后的图
gray = np.zeros((h,w),dtype=np.uint8)
# 遍历原图,取出每个像素点,拿到三个通道里面的最大像素值,放进创建的图像里面
# 遍历行
for i in range(h):
    # 遍历列
    for j in range(w):
        # 取出每个像素点 img[i,j] [200,200,99]
        # R:0.299 G:0.587 B:0.114
        gray[i,j] = round(pig[i,j,0]*wb + pig[i,j,1]*wg + pig[i,j,2]*wr)
# 显示图像
cv.imshow("pig",pig)
cv.imshow("gray",gray)
print(pig.shape,gray.shape)
cv.waitKey(0)
cv.destroyAllWindows()

输出:

|----------------------------------------------------------------------------|----------------------------------------------------------------------------|
| | |
| 原图 | 灰度图(加权均值法) |

5 两个极端的灰度值

在灰度图像中,"极端"的灰度值指的是亮度的两个极端:最暗和最亮的值。

  • 最暗的灰度值:0。这代表完全黑色,在灰度图像中没有任何亮度。

  • 最亮的灰度值:255。这代表完全白色,在灰度图像中具

灰度值为0(纯黑) 灰度值为255(纯白)
相关推荐
悟天特斯14 分钟前
智慧园区的“体验升级“:从管理工具到服务生态的人本运营
大数据·人工智能
织码weavecodes2 小时前
织码在线教育系统--主观题 AI 智能阅卷:批量初评与教师复核如何协同
人工智能
Shockang8 小时前
llama.cpp 本地运行 9B 模型:部署、工具调用与微调数据
人工智能
Shockang8 小时前
n8n 智能体工作流实战:触发、工具、记忆与发布护栏
人工智能
冬奇Lab10 小时前
开源项目第241期:YuE2 —— 用符号乐谱当“白盒“接口的开源音乐生成模型,SongBench 超越 Suno v5/v6
人工智能
鶴哥只手遮天11 小时前
Spring AI 2.0.1 深度解析-第 14 章 MCP 服务端(上):注解式实现与工具来源
java·人工智能·开源
鶴哥只手遮天11 小时前
Spring AI 2.0.1 深度解析-第 15 章 MCP 服务端(下):三种协议形态、Streamable 传输与状态管理
java·人工智能·开源
鶴哥只手遮天11 小时前
Spring AI 2.0.1 深度解析-第 16 章 向量存储(上):`VectorStore` 接口体系、`BatchingStrategy`
java·人工智能·开源
鶴哥只手遮天11 小时前
Spring AI 2.0.1 深度解析-第 12 章 工具循环的流式形态、Usage 累加与扩展体系
java·人工智能·开源