0 实验题目
将man.jpg的外套颜色替换成你所希望的颜色。
1 实验过程
解决思路是:确定外套的颜色取值范围->遍历图像数组,替换掉外套的颜色
代码中,在指定外套的颜色时,我采用了两种思路,一个是指定赋值,另一个思路是赋值G通道的值。
详细代码如下:
import cv2
import numpy as np
# 1.载入图像
img = cv2.imread('man.jpg')
cv2.imshow('original image', img)
rows,cols,chanel = img.shape
# 2.设置颜色阈值
blue = np.array([118,85,45])
blue2 = np.array([43,24,7])
# 3.替换颜色
mask_blue=cv2.inRange(img,blue2,blue)
image_mask=img.copy()
for row in range(rows): #遍历每一行
for col in range(cols): #遍历每一列
if mask_blue[row,col] == 255:
# result 1
image_mask[row, col, 0] = 0
image_mask[row, col, 1] = 255
image_mask[row, col, 2] = 0
# result 2
#image_mask[row, col, 0] = image_mask[row, col, 1]
#image_mask[row, col, 1] = image_mask[row, col, 1]
#image_mask[row, col, 2] = image_mask[row, col, 1]
else:
image_mask[row, col, 0] = image_mask[row, col, 0]
image_mask[row, col, 1] = image_mask[row, col, 1]
image_mask[row, col, 2] = image_mask[row, col, 2]
cv2.imshow('img_2',image_mask)
cv2.waitKey(0)
其中,外套颜色的取值范围是我使用取色器来得到的,十分不精确,是影响实验结果的重要因素。但是由于没有找到更好的确定范围的方法,就只能手动取值确定了。
2 实验结果
原始图片 | ![]() |
---|---|
result 1 | ![]() |
result 2 | ![]() |
可以看出,在本实验中,给人物衣服换色的任务中,采用第二种思路,赋予某一个通道的颜色值效果比较好,而赋予固定取值效果比较差,导致人物头发颜色也变了。
那么为什么会出现这样的情况呢?
分析如下:
由于我是使用的手动取值确定外套颜色的取值范围,这个范围非常的不准确,其中即包括了外套,还包括了头发部分。因此,在实验过程中,人物头发部分的颜色也会被更改。但是如果采用通道赋值的思路,就可以使得头发颜色不会被改变。因为头发的颜色大致为黑色,三通道的取值差不多相等,赋值另一个通道的值并不会引起多大改变。