0 实验题目

将man.jpg的外套颜色替换成你所希望的颜色。
man(2).jpg

1 实验过程

解决思路是:确定外套的颜色取值范围->遍历图像数组,替换掉外套的颜色

代码中,在指定外套的颜色时,我采用了两种思路,一个是指定赋值,另一个思路是赋值G通道的值。

详细代码如下:

  1. import cv2
  2. import numpy as np
  3. # 1.载入图像
  4. img = cv2.imread('man.jpg')
  5. cv2.imshow('original image', img)
  6. rows,cols,chanel = img.shape
  7. # 2.设置颜色阈值
  8. blue = np.array([118,85,45])
  9. blue2 = np.array([43,24,7])
  10. # 3.替换颜色
  11. mask_blue=cv2.inRange(img,blue2,blue)
  12. image_mask=img.copy()
  13. for row in range(rows): #遍历每一行
  14. for col in range(cols): #遍历每一列
  15. if mask_blue[row,col] == 255:
  16. # result 1
  17. image_mask[row, col, 0] = 0
  18. image_mask[row, col, 1] = 255
  19. image_mask[row, col, 2] = 0
  20. # result 2
  21. #image_mask[row, col, 0] = image_mask[row, col, 1]
  22. #image_mask[row, col, 1] = image_mask[row, col, 1]
  23. #image_mask[row, col, 2] = image_mask[row, col, 1]
  24. else:
  25. image_mask[row, col, 0] = image_mask[row, col, 0]
  26. image_mask[row, col, 1] = image_mask[row, col, 1]
  27. image_mask[row, col, 2] = image_mask[row, col, 2]
  28. cv2.imshow('img_2',image_mask)
  29. cv2.waitKey(0)

其中,外套颜色的取值范围是我使用取色器来得到的,十分不精确,是影响实验结果的重要因素。但是由于没有找到更好的确定范围的方法,就只能手动取值确定了。

2 实验结果

原始图片 image.png
result 1 image.png
result 2 image.png

可以看出,在本实验中,给人物衣服换色的任务中,采用第二种思路,赋予某一个通道的颜色值效果比较好,而赋予固定取值效果比较差,导致人物头发颜色也变了。
那么为什么会出现这样的情况呢?
分析如下:
由于我是使用的手动取值确定外套颜色的取值范围,这个范围非常的不准确,其中即包括了外套,还包括了头发部分。因此,在实验过程中,人物头发部分的颜色也会被更改。但是如果采用通道赋值的思路,就可以使得头发颜色不会被改变。因为头发的颜色大致为黑色,三通道的取值差不多相等,赋值另一个通道的值并不会引起多大改变。