Opencv(七) : 图像颜色替换
文章目录
- 思维导图
- 前言
- 一、实验原理概述
- 二、HSV颜色空间转换
- 1. HSV和RGB的区别
- 2. HSV模型的特征
- 三、形态学操作:开运算
- 四、制作掩膜(Mask)
- 五、颜色替换原理
- 六、实验步骤与实现流程
- 1. 图像加载与预处理
- 2. 设定颜色范围并生成掩膜
- 3. 进行形态学开运算去除噪点
- 4. 颜色替换实现
- 七、结果分析与实验现象
- 八、小结
思维导图

前言
在计算机视觉领域中,对图片颜色进行识别和替换是一项基础但非常实用的操作。通过颜色识别,我们可以分离出图像中的特定区域,并将其替换为其他颜色,从而实现图像增强、风格调整或特定目标突出显示等效果。本文将详细介绍图像颜色替换的基本原理与实现步骤。
一、实验原理概述
在前期实验中,我们已经实现了对图像中特定颜色的识别。本实验的目标是在识别的基础上,将指定颜色替换为其他颜色。其核心思路是:
- 通过颜色空间转换(RGB → HSV),更方便地提取特定颜色;
- 根据设定的阈值范围生成掩膜;
- 对掩膜进行形态学处理(如开运算)去除噪点;
- 使用掩膜在原图中定位目标区域;
- 修改对应区域的像素值,实现颜色替换。
整个过程既包含图像的逻辑操作,又涉及对图像矩阵的直接修改。
二、HSV颜色空间转换
1. HSV和RGB的区别
RGB模型虽然常见,但在颜色分割和图像识别中并不直观,因为三个通道的值同时变化时,颜色感知往往难以控制。而HSV模型(Hue-色调、Saturation-饱和度、Value-亮度)更符合人类对颜色的感知方式:
- 色调(H):决定颜色种类,范围为0°~360°;
- 饱和度(S):表示颜色的纯度,范围为0~255;
- 亮度(V):表示颜色的明暗程度,范围为0~255。
在HSV空间中,只需调整H与S即可轻松完成颜色筛选与替换操作。
2. HSV模型的特征
HSV可以理解为一个六角锥体模型:
- 红色起点为0°,绿色120°,蓝色240°;
- 其补色依次为黄色60°、青色180°、紫色300°。
这种模型更直观,方便针对单一颜色区域进行提取与替换。
三、形态学操作:开运算
在得到颜色掩膜后,图像中通常会出现一些噪点或不连续的小区域。为了优化掩膜结果,需要进行 开运算(Opening Operation):
- 定义:先腐蚀后膨胀;
- 作用:去除小噪点,平滑边缘,分离相连目标;
- 常用核大小:3×3、5×5、7×7。
开运算的核心参数是卷积核(kernel)的大小,不同尺寸的核会影响处理结果。核越大,去噪效果越明显,但可能会损失细节。
四、制作掩膜(Mask)
掩膜是图像处理中非常重要的工具。其本质是一张二值图像(仅包含黑白两色):
- 白色区域(像素值255)代表我们希望处理的目标;
- 黑色区域(像素值0)代表背景部分。
在颜色替换实验中,掩膜的生成依赖于HSV颜色范围的设定。例如,当我们想替换红色区域时,可以通过 cv2.inRange() 函数设置红色的HSV上下限值,并生成对应的二值掩膜。
掩膜制作完成后,就可以通过它选择性地修改图像中的目标区域。
五、颜色替换原理
有了掩膜和原图之后,颜色替换的操作就非常直接了:
- 获取掩膜中白色区域的像素坐标;
- 在原图中找到对应位置;
- 将这些像素的BGR或HSV值修改为目标颜色。
例如,想把红色区域换成蓝色,只需遍历掩膜白色区域的像素并将对应的原图像素修改为蓝色值即可。
六、实验步骤与实现流程
以下为标准的颜色替换实验步骤,便于在实际代码中实现。
1. 图像加载与预处理
import cv2
import numpy as npimage = cv2.imread("demo.png")
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
2. 设定颜色范围并生成掩膜
lower_red = np.array([0, 43, 46])
upper_red = np.array([10, 255, 255])
mask = cv2.inRange(hsv, lower_red, upper_red)
3. 进行形态学开运算去除噪点
kernel = np.ones((5, 5), np.uint8)
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
4. 颜色替换实现
# 定义替换后的颜色(例如蓝色)
replace_color = [255, 0, 0] # BGR格式# 将掩膜中的白色区域对应到原图中
result = image.copy()
result[mask > 0] = replace_colorcv2.imshow("result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
代码整合
# ===============================
# OpenCV 图片颜色替换实验
# 功能:识别图像中指定颜色并替换为其他颜色
# ===============================# 导入opencv和numpy库
import cv2
import numpy as np# 1. 图片输入:将图片读取进来
image_np = cv2.imread('./color.png') # 从指定路径读取图片,返回一个NumPy数组(BGR格式)
image_np = cv2.resize(image_np, (400, 400)) # 调整图片尺寸为400x400,方便显示与处理
cv2.imshow("image_np", image_np) # 显示原始图像# 2. 将图片转换为HSV模型下的图片
image_hsv = cv2.cvtColor(image_np, cv2.COLOR_BGR2HSV) # 将BGR格式转换为HSV格式,更适合颜色提取# 3. 制作掩膜(Mask),提取红色区域
color_lower = np.array([0, 43, 46]) # 红色的HSV下界(H,S,V)
color_high = np.array([10, 255, 255]) # 红色的HSV上界
image_mask = cv2.inRange(image_hsv, color_lower, color_high) # 生成二值掩膜:白色代表目标区域# 4. 开运算:去除噪点,平滑边缘
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) # 定义3x3矩形结构元素
image_mask_open = cv2.morphologyEx(image_mask, cv2.MORPH_OPEN, kernel) # 先腐蚀后膨胀,去除小噪点# 5. 图片颜色替换
# 传统写法(效率低):逐像素判断
# for i in range(image_mask_open.shape[0]):
# for j in range(image_mask_open.shape[1]):
# if image_mask_open[i,j] == 255:
# image_np[i,j] = (255,0,0) # 将红色区域替换为蓝色# 矢量化写法(推荐):利用NumPy布尔索引一次性完成
image_np[image_mask_open == 255] = (255, 0, 0) # 将掩膜中白色区域对应的原图像素改为蓝色# 6. 显示结果
cv2.imshow("image_mask_open", image_mask_open) # 显示处理后的掩膜
cv2.imshow("image_np1", image_np) # 显示颜色替换后的图像
cv2.waitKey(0) # 等待键盘输入后关闭窗口,防止闪退
输出结果为:



七、结果分析与实验现象
通过调整HSV范围、开运算核大小以及目标颜色值,可以得到不同的颜色替换效果:
- 当饱和度较低时,替换区域可能不明显;
- 调整明度(V值)可改变替换后的亮度效果;
- 不同的kernel尺寸会影响边缘的平滑度。
最终可以实现:将图像中某种颜色完全替换为指定颜色,同时保持其他部分不受影响。
八、小结
本实验通过对HSV颜色空间的理解与应用,结合形态学操作与掩膜机制,完成了对图像中指定颜色的精确替换。整个流程清晰且易于扩展,可应用于:
- 图像风格化处理;
- 颜色检测与标注;
- 工业检测中颜色标识替换;
- 视觉导航中目标识别与跟踪。
