OpenCV-python灰度变化和直方图修正类型

发布于:2025-05-18 ⋅ 阅读:(15) ⋅ 点赞:(0)

实验1

实验内容

该段代码旨在读取名为"test.png"的图像,并将其转换为灰度图像。使用加权平均值法将原始图像的RGB值转换为灰度值。

代码注释

image = cv.imread("test.png")

h = np.shape(image)[0]
w = np.shape(image)[1]
gray_img = np.zeros((h, w, 3), np.uint8)
# 遍历我们test.png的每个像素
for i in range(h):
    for j in range(w):
        # image[i, j][0],image[i, j][1]和image[i, j][2] 分别是图形像素的R值 G值和B值
        # 通过加权平均值公式加权平均值法 D=0.299R+0.587G+0.114*B 可以得到RGB图形的灰色图像
        gray_img[i, j] = 0.3 * image[i, j][0] + 0.59 * image[i, j][1] + 0.11 * image[i, j][2]

cv.imshow("srcImage", image)
cv.imshow("grayImage", gray_img)
cv.waitKey(0)

功能说明

  1. 使用OpenCV库的cv.imread()函数读取图像文件"test.png"。
  2. 获取图像的高度和宽度,存储在变量hw中。
  3. 创建一个与原始图像大小相同的全零数组gray_img,用于存储转换后的灰度图像。
  4. 使用两个嵌套的循环遍历原始图像的每个像素。
  5. 对于每个像素,通过加权平均值公式将RGB值转换为灰度值,并将结果保存到对应位置的gray_img中。

效果展示

在这里插入图片描述

效果分析比较

该代码通过加权平均值法将RGB图像转换为灰度图像。该方法使用0.3、0.59和0.11的权重对原始图像的R、G和B通道进行加权平均,得到对应像素的灰度值。这种方法在计算灰度图像时经验上是有效的。

结论

通过该代码,成功将彩色图像"test.png"转换为灰度图像,并展示了原始图像和灰度图像。该方法适用于将彩色图像转换为灰度图像,以便在后续图像处理中更方便地分析和处理灰度信息。根据实验需求,可以使用不同的加权平均值权重来进行灰度转换,以获得更适合特定场景的灰度图像。

实验2

实验内容

该段代码旨在读取名为"test.png"的图像,并使用最大值法将彩色图像转换为灰度图像。

代码注释

image = cv.imread("test.png")

h = np.shape(image)[0]
w = np.shape(image)[1]
gray_img = np.zeros((h, w, 3), np.uint8)
# 遍历我们test.png的每个像素
for i in range(h):
    for j in range(w):
        # 最大值法,将彩色图像中的三个彩色分量 R,G,B 的最大值作为灰度图的灰度值
        # 具体表达式为gray(i,j) = max[R(i,j),G(i,j),B(i,j)]
        gray_img[i, j] = max(image[i,j][0], image[i,j][1], image[i,j][2])

cv.imshow("srcImage", image)
cv.imshow("grayImage", gray_img)
cv.waitKey(0)

功能说明

  1. 使用OpenCV库的cv.imread()函数读取图像文件"test.png"。
  2. 获取图像的高度和宽度,存储在变量hw中。
  3. 创建一个与原始图像大小相同的全零数组gray_img,用于存储转换后的灰度图像。
  4. 使用两个嵌套的循环遍历原始图像的每个像素。
  5. 对于每个像素,计算该像素的RGB通道的最大值,并将结果作为对应位置的灰度值存储在gray_img中。

效果展示

在这里插入图片描述

效果分析比较

该代码使用最大值法将彩色图像转换为灰度图像。将RGB通道的最大值作为灰度图像对应像素的灰度值。这种方法简单且直观,可以保留原始彩色图像中最明亮的部分作为灰度图像的亮度值。

结论

通过该代码,成功将彩色图像"test.png"转换为灰度图像,并展示了原始图像和灰度图像。最大值法是一种简单而直观的灰度化方法,能够较好地保留彩色图像中的亮度信息。根据实验需求,可以使用不同的灰度化方法进行转换,以获得适合特定场景的灰度图像。

