目录
一、图像的基础知识
二、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/https://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 cvimg = 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()
运行结果: