目录

一、图像的基础知识

二、NumPy模块

三、图像色彩变化

3.1 RGB图像的分通道显示

3.2 HSV图像的分通道显示


一、图像的基础知识

总结的笔记:

"""
二值图:   每个像素取值 0或1,图像显示出来只有黑白色;     黑色:0      白色:1
灰度图:   每个像素8位表示(0~255)单通道显示亮度;     黑色:0     白色:255
彩色图:   每个像素有RGB三个通道分量表示,每个分量0~255,每个通道单拿出来都是一张灰度图;
   黑色(0,0,0)     白色(255,255,255)
RGB:        R:红色              G:绿色                  B:蓝色
Image(BGR),Merge(RGB):  三个图层的顺序不同,由上到下
HSV:        H:色相              S:饱和度                V:明度

OpenCV的 HSV格式中, H(色彩/色度)的取值范围是 [0,180], 
S(饱和度)的取值范围 [0,255], V(亮度)取值范围 [0,255]


图像色彩空间转换:
    cv2.cvtColor(img,code)
        img:        要更改其色彩空间的图像
        code:       色彩空间转换的代码
            cv2.COLOR_BGR2GRAY:         表示从 BGR转换为灰度图像
            cv2.COLOR_BGR2HSV:          表示从 BGR转换为 HSV图像


图层(通道)分离:
    cv2.split(img)
        img:        要分离的图像


图层(通道)合并:
    cv2.merge((a,b,c))
        a,b,c:      要合并的色彩通道


"""

二、NumPy模块

NumPy(Numerical Python)是Python科学计算的核心库之一,提供了高性能的多维数组对象(ndarray)和用于数组操作的函数。它还包括用于处理线性代数、傅里叶变换和随机数生成的工具。

下面是一些常用的 numpy 模块函数的表格:

函数 描述
numpy.array() 创建一个数组
numpy.zeros() 创建一个指定形状和数据类型的全零数组
numpy.ones() 创建一个指定形状和数据类型的全1数组
numpy.arange() 创建一个指定范围和步长的数组
numpy.linspace() 创建一个指定范围内等间距的数组
numpy.reshape() 改变数组的形状
numpy.ndim() 返回数组的维度
numpy.size() 返回数组中的元素数目
numpy.dtype() 返回数组的数据类型
numpy.min() 返回数组的最小值
numpy.max() 返回数组的最大值
numpy.mean() 返回数组的平均值
numpy.sum() 返回数组的和
numpy.var() 返回数组的方差
numpy.std() 返回数组的标准差
numpy.dot() 计算两个数组的点积
numpy.transpose() 反转数组的维度
numpy.vstack() 垂直堆叠数组
numpy.hstack() 水平堆叠数组
numpy.concatenate() 按指定的维度连接数组
numpy.split() 将数组分割为多个子数组
numpy.insert() 将元素插入到数组的指定位置
numpy.delete() 删除数组中的指定元素
numpy.copy() 复制数组
numpy.sort() 对数组进行排序
numpy.unique() 返回数组中的唯一值
numpy.where() 返回满足条件的数组元素的坐标
numpy.isnan() 检查数组元素是否为 NaN
numpy.isinf() 检查数组元素是否为无穷大

这只是一小部分 numpy 模块函数的示例,numpy 模块提供了许多其他功能强大的函数。你可以在 numpy 官方文档中找到更多信息:https://numpy.org/doc/icon-default.png?t=N7T8https://numpy.org/doc/

三、图像色彩变化

图像颜色通道是指图像中的每个像素所包含的颜色信息。

在彩色图像中,通常有三个颜色通道,分别是红色通道(R通道)、绿色通道(G通道)和蓝色通道(B通道)。每个通道都包含着图像中相应颜色的亮度信息,通过对这些通道的组合和调整,可以得到不同的颜色效果和色彩变化。

除了RGB颜色模式外,还有其他的颜色模式,如CMYK模式(青、品红、黄、黑)等,这些颜色模式也有对应的通道。在灰度图像中,只有一个颜色通道,代表灰度级别。

示例:(简易代码)

import cv2

# 加载图像
image = cv2.imread("image.jpg") # 在运行代码时将image.jpg替换为您的图像文件路径


# 分割图像的RGB通道
blue, green, red = cv2.split(image)

# 修改蓝色通道为0
blue = blue * 0

# 修改绿色通道为255
green = green * 0 + 255

# 修改红色通道为0
red = red * 0

# 合并修改后的通道
modified_image = cv2.merge((blue, green, red))

# 显示修改后的图像
cv2.imshow("Modified Image", modified_image)
cv2.waitKey(0)               # 等待用户按下任意键
cv2.destroyAllWindows()
 

复杂代码(需理解):

import cv2
import numpy as np