实验3

实验内容

该段代码旨在读取名为"test.png"的图像,并使用平均值法将彩色图像转换为灰度图像。

代码注释

image = cv.imread("test.png")

h = np.shape(image)[0]
w = np.shape(image)[1]
gray_img = np.zeros((h, w, 3), np.uint8)
# 遍历我们test.png的每个像素
for i in range(h):
    for j in range(w):
        # 平均值法计算灰度值,用一个像素的RGB三值的平均值给灰度值进行赋值
        # 公式为gray(i,j) = (R(i,j)+G(i,j)+B(i,j))/3
        gray_img[i, j] = (image[i, j][0]+image[i, j][1]+image[i, j][2])/3

cv.imshow("srcImage", image)
cv.imshow("grayImage", gray_img)
cv.waitKey(0)

功能说明

  1. 使用OpenCV库的cv.imread()函数读取图像文件"test.png"。
  2. 获取图像的高度和宽度,存储在变量hw中。
  3. 创建一个与原始图像大小相同的全零数组gray_img,用于存储转换后的灰度图像。
  4. 使用两个嵌套的循环遍历原始图像的每个像素。
  5. 对于每个像素,将该像素的RGB通道值相加,并除以3,计算平均值,将结果赋值给对应位置的灰度图像像素。

效果展示

在这里插入图片描述

效果分析比较

该代码使用平均值法将彩色图像转换为灰度图像。对每个像素的RGB通道值取平均值,并将结果作为相应位置的灰度值存储在灰度图像中。这种方法简单地将RGB通道的平均值作为灰度图像的亮度值。

结论

通过该代码,成功将彩色图像"test.png"转换为灰度图像,并展示了原始图像和灰度图像。平均值法是一种简单且直观的灰度化方法,它将彩色图像的RGB通道的平均值作为灰度图像的亮度值。根据实验需求,可以使用不同的灰度化方法进行转换,以获得适合特定场景的灰度图像。

实验4

实验内容

该段代码旨在读取名为"test.png"的图像,并使用加权平均值法将彩色图像转换为灰度图像。

代码注释

import matplotlib.pyplot as plt
from PIL import Image


# 显示图片
def showimg(img, isgray=False):
    plt.axis("off")
    if isgray:
        plt.imshow(img, cmap='gray')
    else:
        plt.imshow(img)
    plt.show()

# 先读取图片
img = cv.imread("test.png")
# 生成我们的ndarray数组,这里RGB图片三维数组720x720x3
img = np.array(img, dtype=np.int32)
# 下面这三行代码将第一列x28.0 第二列x151.0 第三列x77.0
# 实质上还是我们的加权平均值算法,为了能减少浮点运算以及除法运算导致运行速度过慢
# 我们将对应的权值扩大至256倍,而后找到最近的整数来代替权值,这样就将浮点数运算转为整数运算,优化了转化速度
img[..., 0] = img[..., 0] * 28.0
img[..., 1] = img[..., 1] * 151.0
img[..., 2] = img[..., 2] * 77.0
# axis代表和并第二轴,设x,y表示像素坐标,z为RGB三个的值,则z为第0轴,x为第一轴,y为第二轴,所以是沿着y轴进行求和
img = np.sum(img, axis=2)
# 这个就是扩大256倍正好是2的8次方,我们最后转为灰度值的时候将数组所有值右移8位即可
arr = [np.right_shift(y.item(), 8) for x in img for y in x]
arr = np.array(arr)
arr.resize(img.shape)
showimg(Image.fromarray(arr), True)

功能说明

  1. 引入了matplotlib.pyplot模块和PIL.Image模块。
  2. 定义了一个用于显示图像的函数showimg()
  3. 使用OpenCV库的cv.imread()函数读取图像文件"test.png"。
  4. 将图像转换为一个ndarray数组,数据类型为int32。
  5. 将每个像素点的RGB通道值乘以相应的权重,然后将权重值扩大256倍,取最近的整数来代替权值。
  6. 使用np.sum()函数沿第二轴对数组进行求和,得到灰度图像的数组。
  7. 将数组的值右移8位,再将其转换为PIL Image对象,并使用showimg()函数显示灰度图像。

效果展示

在这里插入图片描述

效果分析比较

该代码使用加权平均值法将彩色图像转换为灰度图像。在转换过程中,使用特定的权重乘以RGB通道值,并将权重扩大256倍取整数代替,从而实现浮点数运算转为整数运算,优化了转化速度。

结论

通过该代码,成功将彩色图像"test.png"转换为灰度图像,并显示了灰度图像。使用加权平均值法进行灰度转换,并通过将RGB通道值乘以权重和扩大256倍加速运算的方式,优化了图像转换的速度。这种方法在保留灰度信息的同时,能够达到较快的转换速度。

实验5

实验内容

读取名为"test.png"的图像,并对其进行截断操作

实验注释

# 这个没让注释
img = cv.imread("test.png", 0)
out = 2.0 * img
# 进行数据截断, 大于255的值截断为255
out[out > 255] = 255
# 数据类型转换
out = np.around(out)
out = out.astype(np.uint8)
cv.imshow("img", img)
cv.imshow("out", out)
cv.waitKey()

功能说明

  1. 使用OpenCV库的cv.imread()函数读取图像文件"test.png",并将其转换为灰度图像。
  2. 使用乘法将图像数组img的所有像素值乘以2.0,得到结果数组out
  3. 对结果数组out进行数据截断,将大于255的值截断为255。
  4. 进行数据类型转换,将结果数组out的浮点数值四舍五入为最接近的整数,并将其数据类型转换为无符号8位整数。
  5. 使用cv.imshow()函数显示原始图像和处理后的图像,并使用cv.waitKey()等待按键。

效果展示

在这里插入图片描述

效果分析比较

根据结果,该段代码将对灰度图像进行缩放操作,将像素值乘以2.0,然后对大于255的值进行截断,最后将浮点数值转换为8位整数。这样可以增强图像的对比度和亮度。

结论

通过该代码,可以展示原始灰度图像和经过缩放处理后的图像。缩放操作可用于增强图像的亮度和对比度。

实验6

实验内容

该段代码旨在读取名为"test.png"的灰度图像,并进行分段性变换,将像素值映射到不同的灰度值区间。

代码注释

img = cv.imread("test.png", 0)
h, w = img.shape[:2]
out = np.zeros(img.shape, np.uint8)
for i in range(h):
    for j in range(w):
        # 遍历每个像素,得到对应的灰度值
        pix = img[i][j]
        # 进行分段性变换,这里的start为50 end为150 对应的映射区间 经过我的计算应该是[25,230]
        # 通过计算出k1 k2 k3 分别是0.5 3.6 0.238 c1 c2 c3分别是 0(固定) -310 194
        # 然后进行分类讨论进行分段性变换
        if pix < 50:
            out[i][j] = 0.5 * pix
        elif pix < 150:
            out[i][j] = 3.6 * pix - 310
        else:
            out[i][j] = 0.238 * pix + 194
# 数据类型转换
out = np.around(out)
out = out.astype(np.uint8)
cv.imshow("img", img)
cv.imshow("out", out)
cv.waitKey()

功能说明

  1. 使用OpenCV库的cv.imread()函数读取图像文件"test.png",并将其转换为灰度图像。
  2. 获取图像的高度和宽度,存储在变量hw中。
  3. 创建一个与原始图像大小相同的全零数组out,用于存储处理后的图像。
  4. 使用两个嵌套的循环遍历灰度图像的每个像素。
  5. 对于每个像素,根据其值进行分段性变换,将像素值映射到不同的灰度值区间。
  6. 根据不同的区间,使用不同的线性变换公式计算对应的灰度值,并将结果保存到对应位置的out中。
  7. 进行数据类型转换,将结果数组out的浮点数值四舍五入为最接近的整数,并将其数据类型转换为无符号8位整数。
  8. 使用cv.imshow()函数显示原始图像和处理后的图像,并使用cv.waitKey()等待按键。

效果展示

在这里插入图片描述

效果分析比较

