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

news2025/5/20 0:19:54

实验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颜色空间,我们可以得到经过直方图均衡化处理后的彩色图像。该处理方式可以帮助改善图像的视觉品质,特别是在亮度分布不均匀的图像中。在实际应用中,可以根据具体需求选择适合的颜色空间和通道进行直方图均衡化处理,以达到最佳的图像增强效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2379618.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图像定制大一统?字节提出DreamO,支持人物生成、 ID保持、虚拟试穿、风格迁移等多项任务,有效解决多泛化性冲突。

字节提出了一个统一的图像定制框架DreamO&#xff0c;支持人物生成、 ID保持、虚拟试穿、风格迁移等多项任务&#xff0c;不仅在广泛的图像定制场景中取得了高质量的结果&#xff0c;而且在适应多条件场景方面也表现出很强的灵活性。现在已经可以支持消费级 GPU&#xff08;16G…

Nginx 动静分离在 ZKmall 开源商城静态资源管理中的深度优化

在 B2C 电商高并发场景下&#xff0c;静态资源&#xff08;图片、CSS、JavaScript 等&#xff09;的高效管理直接影响页面加载速度与用户体验。ZKmall开源商城通过对 Nginx 动静分离技术的深度优化&#xff0c;将静态资源响应速度提升 65%&#xff0c;带宽成本降低 40%&#xf…

在vs code 中无法运行npm并报无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查

问题&#xff1a; npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查 原因&#xff1a; 可能是环境变量未正确继承或终端配置不一致 解决方法&#xff1a; 1.找到自己的node.js的版本号 2.重新下载node.js 下载 node.js - https://nodejs.p…

分布式2(限流算法、分布式一致性算法、Zookeeper )

目录 限流算法 固定窗口计数器&#xff08;Fixed Window Counter&#xff09; 滑动窗口计数器&#xff08;Sliding Window Counter&#xff09; 漏桶算法&#xff08;Leaky Bucket&#xff09; 令牌桶算法&#xff08;Token Bucket&#xff09; 令牌桶与漏桶的对比 分布式…

ARM A64 LDR指令

ARM A64 LDR指令 1 LDR (immediate)1.1 Post-index1.2 Pre-index1.3 Unsigned offset 2 LDR (literal)3 LDR (register)4 其他LDR指令变体4.1 LDRB (immediate)4.1.1 Post-index4.1.2 Pre-index4.1.3 Unsigned offset 4.2 LDRB (register)4.3 LDRH (immediate)4.3.1 Post-index…

实习记录小程序|基于SSM+Vue的实习记录小程序设计与实现(源码+数据库+文档)

实习记录小程序 目录 基于SSM的习记录小程序设计与实现 一、前言 二、系统设计 三、系统功能设计 1、小程序端&#xff1a; 2、后台 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码…

老旧设备升级利器:Modbus TCP转 Profinet让能效监控更智能

在工业自动化领域&#xff0c;ModbusTCP和Profinet是两种常见的通讯协议。Profinet是西门子公司推出的基于以太网的实时工业以太网标准&#xff0c;而Modbus则是由施耐德电气提出的全球首个真正开放的、应用于电子控制器上的现场总线协议。这两种协议各有各的优点&#xff0c;但…

【从基础到模型网络】深度学习-语义分割-ROI

在语义分割中&#xff0c;ROI&#xff08;Region of Interest&#xff0c;感兴趣区域&#xff09;是图像中需要重点关注的部分。其作用包括&#xff1a;提高效率&#xff0c;减少高分辨率图像的计算量&#xff1b;增强分割精度&#xff0c;聚焦关键语义信息&#xff1b;减少背景…

掌握Docker:从运行到挂载的全面指南

目录 1. Docker的运行2. 查看Docker的启动日志3. 停止容器4. 容器的启动5. 删除容器6. 查看容器的详细信息7.一条命令关闭所有容器拓展容器的复制&#xff08;修改数据不会同步&#xff09;容器的挂载&#xff08;修改数据可以同步&#xff09;挂载到现有容器 1. Docker的运行 …

Pandas pyecharts数据可视化基础③

pyecharts基础绘图案例解析 引言思维导图代码案例分析 提前安装依赖同样操作安装完重新启动Jupyter Notebook三维散点图&#xff08;代码5 - 40&#xff09; 代码结果代码解析 漏斗图&#xff08;代码5 - 41&#xff09;结果代码解析 词云图&#xff08;代码5 - 42&#xff09;…

