基于上周的实验结果,我想到了新的方法:在分界面的三行像素上均值滤波。实验代码如下:
maxd = [] for j in range(0,cols): maxd.append(0) for i in range(0,rows) : for k in range(0,channels): show[i,j,k] = ori[i,j,k] if(mask[i,j]<127 and mask[i+3,j]<127 and mask[i+10,j]<127) : maxd[j] = i-1 # print(str(j)+":"+str(maxd[j])) break wid = 5; for times in range(0,5): for i in range(wid,cols-wid) : d = maxd[i] # print(str(i)+":"+str(d)) if (d>wid and d<rows-(wid+1)): for j in range(d - wid, d + (wid+1)): # print(str(i)+","+str(j)+":",end="") for k in range(0,3): A = (np.uint64)(ori[j-1,i-1,k]) B = (np.uint64)(ori[j-1,i,k]) C = (np.uint64)(ori[j-1,i+1,k]) D = (np.uint64)(ori[j,i-1,k]) E = (np.uint64)(ori[j,i,k]) F = (np.uint64)(ori[j,i+1,k]) G = (np.uint64)(ori[j+1,i-1,k]) H = (np.uint64)(ori[j+1,i,k]) I = (np.uint64)(ori[j+1,i+1,k]) # val = (ori[j-wid,i-wid,k] # +ori[j-wid,i,k] # +ori[j-wid,i+wid,k] # +ori[j,i-wid,k] # +ori[j,i,k] # +ori[j,i+wid,k] # +ori[j+wid,i-wid,k] # +ori[j+wid,i,k] +ori[j+wid,i+wid,k]) val = (int)(1/9*(A+B+C+D+E+F+G+H+I+120)) # print(val,end="") if(val<0): val = 0 if(val>255): val = 255 show[j,i,k] = val # if(k!= channels-1): # print(",",end="") print("\n")
可是实验结果和原来相比并没有显著的变化,方块状的锯齿仍然存在且比较显眼。
因此我想到了第三种方法:在原来的分割面上,每隔3~5个像素,将原像素值慢慢淡化,这样在视觉上会比较自然。主要代码:
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]
得到的结果是比较好的: