← 返回首页
图像颜色替换
发表时间:2025-02-16 09:46:09
图像颜色替换

在OpenCV中,你可以使用不同的方法来替换图像中的颜色。最常见的方法之一是使用掩码(膜)(mask)来选择特定的颜色范围,然后将这个范围内的像素替换为新的颜色。

1.颜色替换步骤

在OpenCV中,你可以使用不同的方法来替换图像中的颜色。最常见的方法之一是使用掩码(mask)来选择特定的颜色范围,然后将这个范围内的像素替换为新的颜色。下面是如何实现颜色替换的基本步骤:

  1. 读取图像:首先,读取你想要处理的图像。
  2. 创建掩码:使用 cv2.inRange 函数根据颜色的HSV值范围创建一个掩码。
  3. 应用掩码:使用掩码选择图像中的特定颜色区域。
  4. 替换颜色:将选中的颜色区域替换为新的颜色。

代码实现:

import cv2
import numpy as np

# 读取图像
image = cv2.imread('./images/jpg/color_block.jpg')

# 转换为HSV颜色空间
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

# 定义你想要替换的颜色范围(例如,红色)
# 例如,对于红色,可以设置HSV范围为:low_red = [0, 100, 100], high_red = [10, 255, 255]
low_red = np.array([0, 100, 100])
high_red = np.array([10, 255, 255])

# 创建掩码
mask = cv2.inRange(hsv, low_red, high_red)

# 使用掩码反转图像,以便只替换选定颜色
mask_inv = cv2.bitwise_not(mask)

# 创建一个与原图同样大小的黑色图像
new_color = np.zeros_like(image)

# 将你想要替换成的颜色设置到new_color中,例如蓝色
new_color[:, :, :] = [255, 0, 0]  # BGR格式的红色

# 将new_color应用到原图上,仅在掩码区域生效
res = cv2.bitwise_and(image, image, mask=mask_inv)
new_color_on_mask = cv2.bitwise_and(new_color, new_color, mask=mask)

# 将两部分合并,得到最终结果
final_image = cv2.add(res, new_color_on_mask)

# 显示结果
cv2.imshow('Original Color Image', image)
cv2.imshow('Replaced Color Image', final_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行效果:

2.综合案例

OpenCV实现更换证件照背景色的例子。

import cv2
import numpy as np

# 读取图片
img = cv2.imread('./images/png/personal03.png')
resize_img_bak = cv2.resize(img, None, fx=0.6, fy=0.6)

resize_img = cv2.resize(img, None, fx=0.6, fy=0.6)
rows, cols, channels = resize_img.shape
# 转换为hsv模型
hsv = cv2.cvtColor(resize_img, cv2.COLOR_BGR2HSV)
# 二值化处理,蓝色背景
lower_blue = np.array([90, 70, 70])
upper_blue = np.array([110, 255, 255])
mask = cv2.inRange(hsv, lower_blue, upper_blue)
# 腐蚀操作
erode = cv2.erode(mask, None, iterations=1)
# 中值滤波
erode = cv2.medianBlur(erode, 9)

if __name__ == '__main__':
    # 遍历像素点
    for i in range(rows):
        for j in range(cols):
            if erode[i, j] == 255:
                #要更换的背景颜色
                resize_img[i, j] = (0, 0, 200)

    cv2.imshow("Result", resize_img)
    cv2.imshow("Original", resize_img_bak)
    # 保存处理结果
    cv2.imwrite("Result.jpg", resize_img)
    cv2.waitKey(0)