上周完成的代码在一些图片上的效果相当好,比如:
但由于天空分割算法有一些简单和局限,因此出现了一些分割的不好的情况,比如:
因此,我觉得有必要在得到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,然后不对图像进行后处理,而是直接返回深度模型的处理结果,从而避免了返回有问题的图片。