<p>使用<code>skin_mask</code>作为掩码,而不是像<code>skin_mask / 255 * 50</code>那样应用算术,可能更为优雅</p>
<p>您可以使用<a href="https://docs.opencv.org/master/d2/de8/group__core__array.html#ga10ac1bfb180e2cfda1701d06c24fdbd6" rel="nofollow noreferrer">cv2.add</a>来解决它:</p>
<pre><code>NV = V.copy()
cv2.add(NV, np.full_like(V, 50), NV, mask=skin_mask)
</code></pre>
<hr/>
<p>使用<code>cv2.add</code>优于NumPy算法的优点:</p>
<ul>
<li><code>cv2.add</code>支持<code>mask</code>参数(掩码元素值通常为<code>0</code>和<code>255</code>)</李>
<li><code>cv2.add</code>将结果剪辑到uint8[0,255]的有效范围,而不会溢出</李>
</ul>
<hr/>
<p>用于测试解决方案的代码I:</p>
<pre><code>import numpy as np
import cv2
# Build sample skin_mask
skin_mask = np.zeros((100, 80), np.uint8)
skin_mask[30:70, 30:60] = 255
# Build sample V matrix
V = np.full_like(skin_mask, 60)
V[40:80, 40:80] = 220
# Sum using cv2.add
NV = V.copy()
cv2.add(NV, np.full_like(V, 50), NV, mask=skin_mask)
# Sum using NumPy (used as reference for testing).
refNV = np.where(skin_mask > 0, np.minimum(V + skin_mask / 255 * 50, 255), V).astype(np.uint8) # Reference
if np.any(NV != refNV):
print('There is a bug: NV != refNV') # Should not enter here
# Show the images
cv2.imshow('skin_mask', skin_mask)
cv2.imshow('V', V)
cv2.imshow('NV', NV)
cv2.imshow('refNV', refNV)
cv2.waitKey()
cv2.destroyAllWindows()
</code></pre>