# 读取图像
image = cv2.imread('image.png')    # 在运行代码时将image.png替换为您的图像文件路径

# 提取RGB颜色通道
red_channel = image[:,:,2]
green_channel = image[:,:,1]
blue_channel = image[:,:,0]

# 将RGB颜色通道转换为不同颜色值
red_channel = np.zeros(red_channel.shape, dtype=np.uint8)  # 设置红色通道为0
green_channel = np.zeros(green_channel.shape, dtype=np.uint8)  # 设置绿色通道为0
blue_channel = np.ones(blue_channel.shape, dtype=np.uint8) * 255  # 设置蓝色通道为255

# 将修改后的颜色通道重新组合成图像
new_image = cv2.merge((blue_channel, green_channel, red_channel))

# 显示原始图像和修改后的图像
cv2.imshow('Original Image', image)        # 名称可修改
cv2.imshow('Modified Image', new_image)    # 名称可修改

# 保存修改后的图像
cv2.imwrite('output.jpg', new_image)

# 等待按下任意键关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
 

3.1 RGB图像的分通道显示

在OpenCV中,图像通道表示图像中的颜色信息。通常,一个彩色图像会有三个通道,分别是红色通道、绿色通道和蓝色通道。每个通道都表示了图像中对应颜色的亮度或强度。

在OpenCV中,可以使用函数cv2.split()来将彩色图像分离为各个通道。这个函数将返回一个包含各个通道的列表。

以下是一个使用OpenCV分离RGB图像通道的例子:

import cv2

# 读取彩色图像
image = cv2.imread('image.jpg')

# 分离通道
b, g, r = cv2.split(image)

# 显示分离的通道
cv2.imshow('Blue', b)
cv2.imshow('Green', g)
cv2.imshow('Red', r)

# 等待按下任意按键继续程序
cv2.waitKey(0)
cv2.destroyAllWindows()

在上面的例子中,cv2.split()函数将彩色图像分离为红色通道(r 通道)、绿色通道(g 通道)和蓝色通道(b 通道)。我们通过cv2.imshow()函数将每个通道显示出来。

注意:

在将通道分离后,每个通道的数据类型是uint8,并且只包含该通道的像素值。

3.2 HSV图像的分通道显示

cv2.cvtColor()函数是OpenCV库中用于图像颜色空间转换的函数。该函数的返回值是转换后的图像。它的原型为:

cv2.cvtColor(src, code[, dst[, dstCn]]) -> dst

参数解释:

  • src:输入图像,可以是NumPy数组或图片文件的路径。
  • code:颜色空间转换的代码,可以是下面这些之一:
    • cv2.COLOR_BGR2GRAY:BGR彩色图像转灰度图。
    • cv2.COLOR_BGR2HSV:BGR彩色图像转HSV颜色空间。
    • cv2.COLOR_BGR2RGB:BGR彩色图像转RGB颜色空间。
    • cv2.COLOR_BGR2LAB:BGR彩色图像转Lab颜色空间。
    • cv2.COLOR_BGR2YCrCb:BGR彩色图像转YCrCb颜色空间。
  • dst可选参数,输出的图像数组。如果不提供该参数,函数会自动创建一个与输入图像相同类型和大小的数组。
  • dstCn可选参数,输出图像的通道数。如果该参数为0,则输出图像和输入图像通道数相同。否则,输出图像将被重新处理为指定的通道数。

以下是一个使用OpenCVBGR转换为 HSV图像再进行分离图像通道的例子:

import cv2 as cv

img = cv.imread("D:/Open_CV/OpenCV_demo/Pictures/r4.png",1)     
# 或 img = cv.imread("Pictures/r4.png",cv.IMREAD_COLOR)

img = cv.resize(img,(320,320),interpolation=cv.INTER_AREA)       # 图像缩放 (长,宽)

R,G,B = cv.split(img)
MergeRGB = cv.merge((R,G,B))                # 三个图层的顺序不同,由上到下
MergeBGR = cv.merge((B,G,R))

hsv_img = cv.cvtColor(img,cv.COLOR_BGR2HSV)                 # 表示从 BGR转换为 HSV图像
H,S,V = cv.split(hsv_img)                   # 图层(通道)分离成 H,S,V
MergeHSV = cv.merge((H,S,V))                # 将 H,S,V 合并

cv.imshow('R4',img)
cv.imshow("B",B)
cv.imshow("G",G)
cv.imshow("R",R)
cv.imshow("MergeRGB",MergeRGB)
cv.imshow("MergeBGR",MergeBGR)

cv.imshow("H",H)
cv.imshow("S",S)
cv.imshow("V",V)
cv.imshow("MergeHSV",MergeHSV)

xin = cv.waitKey(0)                 # 按 ESC键关闭所有窗口
if xin == 27:               
    cv.destroyAllWindows()

运行结果:

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