我正在努力定位像素邻域中最大的k个像素。输入是nonetype
动态图像张量。
versions:-tensorflow 1.2-gpu-python 3.5
为了提取图像张量中每个像素的邻居,我创建了一个眼形滤波器:
w = np.eye(9).reshape((3, 3, 1, 9))weights=tf.constant(w,tf.float32)pixel_determ= tf.nn.conv2d(patches_batch, weights, strides=[1, 1, 1, 1], padding='SAME') #shape=(8, 183, 275, 9)
结果张量的深度将为9,包括邻居和中心像素值本身。
我需要做的是为图像的每个像素沿深度方向定位3个最大值(位置必须保留),并为最大的3个值分配True
或"1"
,其余分配"0"
或False
。
我对tf.nn.top_k
函数有点困惑。我无法得到正确的索引。此外,我还没有尝试过,但看起来它不接受None
类型的数据。有没有一些技巧或其他方法可以做到这一点?
如果我能得到任何帮助,我将非常感激。提前感谢你。
回答:
我想我已经找到了一个解决方案
def biggest_k_indices(mat, k): _, indices_mat =tf.nn.top_k(mat, tf.shape(mat)[3], sorted=False) _, indices_k =tf.nn.top_k(mat, k, sorted=False) index= [] eq =[] for i in range(k): index.append(tf.expand_dims(indices_k[:,:,:,i],-1)) eq.append(tf.equal(indices_mat,index[i])) bool_comb =tf.logical_or(eq[0],eq[1]) if (k==2): index.clear() eq.clear() return bool_comb for i in eq[2:]: bool_comb=tf.logical_or(bool_comb,i) index.clear() eq.clear() return bool_comb
在这个函数中,我在循环中将张量的索引与k个最大的索引逐一进行比较。然后通过tf.logical_or
帮助,我将True
值收集到一个单一的张量bool_comb
中。我仅用一个测试数组进行了测试。所以我不确定它是否会100%工作。