基于深度学习的图像的风格迁移创新实训5

上周完成的代码在一些图片上的效果相当好,比如:

但由于天空分割算法有一些简单和局限,因此出现了一些分割的不好的情况,比如:

因此,我觉得有必要在得到mask之后就进行一次判断,判断该mask是否过于参差不齐,也就是每一列最纵深的一个像素行程的序列的跳跃程度不能太大。当然,这种跳跃的高度和出现跳跃现象的次数,都要和原图的宽和高进行对比,得到的比率才是一个衡量标准。我衡量了十几张处理不好的图片,用gap_rate和gap_length_rate两个指标来衡量一张mask的好坏。核心代码如下:

last = maxd[0]
limit = rows//100
res = 0
number = 0

for k in range(1,cols):
    cur = maxd[k]
    if(abs(cur-last)>limit):
        res += 1
        number += abs(cur-last)
        for r in range(0,rows):
            mask[r,k] = 127
    last = cur

gap_rate = res/cols
gap_length_rate = number/rows
print("vertical line:"+str(res))
print("gap rate:"+str(gap_rate))
print("gap length rate:"+str(gap_length_rate))
#0.035
#0.55

if(gap_rate>=0.035 or gap_length_rate >= 0.55):
    show = np.zeros(ori.shape,np.uint8)
    for i in range(0,rows) :
        for j in range(0,cols) :
            for k in range(0,3):
                show[i,j,k] = ori[i,j,k]
else :
    show = np.zeros(ori.shape,np.uint8)
    for i in range(0,rows) :
        for j in range(0,cols) :
            if mask[i,j]== 255 or i<maxdepth[j]:
                differ = 0
                for k in range(0,3):
                    dis = maxdepth[j] - i
                    if dis<24:
                        a = 32 - dis
                        plus = 8*dis-1
                        show[i,j,k] = ori[i,j,k]*a//32 + plus
                    else:
                        show[i,j,k] = ori[i,j,k]//4 + 191

                    A = (int)(show[i,j,k])
                    B = (int)(show[i,j-1,k])
                    if(abs(A-B)>20):
                        differ+=1
                if(differ==3):
                    for k in range(0,3):
                        A = (int)(show[i,j,k])
                        B = (int)(show[i,j-1,k])
                        newval = (A+B)//2
                        show[i,j,k] = (np.uint8)(newval)
                    if(i<maxdepth[j]-35):
                        show[i, j, k] = ori[i, j, k]//4 + 191
                    elif(i<maxdepth[j]-20):
                        show[i,j,k] = ori[i,j,k]//3 + 169
                    elif(i<maxdepth[j]-25):
                        show[i,j,k] = ori[i,j,k]//2 + 127
                    elif(i<maxdepth[j]-20):
                        show[i,j,k] = ori[i,j,k]*2//3 + 84
                    elif(i<maxdepth[j]-15):
                        show[i,j,k] = ori[i,j,k]*3//4 + 63
                    elif(i<maxdepth[j]-7):
                        show[i,j,k] = ori[i,j,k]*7//8 + 31
                    elif(i<maxdepth[j]-5):
                        show[i,j,k] = ori[i,j,k]*15//16 + 15
                    else:
                        show[i,j,k] = ori[i,j,k]*31//32 + 7
            else:
                for k in range(0,3):
                    show[i,j,k] = ori[i,j,k]
这样,在遇到过于参差不齐的mask分割面之后,算法会检测到异常的gap_rate或者gap_length_rate,然后不对图像进行后处理,而是直接返回深度模型的处理结果,从而避免了返回有问题的图片。

猜你喜欢

转载自blog.csdn.net/geek_geeker/article/details/80732889