该代码对灰度图像进行了分段性灰度变换,根据不同像素值的范围,将像素值映射到不同的灰度值区间。这种分段性变换可以用于增强图像的对比度和调整图像的灰度分布。

结论

通过该代码,成功展示了原始灰度图像和经过分段性变换处理后的图像。分段性变换可以根据像素值的范围将灰度图像的像素值映射到不同的灰度值区间,从而实现对图像灰度分布的调整和对比度的增强。根据实验需求,可以调整不同的阈值和线性变换公式,以获得更适合特定场景的图像变换效果。

实验7

实验内容

该段代码旨在对灰度图像进行对数变换,根据传入的参数进行灰度的调整,并保存结果图像。

代码注释

def logTransform(c, img):
    # 3通道RGB
    # 这个是RGB三个通道的时候,进行灰度的对数变化
    # 和灰度图不同的就是多一个shape属性
    '''h, w, d = img.shape[0], img.shape[1], img.shape[2]
    new_img = np.zeros((h, w, d))
    for i in range(h):
        for j in range(w):
            for k in range(d):
                new_img[i, j, k] = c * (math.log(1.0 + img[i, j, k]))'''

    # 灰度图专属
    # 这个就是传参就是当image为灰度图适用
    # 获得高宽参数方便遍历像素
    h, w = img.shape[0], img.shape[1]
    new_img = np.zeros((h, w))
    for i in range(h):
        for j in range(w):
            # 进行s = c * log(1+r)的对数变换运算
            new_img[i, j] = c * (math.log(1.0 + img[i, j]))
    new_img = cv.normalize(new_img, new_img, 0, 255, cv.NORM_MINMAX)
    return new_img


# 替换为你的图片路径
img = cv.imread('test.png', 0)
log_img = logTransform(1.0, img)
cv.imwrite('testRes.png', log_img)
cv.waitKey(0)

功能说明

  1. 定义了一个logTransform函数,用于对灰度图像进行对数变换。
  2. 传入参数c为调整因子,传入参数img为灰度图像。
  3. 获取图像的高度和宽度,存储在变量hw中。
  4. 创建一个与原始图像大小相同的全零数组new_img,用于存储进行对数变换后的图像。
  5. 使用两个嵌套的循环遍历灰度图像的每个像素。
  6. 对于每个像素,将其像素值进行对数变换运算,根据公式s = c * log(1+r)计算灰度值,并将结果保存到对应位置的new_img中。
  7. 使用cv.normalize()函数将对数变换后的图像灰度值规范化到0-255的范围。
  8. 返回对数变换后的图像new_img
  9. 读取名为’test.png’的灰度图像,并将其传入logTransform函数进行对数变换。
  10. 使用cv.imwrite()函数保存对数变换后的图像为’testRes.png’。
  11. 使用cv.waitKey()等待按键。

效果展示

在这里插入图片描述

效果分析比较

该代码对灰度图像进行了对数变换,实现了对灰度图像的亮度调整。对数变换可用于将亮度较低的区域扩展,增强对比度

结论

通过该代码,成功将灰度图像进行了对数变换,并保存了对数变换后的灰度图像。对数变换根据公式s = c * log(1+r)对图像的灰度值进行了调整,根据传入的参数c可以控制亮度调整的幅度。对数变换可以扩展亮度较低的区域并增强对比度,适用于增强特定场景下的图像细节。

实验8

实验内容

该段代码旨在读取名为"test.jpg"的图像,并对其进行灰度化处理和伽马变换。

代码注释

# 读入原始图像
img = cv.imread('test. jpg', 1)
# 灰度化处理
img1 = cv.imread('test. jpg', 0)
# 灰度化处理:此灰度化处理用于图像二值化
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 伽马变换
gamma = copy.deepcopy(gray)  # 先把我们的灰度图赋值一份
rows = img.shape[0]
cols = img.shape[1]
for i in range(rows):  # 遍历每行
    for j in range(cols):  # 遍历每列
        gamma[i][j] = 3 * pow(gamma[i][j], 0.8)  # 进行伽马图像校正 3*c^0.8
        # c为输入灰度,0.5对应r=1 c>0.5(r>1)进行灰度压缩 c<0.5(r<1)进行灰度拉伸
        # 通过窗口展示图片第一个参数为窗口名第二个为读取的图片变量
