0 实验题目
将man.jpg的外套颜色替换成你所希望的颜色。
1 实验过程
解决思路是:确定外套的颜色取值范围->遍历图像数组,替换掉外套的颜色
代码中,在指定外套的颜色时,我采用了两种思路,一个是指定赋值,另一个思路是赋值G通道的值。
详细代码如下:
import cv2import 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 1image_mask[row, col, 0] = 0image_mask[row, col, 1] = 255image_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 | ![]() |
可以看出,在本实验中,给人物衣服换色的任务中,采用第二种思路,赋予某一个通道的颜色值效果比较好,而赋予固定取值效果比较差,导致人物头发颜色也变了。
那么为什么会出现这样的情况呢?
分析如下:
由于我是使用的手动取值确定外套颜色的取值范围,这个范围非常的不准确,其中即包括了外套,还包括了头发部分。因此,在实验过程中,人物头发部分的颜色也会被更改。但是如果采用通道赋值的思路,就可以使得头发颜色不会被改变。因为头发的颜色大致为黑色,三通道的取值差不多相等,赋值另一个通道的值并不会引起多大改变。



