对于水墨风格的图片,如果直接迁移,会出现灰蒙蒙的天空,不符合传统水墨画的“留白”效果。因此,我们决定加上天空分割算法,对图片进行后处理,实现天空部分的“留白”。
经过天空的分类算法之后,得到的原始二值图如下:(以单张图片为例)
分割面过于凌乱,不适合直接处理,因此,使用形态学滤波中的开闭运算对图像进行处理,代码如下:
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
得到的结果图片:
可以看到,这张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
但是经过试验,该方法会带来整个决策面的升高,以至于在山的上方,本来属于天空的部分也被涂成了黑蒙蒙的颜色,效果并不是很理想。因此我决定尝试新的方法。