概述
OpenCV4.x發(fā)布以后,有很多新的特性與黑科技支持,無(wú)論是支持OpenVINO加速、圖計(jì)算模塊、二維碼識(shí)別,還是DNN中新增加的人臉檢測(cè)與識(shí)別模型,作為OpenCV開發(fā)者的我深深被吸引,幾乎只要有時(shí)間就會(huì)一個(gè)一個(gè)的去發(fā)現(xiàn)與之前的不同之處。OpenCV DNN模塊,不僅支持圖像分類、對(duì)象檢測(cè)、人臉檢測(cè)、圖像分割等操作除外,還支持對(duì)灰度圖像的自動(dòng)彩色化轉(zhuǎn)換,而且效果十分靠譜,親測(cè)有效!
著色模型(colorization model)
該模型是在2016發(fā)表在ECCV上面的,該模型與之前的基于CNN模型的不同之處在于,它是一個(gè)無(wú)監(jiān)督的學(xué)習(xí)過(guò)程,不會(huì)把著色對(duì)象與訓(xùn)練生成看成是一個(gè)回歸問(wèn)題、而且是使用CIE Lab色彩空間,使用L分量作為輸入,輸出為顏色分量a,b,通過(guò)對(duì)顏色分量進(jìn)行量化,把網(wǎng)絡(luò)作為一個(gè)分類問(wèn)題對(duì)待, 對(duì)得到輸出結(jié)果,最終加上L分量之后,得到著色之后的圖像,模型架構(gòu)如下:
其中卷積層每一個(gè)block是有幾個(gè)重復(fù)的conv卷積操作與ReLU + BN層構(gòu)成!其中藍(lán)色部分,是a,b顏色的313對(duì)ab量化表示。最終學(xué)習(xí)到的就是WxHx313輸出,進(jìn)一步轉(zhuǎn)換為Color ab的輸出, 加上L分量之后就是完整的圖像輸出!313對(duì)ab色彩空間量化表示如下:
針對(duì)自然場(chǎng)景下,ab值較低導(dǎo)致生成圖像的失真問(wèn)題,作者通過(guò)分類再平衡技術(shù)依靠訓(xùn)練階段,通過(guò)對(duì)損失函數(shù)調(diào)整像素權(quán)重,實(shí)現(xiàn)了比較好的效果。作者的github上可以查看該模型的實(shí)現(xiàn)源碼。
模型下載地址如下
https://github.com/e-lab/ENet-training
論文地址
https://arxiv.org/abs/1606.02147
OpenCV中使用
下載ENet預(yù)訓(xùn)練模型,通過(guò)OpenCV DNN支持,可以實(shí)現(xiàn)加載模型與執(zhí)行推斷,對(duì)大多數(shù)的灰度圖像實(shí)現(xiàn)自然著色,毫無(wú)違和感!步驟如下:
加載模型
modelTxt="D:/projects/models/color/colorization_deploy_v2.prototxt"; modelBin="D:/projects/models/color/colorization_release_v2.caffemodel"; pts_txt="D:/projects/models/color/pts_in_hull.npy"; #加載網(wǎng)絡(luò) net=cv.dnn.readNetFromCaffe(modelTxt,modelBin) pts_in_hull=np.load(pts_txt)#loadclustercenters #populateclustercentersas1x1convolutionkernel pts_in_hull=pts_in_hull.transpose().reshape(2,313,1,1) net.getLayer(net.getLayerId('class8_ab')).blobs=[pts_in_hull.astype(np.float32)] net.getLayer(net.getLayerId('conv8_313_rh')).blobs=[np.full([1,313],2.606,np.float32)]
轉(zhuǎn)換輸入與執(zhí)行
frame=cv.imread("D:/images/yuan_test.png") h,w=frame.shape[:2] img_rgb=(frame[:,:,[2,1,0]]*1.0/255).astype(np.float32) #色彩空間轉(zhuǎn)換 img_lab=cv.cvtColor(img_rgb,cv.COLOR_BGR2Lab) img_l=img_lab[:,:,0]#pulloutLchannel (H_orig,W_orig)=img_rgb.shape[:2]#originalimagesize #resize為輸入網(wǎng)絡(luò)圖像大小 img_rs=cv.resize(img_rgb,(W_in,H_in)) img_lab_rs=cv.cvtColor(img_rs,cv.COLOR_BGR2Lab) #選擇一L通道分量 img_l_rs=img_lab_rs[:,:,0] img_l_rs-=50#subtract50formean-centering #輸入L分量,開始操作 net.setInput(cv.dnn.blobFromImage(img_l_rs)) ab_dec=net.forward()[0,:,:,:].transpose((1,2,0))
解碼輸出結(jié)果
#解碼輸出顏色值 (H_out,W_out)=ab_dec.shape[:2] ab_dec_us=cv.resize(ab_dec,(W_orig,H_orig)) img_lab_out=np.concatenate((img_l[:,:,np.newaxis],ab_dec_us),axis=2) img_bgr_out=np.clip(cv.cvtColor(img_lab_out,cv.COLOR_Lab2BGR),0,1)
顯示著色圖像
#顯示著色 frame=cv.resize(frame,(w,h)) cv.imshow('origin',frame) cv.imshow('gray',cv.cvtColor(frame,cv.COLOR_RGB2GRAY)) #fix4.0imshowissue cv.normalize(img_bgr_out,img_bgr_out,0,255,cv.NORM_MINMAX) cv.imshow('colorized',cv.resize(np.uint8(img_bgr_out),(w,h)))
運(yùn)行結(jié)果:
輸入彩色圖像,轉(zhuǎn)為灰度圖像,然后自動(dòng)著色對(duì)比一下!
直接輸入灰度圖像,著色:
看效果,從此以后再也不擔(dān)心灰度圖像無(wú)法自動(dòng)上色啦!
OpenCV成功解鎖!
-
模型
+關(guān)注
關(guān)注
1文章
3112瀏覽量
48658 -
人臉檢測(cè)
+關(guān)注
關(guān)注
0文章
80瀏覽量
16436 -
OpenCV
+關(guān)注
關(guān)注
29文章
624瀏覽量
41214
原文標(biāo)題:OpenCV4.0 灰度圖像彩色化
文章出處:【微信號(hào):CVSCHOOL,微信公眾號(hào):OpenCV學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論