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

基于上周的实验结果,我想到了新的方法:在分界面的三行像素上均值滤波。实验代码如下:

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]

得到的结果是比较好的:


猜你喜欢

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