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

对于水墨风格的图片,如果直接迁移,会出现灰蒙蒙的天空,不符合传统水墨画的“留白”效果。因此,我们决定加上天空分割算法,对图片进行后处理,实现天空部分的“留白”。

经过天空的分类算法之后,得到的原始二值图如下:(以单张图片为例)

基于深度学习的图像的风格迁移创新实训3_第1张图片

分割面过于凌乱,不适合直接处理,因此,使用形态学滤波中的开闭运算对图像进行处理,代码如下:

kernel = np.ones((7,7),np.uint8)
image = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)
image = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)

# kernel = np.ones((11,11),np.uint8)
# image = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)

# kernel = np.ones((13,13),np.uint8)
# image = cv2.dilate(image,kernel,iterations = 1)

# picture = cv2.imread("images/"+str(picnum)+".jpg")
# cv2.imshow("Image",picture)
image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
rows,cols = image.shape
mask = np.zeros((rows,cols),np.uint8)  # 背景黑色,前景白色
black = 0
white = 0

for r in range(0,10) :
    for c in range(0,cols) :
        # print(image[r,c])
        if image[r,c] > 127:
            white += 1
            image[r,c] = 255
        else :
            black += 1
            image[r,c] = 0
flag = 0
if white>black :
    flag = 255

得到的结果图片:

基于深度学习的图像的风格迁移创新实训3_第2张图片

可以看到,这张mask的上边缘有很明显的锯齿或者方块状。直接将该mask用于图片的后处理,会使得图片上出现同样的方块状锯齿,非常明显的人工痕迹。因此,我们需要改进这个mask。

我尝试的第一种方法是:逐列检测每一行的分界面,如果出现相邻两列有剧烈的上升或下降,就以该列为中心,填充两旁的列,使其慢慢下降,直到与原来的mask的像素位置相差不大。

代码如下:

for c in range(0,cols):
    for k in range(-10,10):
        if(c%3==0):
            mask[maxdepth[c]+k,c] = 127

change = 0
for c in range(0,cols-1):
    delta = maxdepth[c+1] - maxdepth[c]
    if(delta>4):    #go down the hill
        change += 1
        cwid = min(delta*2,cols-c-1)
        print(str(change) + ' bingo_down, cwid='+str(cwid))
        for k in range(c+1,c+cwid):
            newdepth = (maxdepth[c] - (k-c)//2 + maxdepth[k])//2
            print("row"+str(k)+":"+str(maxdepth[k])+"->"+str(newdepth))
            if(abs(newdepth-maxdepth[k])<=2):
                c = k
                break
            for b in range(newdepth,maxdepth[k]+1):
                mask[b,k] = 0
            maxdepth[k] = newdepth
    elif(delta<-4):     #climb up the hill
        cwid = min(abs(delta * 2), c)
        print(str(change)+' bingo2_up, cwid='+str(cwid))
        for k in range(c,c-cwid,-1):
            newdepth = ((maxdepth[c+1] - (c-k)//2)*3 + maxdepth[k])//4
            print("row"+str(k)+":"+str(maxdepth[k]) + "->" + str(newdepth))
            if(abs(newdepth-maxdepth[k])<= 2):
                break
            for b in range(maxdepth[k],newdepth+1):
                mask[b,k] = 0
            maxdepth[k] = newdepth
但是经过试验,该方法会带来整个决策面的升高,以至于在山的上方,本来属于天空的部分也被涂成了黑蒙蒙的颜色,效果并不是很理想。因此我决定尝试新的方法。


你可能感兴趣的:(风格迁移)