数据库中关于查询选课问题的解法

前言 今天上午起来复习了老师上课讲的选课问题。我总结了三个解法以及一点注意事项。 选课问题介绍 简单来说就是查询某某同学没有选或者选了什么课。然后查询出该同学的姓名&#xff0c;学号&#xff0c;课程号&#xff0c;课程名之类的。 sql文件我上传了。大家可以尝试练…

基于Bootstrap 的网页html css 登录页制作成品

目录 前言 一、网页制作概述 二、登录页面 2.1 HTML内容 2.2 CSS样式 三、技术说明书 四、页面效果图 前言 ‌Bootstrap‌是一个用于快速开发Web应用程序和网站的前端框架&#xff0c;由Twitter的设计师Mark Otto和Jacob Thornton合作开发。 它基于HTML、CSS和JavaScri…

组件导航 (Navigation)+flutter项目搭建-混合开发+分栏

组件导航 (Navigation)flutter项目搭建 接上一章flutter项目的环境变量配置并运行flutter 上一章面熟了搭建flutter并用编辑器运行了ohos项目&#xff0c;这章主要是对项目的工程化改造 先创建flutter项目&#xff0c;再配置Navigation 1.在开发视图的resources/base/profi…

ProfibusDP主站转modbusTCP网关与ABB电机保护器数据交互

ProfibusDP主站转modbusTCP网关与ABB电机保护器数据交互 在工业自动化领域&#xff0c;Profibus DP&#xff08;Process Field Bus&#xff09;和Modbus TCP是两种常见的通讯协议&#xff0c;它们各自在不同的场合发挥着重要作用。然而&#xff0c;随着技术的发展和应用需求的…

ubuntu24.04上安装NVIDIA driver+CUDA+cuDNN+Anaconda+Pytorch

一、NVIDIA driver 使用Ubuntu系统的&#xff1a;软件和更新——>附加驱动&#xff0c;安装NVIDIA驱动。 二、CUDA 安装命令&#xff1a;sudo apt install nvidia-cuda-toolkit 三、cuDNN cuDNN 9.10.0 Downloads | NVIDIA Developer 四、Anaconda Download Anaconda Di…

3、函数和约束

# 提供的数据sql CREATE TABLE IF NOT EXISTS student(no BIGINT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 学号,name VARCHAR(20) NOT NULL COMMENT 姓名,sex VARCHAR(2) DEFAULT 男 COMMENT 性别, age INT(3) DEFAULT 0 COMMENT 年龄,score DOUBLE(5,2) COMMENT 成绩…

PhpStudy | PhpStudy 工具安装 —— Windows 系统安装 PhpStudy

&#x1f31f;想了解这个工具的其它相关笔记&#xff1f;看看这个&#xff1a;[网安工具] 服务器环境配置工具 —— PhpStudy 使用手册 笔者备注&#xff1a;Windows 中安装 PhpStudy 属于傻瓜式安装&#xff0c;本文只是为了体系完善而发。 在前面的章节中&#xff0c;笔者简…

基于vue框架的订单管理系统r3771(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;商家,用户,商品信息,订单信息,订单配送,评价记录 开题报告内容 基于Vue框架的订单管理系统开题报告 一、研究背景与意义 随着电子商务的快速发展和消费者购物习惯的改变&#xff0c;传统订单管理方式面临效率低、易出错、难以适应高并…

语音识别——语音转文字

SenseVoiceSmall阿里开源大模型&#xff0c;SenseVoice 是具有音频理解能力的音频基础模型&#xff0c;包括语音识别&#xff08;ASR&#xff09;、语种识别&#xff08;LID&#xff09;、语音情感识别&#xff08;SER&#xff09;和声学事件分类&#xff08;AEC&#xff09;或…

兰亭妙微:用系统化思维重构智能座舱 UI 体验

兰亭妙微设计专注于以产品逻辑驱动的界面体验优化&#xff0c;服务领域覆盖AI交互、智能穿戴、IoT设备、智慧出行等多个技术密集型产业。我们倡导以“系统性设计”为方法论&#xff0c;在用户需求与技术边界之间找到最优解。 此次智能驾驶项目&#xff0c;我们为某车载平台提供…