cv.imshow('img', img)
cv.imshow('gray', img1)
cv.imshow('gamma', gamma)
# 暂停cv2模块不然图片窗口一瞬间即就会消失观察不到
cv.waitKey(0)

功能说明

  1. 使用OpenCV库的cv.imread()函数读取图像文件"test.jpg",并将其存储在变量img中。
  2. 使用OpenCV的cv.cvtColor()函数将图像转换为灰度图像,结果存储在变量gray中。
  3. 使用copy.deepcopy()函数将灰度图像gray复制一份,存储在变量gamma中。
  4. 获取图像的行数和列数,分别存储在变量rowscols中。
  5. 使用两个嵌套的循环遍历灰度图像的每个像素。
  6. 对于每个像素,进行伽马图像校正,根据公式gamma[i][j] = 3 * pow(gamma[i][j], 0.8)对灰度值进行变换。
  7. 使用cv.imshow()函数显示原始图像、灰度图像和伽马变换后的图像。
  8. 使用cv.waitKey()等待按键。

效果展示

img是原图

在这里插入图片描述

效果分析比较

该代码实现了对图像的灰度化处理和伽马变换。灰度化处理将彩色图像转换为灰度图像,伽马变换可以调整图像的亮度。

结论

通过该代码,成功实现了对图像的灰度化处理和伽马变换,并展示了原始图像、灰度图像和伽马变换后的图像。灰度化处理将彩色图像转换为灰度图像,将每个像素的红、绿、蓝三个通道的值取平均得到灰度值。伽马变换通过对灰度值进行幂次变换调整图像亮度,本代码中使用了伽马值为0.8的变换,可以调整图像对比度和亮度。根据实验需求,可以调整伽马值和变换公式,以获得更适合特定场景的图像变换效果。

实验9

实验内容

该段代码旨在读取名为"test.png"的灰度图像,并使用plt.hist()函数绘制灰度直方图。

代码注释

img = cv. imread('test.png', 0)
# 运用hist函数绘制灰度直方图
plt. hist(img. ravel(), 256, [0, 256])
plt. show()

功能说明

  1. 使用OpenCV库的cv.imread()函数读取图像文件"test.png",并将其转换为灰度图像。
  2. 使用plt.hist()函数绘制灰度直方图。
    • 第一个参数img.ravel()将图像展平为一维数组,用于统计每个像素值的频数。
    • 第二个参数256表示直方图的bin数量,即将灰度值范围分成256个区间。
    • 第三个参数[0, 256]定义了灰度值的范围。
  3. 使用plt.show()函数显示灰度直方图。

效果展示

在这里插入图片描述

效果分析比较

该代码通过绘制灰度直方图,展示了图像中不同灰度值的像素数量分布情况。直方图可以提供图像的对比度、亮度以及灰度分布的信息。

结论

通过该代码,成功绘制了图像的灰度直方图,并使用plt.show()函数显示了直方图。灰度直方图以灰度值为横轴,像素数量为纵轴,反映了不同灰度值像素的频数分布。通过分析直方图,可以了解图像的对比度、亮度以及灰度分布情况。直方图分析可以指导图像处理任务,如直方图均衡化、灰度变换等。根据直方图的形状和分布,可以调整图像的灰度级别,以便更好地展示图像细节或满足特定需求。

实验10

实验内容

该段代码旨在读取名为"test.png"的彩色图像,并使用cv.calcHist()函数绘制彩色直方图。

代码注释

img = cv. imread('test.png', 1)
color = ('b', 'g', 'r')

for i, col in enumerate(color):
    # 调用calcHist进行直方图的绘制
    histr = cv. calcHist([img], [i], None, [256], [0,256])
    plt. plot(histr, color=col)
    plt. xlim([0, 256])  # 设置横坐标范围
plt. show()

功能说明

  1. 使用OpenCV库的cv.imread()函数读取图像文件"test.png",并将其存储在变量img中。
  2. 定义颜色通道元组color,包含了三个颜色通道标识符:蓝色('b')、绿色('g')、红色('r')。
  3. 使用enumerate()函数遍历颜色通道元组,并将颜色通道索引和对应的颜色标识符存储在变量icol中。
  4. 调用cv.calcHist()函数进行直方图计算。
    • 第一个参数[img]指定计算直方图的图像列表,这里只有一个彩色图像。
    • 第二个参数[i]表示计算颜色通道i的直方图。
    • 第三个参数None表示不使用掩码(mask)。
    • 第四个参数[256]表示直方图的bin数量,即将颜色值范围划分为256个区间。
    • 第五个参数[0, 256]定义了颜色值的范围。
  5. 使用plt.plot()函数绘制直方图。
    • 第一个参数histr是直方图的数据。
    • 第二个参数color=col指定曲线的颜色,根据颜色通道的索引选择对应的颜色。
  6. 使用plt.xlim()函数设置横坐标的范围为0到256。
  7. 使用plt.show()函数显示彩色直方图。

效果展示

在这里插入图片描述

效果分析比较

该代码通过调用cv.calcHist()函数和plt.plot()函数,实现了对彩色图像每个颜色通道的直方图绘制。彩色直方图可以展示不同颜色通道的像素数量分布情况,从而了解图像的颜色分布特征。

结论

通过该代码,成功绘制了彩色图像每个颜色通道的直方图,使用plt.show()函数显示了直方图。彩色直方图以颜色通道值为横轴,像素数量为纵轴,反映了不同颜色通道像素的频数分布。通过分析直方图,可以了解图像的颜色分布特征,如颜色的亮度、饱和度等。彩色直方图分析可帮助确定调整图像颜色的参数和方式,以满足特定需求,如调整图像的色彩平衡、色调等。

实验11

实验内容

该段代码旨在读取名为"test.png"的灰度图像,计算灰度直方图并绘制出来。

代码注释


def main():
    img = cv.imread('test.png', 0)
    # 得到计算灰度直方图的值
    xy = xygray(img)
    # 画出灰度直方图
    x_range = range(256)
    plt.plot(x_range, xy, "r", linewidth=2, c='black')
    # 设置坐标轴的范围
    y_maxValue = np.max(xy)
    plt.axis([0, 255, 0, y_maxValue])
    # 设置坐标轴的标签
    plt.xlabel('gray Level')
    plt.ylabel("number of pixels")
    plt.show()


def xygray(img):
    # 得到高和宽
    rows, cols = img.shape
    # 存储灰度直方图
    xy = np.zeros([256], np.uint64)
    # 遍历每个像素将存储的灰度直方图数值+1
    for r in range(rows):
        for c in range(cols):
            xy[img[r][c]] += 1
    # 返回一维ndarry
    return xy


main()

功能说明

  1. 定义了一个main()函数作为主函数入口。
  2. 使用OpenCV库的cv.imread()函数读取图像文件"test.png",并将其转换为灰度图像。
  3. 调用xygray()函数计算灰度直方图的数值。
  4. 定义x轴的范围x_range为0到255。
  5. 使用plt.plot()函数绘制灰度直方图,利用参数"r"设置折线的颜色为红色,线宽为2,颜色设置为黑色。
  6. 使用np.max()函数获取灰度直方图数值的最大值,用于设置y轴的范围。
  7. 使用plt.axis()函数设置坐标轴范围,x轴范围为0到255,y轴范围为0到最大值。
  8. 使用plt.xlabel()函数设置x轴的标签为"gray Level",使用plt.ylabel()函数设置y轴的标签为"number of pixels"。
  9. 使用plt.show()函数显示灰度直方图。
  10. 定义了一个xygray()函数,用于计算灰度直方图的数值。
  11. 获取图像的高度和宽度,存储在变量rowscols中。
  12. 创建一个一维数组xy来存储每个灰度级别的像素数量。
  13. 使用两个嵌套的循环遍历灰度图像的每个像素,并将对应灰度级别的像素数量加1。
  14. 返回一维数组xy作为灰度直方图的数值。

