我正在尝试将一个掩码(二进制,只有一个通道)应用于RGB图像(3个通道,标准化为[0,1])。我目前的解决方案是,将RGB图像分割成它的通道,将其与掩模相乘并再次连接这些通道:
glm::vec3 extractTranslation(const glm::mat4 &m)
{
glm::vec3 translation;
// Extract the translation
translation.x = m[3][0];
translation.y = m[3][1];
translation.z = m[3][2];
return translation;
}
glm::vec3 extractScale(const glm::mat4 &m) //should work only if matrix is calculated as M = T * R * S
{
glm::vec3 scale;
scale.x = glm::length( glm::vec3(m[0][0], m[0][1], m[0][2]) );
scale.y = glm::length( glm::vec3(m[1][0], m[1][1], m[1][2]) );
scale.z = glm::length( glm::vec3(m[2][0], m[2][1], m[2][2]) );
return scale;
}
float extractLargestScale(const glm::mat4 &m)
{
glm::vec3 scale = extractScale(m);
return glm::max(scale.x, glm::max(scale.y, scale.z));
}
void Sphere::applyTransformation(const glm::mat4 &transformation)
{
glm::vec4 center = transformation * glm::vec4(_center, 1.0f);
float largestScale = extractLargestScale(transformation);
set(glm::vec3(center)/* / center.w */, _radius * largestScale);
}
然而,这似乎效率很低,特别是因为根据我的理解,这些计算都不是就地完成的。有没有更有效的方法来做到这一点?
答案 0 :(得分:5)
tf.mul()
运算符支持numpy-style broadcasting,这将允许您稍微简化和优化代码。
让我们说zero_one_mask
是m x n
张量,而output_img
是b x m x n x 3
(其中b
是批量大小 - 我& #39; m从你在维度3上拆分output_img
这一事实推断出这一点。您可以使用tf.expand_dims()
将zero_one_mask
播放到channels
,方法是将其重新整理为m x n x 1
张量:
with tf.variable_scope('apply_mask') as scope:
# Output mask is in range [-1, 1], bring to range [0, 1] first
# NOTE: Assumes `output_mask` is a 2-D `m x n` tensor.
zero_one_mask = tf.expand_dims((output_mask + 1) / 2, 2)
# Apply mask to all channels.
# NOTE: Assumes `output_img` is a 4-D `b x m x n x c` tensor.
output_img = tf.mul(output_img, zero_one_mask)
(*如果output_img
是4-D b x m x n x c
(对于任意数量的频道c
)或3-D m x n x c
张量,这将同等有效广播的方式。)