我试图使用能量最小化的概念从research paper中描述的给定图像中提取头发。能量函数依赖于先验概率和YCrCb颜色似然直方图。能量函数定义为:
(x)= data(x)+smooth(x).
data(x)= - Σ(log(I(x)| x)+ logsel(x)) [先验概率模型]
平滑(x)=Σ(x≠x)exp( - ||(x) - (x)|| ^ 2 /) [先前YcrCb颜色模型]
我很困惑如何标记给定的图形(图像的像素被视为图形的节点)。我尝试使用以下方法标记图表,但结果不符合预期:
def get_Edata(prob_dist, ycrcb_dist, img_y, img_x, pix):
e_data = 0
Y, Cr, Cb = pix
if ycrcb_dist[int(Y/4)][int(Cr/4)][int(Cb/4)] > 0 and prob_dist[img_y][img_x]>0:
e_data = -1*(math.log(ycrcb_dist[int(Y/4)][int(Cr/4)][int(Cb/4)], 10) + math.log(prob_dist[img_y][img_x], 10))
return e_data
def get_ESmooth(normalization_constant, pix_1, pix_2):
return math.exp(-(math.ceil(pix_1[0] - pix_2[0])**2)/normalization_constant)
在图中的节点之间添加权重时,我使用:
#adding the edges between neighbouring pixels.
img_graph.add_edge(central_node, neighbour_nodes, eSmooth, 0)
#adding the edges from source to node and from node to sink.
img_graph.add_tedge(central_node, weight_source, max_val_weight-source)
我想问题出在max_val_weight-source
上,因为将值更改为某个较低的整数会给我带来相对较好的结果,但这不是正确的做法。
同时将eSmooth的值更改为0不会影响输出?
如果有人能够对这种情况有所了解,我将非常感激。