效果展示

在这里插入图片描述

效果分析比较

该代码通过计算灰度直方图和使用Matplotlib库的plt.plot()函数绘制出了图像的灰度直方图。灰度直方图可以提供图像中各个灰度级别的像素数量分布情况。

结论

通过该代码,成功计算并绘制了图像的灰度直方图。灰度直方图展示了图像中不同灰度级别的像素数量分布情况,可以用于分析图像的灰度分布。灰度直方图可用于了解图像的对比度、亮度以及常见的灰度分布特征,如双峰、单峰等。根据灰度直方图的形状和分布,可以进行图像处理的一些操作,如灰度级变换、图像增强、阈值分割等。

实验12

实验内容

该段代码旨在读取名为"test.png"的彩色图像,将其转换为灰度图像,并进行直方图均衡化处理,并展示原始灰度图像和处理后的图像。

代码注释

img = cv.imread("test.png", 1)
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
cv.imshow("src", gray)
# 对灰度图像进行直方图均衡化处理,通过扩展像素值的范围来提高图像的可视化效果
dst = cv.equalizeHist(gray)
cv.imshow("dst", dst)
cv.waitKey(0)

功能说明

  1. 使用OpenCV库的cv.imread()函数读取图像文件"test.png",并将其存储在变量img中。
  2. 使用OpenCV的cv.cvtColor()函数将彩色图像转换为灰度图像,结果存储在变量gray中。
  3. 使用cv.imshow()函数显示原始灰度图像,窗口名为"src"。
  4. 使用cv.equalizeHist()函数对灰度图像进行直方图均衡化处理,结果存储在变量dst中。
  5. 使用cv.imshow()函数显示处理后的图像,窗口名为"dst"。
  6. 使用cv.waitKey()等待按键。

效果展示

实验效果

在这里插入图片描述

效果分析比较

该代码通过图像灰度化和直方图均衡化处理,展示了原始灰度图像和处理后的图像。直方图均衡化可以调整图像的灰度分布,使得图像的对比度增强,细节更加明显,提高图像的可视化效果。

结论

通过该代码,成功展示了原始灰度图像和进行直方图均衡化处理后的图像。直方图均衡化可以通过扩展像素值的范围,使得图像中的灰度级别更加均匀分布,增强图像的对比度和细节。直方图均衡化对图像的可视化效果有明显的提升作用,可以改善图像的视觉品质。根据实验的具体需求,可以调整直方图均衡化的参数和方式,以得到最佳的图像增强效果。在实际应用中,直方图均衡化常用于图像预处理、计算机视觉和图像处理领域。

实验13

实验内容

该段代码旨在读取名为"test.png"的彩色图像,对其进行直方图均衡化处理,并展示原始图像和处理后的图像。

代码注释

img = cv.imread("test.png", 1)
cv.imshow("src", img)
# cv.split(img)函数将彩色图像img拆分为三个单独的通道(b g和r)
(b, g, r) = cv.split(img)
# 每个通道分别应用cv.equalizeHist函数进行直方图均衡化处理,将每个通道的像素值分布拉伸到整个像素值范围内,提高图像各通道的对比度
bH = cv.equalizeHist(b)
gH = cv.equalizeHist(g)
rH = cv.equalizeHist(r)
result = cv.merge((bH, gH, rH))
cv.imshow("dst", result)
cv.waitKey(0)

功能说明

  1. 使用OpenCV库的cv.imread()函数读取图像文件"test.png",并将其存储在变量img中。
  2. 使用cv.imshow()函数显示原始图像,窗口名为"src"。
  3. 使用cv.split()函数将彩色图像拆分为三个单独的通道(B、G和R)。
  4. 分别对每个通道应用cv.equalizeHist()函数进行直方图均衡化处理,将每个通道的像素值分布拉伸到整个像素值范围内,提高图像各通道的对比度。
  5. 使用cv.merge()函数将处理后的通道合并为一幅彩色图像,结果存储在变量result中。
  6. 使用cv.imshow()函数显示处理后的图像,窗口名为"dst"。
  7. 使用cv.waitKey()等待按键。

