我写了一个程序来改变照片中皮肤的颜色
首先我得到一个皮肤面具,然后我把BGR图像转换成HSV。在遮罩中添加V通道值。像这样:
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
H, S, V = cv2.split(hsv)
NV = np.where(skin_mask > 0, V + skin_mask / 255 * 50, V).astype(np.uint8)
NHSV = cv2.cvtColor(cv2.merge([H, S, NV]), cv2.COLOR_HSV2BGR)
但是一些原始的白色像素变成了黑色,我想也许V+skin_mask/255*50让像素超过255
因此,我尝试:
NV = np.where(skin_mask > 0, np.where(V + skin_mask / 255 * 50 > 255, 255, V + skin_mask / 255 * 50), V).astype(np.uint8)
这是工作。但是很难看
我想知道如何美化这篇文章,不要用np.where包括np.where。非常感谢
使用
skin_mask
作为掩码,而不是像skin_mask / 255 * 50
那样应用算术,可能更为优雅您可以使用cv2.add来解决它:
使用
cv2.add
优于NumPy算法的优点:cv2.add
支持mask
参数(掩码元素值通常为0
和255
)李>cv2.add
将结果剪辑到uint8[0,255]的有效范围,而不会溢出李>用于测试解决方案的代码I:
您仍然需要检测溢出。稍微干净一点的方法是使用
np.minimum
或np.clip
:np.clip
方法更为通用,以防值溢出到0以下:(分成两行只是我个人的编码偏好)
相关问题 更多 >
编程相关推荐