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

发布于:2025-08-01 ⋅ 阅读:(18) ⋅ 点赞:(0)

目录

1 灰度图

2 最大值法

3 平均值法

4 加权均值法

5 两个极端的灰度值


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

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

1 灰度图

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

2 最大值法

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

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

案例:

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。

案例:

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。

案例:

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(纯白)


网站公告

今日签到

点亮在社区的每一天
去签到