效果展示

在这里插入图片描述

效果分析比较

该代码通过对彩色图像的每个通道进行直方图均衡化处理,展示了原始图像和处理后的图像。直方图均衡化可以调整每个通道的像素值分布,提高图像的对比度和细节。

结论

通过该代码,成功展示了原始图像和进行直方图均衡化处理后的图像。对彩色图像的每个通道进行直方图均衡化处理,可以调整图像中各个通道的像素值分布,提高图像的对比度和细节。直方图均衡化可以改善彩色图像的视觉品质,使得图像的各个通道更加饱满、清晰。在实际应用中,直方图均衡化常用于图像增强、计算机视觉和图像处理领域,可以帮助改善图像的视觉效果和增加图像的可视化细节。

实验14

实验内容

该段代码旨在读取名为"test.png"的彩色图像,将其转换为YCrCb颜色空间,对Y通道进行直方图均衡化处理,并将图像转换回BGR颜色空间,最后展示原始图像和处理后的图像。

代码注释

img = cv.imread("test.png", 1)
imgYUV = cv.cvtColor(img,
                     cv.COLOR_BGR2YCrCb)
cv.imshow("src", img)

# 拆分图像通道为YUV通道
channelsYUV = cv.split(imgYUV)

# 因为元组不支持修改元素的赋值操作,所以我需要先将其转为列表
channelsYUV = list(channelsYUV)  # 自己添加的代码

# 对Y通道进行直方图均衡化处理
channelsYUV[0] = cv.equalizeHist(channelsYUV[0])

# 复制操作完成后,再转为我们的元组
channelsYUV = tuple(channelsYUV)  # 自己添加的代码
# 合并通道为图像
channels = cv.merge(channelsYUV)
# 将图像从YCrCb颜色空间转换回BGR颜色空间
result = cv.cvtColor(channels,
                     cv.COLOR_YCrCb2BGR)
cv.imshow("dst", result)
cv.waitKey(0)

功能说明

  1. 使用OpenCV库的cv.imread()函数读取图像文件"test.png",并将其存储在变量img中。
  2. 使用cv.cvtColor()函数将彩色图像转换为YCrCb颜色空间,结果存储在变量imgYUV中。
  3. 使用cv.imshow()函数显示原始图像,窗口名为"src"。
  4. 使用cv.split()函数拆分图像通道为YUV通道,结果存储在变量channelsYUV中。
  5. channelsYUV转换为列表形式,以便修改Y通道的直方图均衡化处理。
  6. 使用cv.equalizeHist()函数对Y通道进行直方图均衡化处理,结果存储在列表中的第一个元素channelsYUV[0]中。
  7. channelsYUV转换回元组形式。
  8. 使用cv.merge()函数合并处理后的YUV通道为图像,结果存储在变量channels中。
  9. 使用cv.cvtColor()函数将图像从YCrCb颜色空间转换回BGR颜色空间,结果存储在变量result中。
  10. 使用cv.imshow()函数显示处理后的图像,窗口名为"dst"。
  11. 使用cv.waitKey()等待按键。

效果展示

在这里插入图片描述

效果分析比较

该代码通过将彩色图像转换为YCrCb颜色空间,对Y通道进行直方图均衡化处理,并将图像转换回BGR颜色空间,展示了原始图像和处理后的图像。YCrCb颜色空间中的Y通道表示图像的亮度,直方图均衡化处理只作用于亮度信息,可以提高图像的对比度和细节。

结论

通过该代码,成功展示了原始图像和进行Y通道直方图均衡化处理后的图像。在YCrCb颜色空间中,Y通道代表了图像的亮度信息,直方图均衡化处理只应用于Y通道,可以增强图像的对比度并提高细节的可视化效果,同时保持了图像的颜色信息。通过将图像转换回BGR颜色空间,我们可以得到经过直方图均衡化处理后的彩色图像。该处理方式可以帮助改善图像的视觉品质,特别是在亮度分布不均匀的图像中。在实际应用中,可以根据具体需求选择适合的颜色空间和通道进行直方图均衡化处理,以达到最佳的图像增强效果。