概述
OpenCV4.x發(fā)布以后,有很多新的特性與黑科技支持,無論是支持OpenVINO加速、圖計算模塊、二維碼識別,還是DNN中新增加的人臉檢測與識別模型,作為OpenCV開發(fā)者的我深深被吸引,幾乎只要有時間就會一個一個的去發(fā)現(xiàn)與之前的不同之處。OpenCV DNN模塊,不僅支持圖像分類、對象檢測、人臉檢測、圖像分割等操作除外,還支持對灰度圖像的自動彩色化轉(zhuǎn)換,而且效果十分靠譜,親測有效!
著色模型(colorization model)
該模型是在2016發(fā)表在ECCV上面的,該模型與之前的基于CNN模型的不同之處在于,它是一個無監(jiān)督的學習過程,不會把著色對象與訓練生成看成是一個回歸問題、而且是使用CIE Lab色彩空間,使用L分量作為輸入,輸出為顏色分量a,b,通過對顏色分量進行量化,把網(wǎng)絡(luò)作為一個分類問題對待, 對得到輸出結(jié)果,最終加上L分量之后,得到著色之后的圖像,模型架構(gòu)如下:
其中卷積層每一個block是有幾個重復(fù)的conv卷積操作與ReLU + BN層構(gòu)成!其中藍色部分,是a,b顏色的313對ab量化表示。最終學習到的就是WxHx313輸出,進一步轉(zhuǎn)換為Color ab的輸出, 加上L分量之后就是完整的圖像輸出!313對ab色彩空間量化表示如下:
針對自然場景下,ab值較低導致生成圖像的失真問題,作者通過分類再平衡技術(shù)依靠訓練階段,通過對損失函數(shù)調(diào)整像素權(quán)重,實現(xiàn)了比較好的效果。作者的github上可以查看該模型的實現(xiàn)源碼。
模型下載地址如下
https://github.com/e-lab/ENet-training
論文地址
https://arxiv.org/abs/1606.02147
OpenCV中使用
下載ENet預(yù)訓練模型,通過OpenCV DNN支持,可以實現(xiàn)加載模型與執(zhí)行推斷,對大多數(shù)的灰度圖像實現(xiàn)自然著色,毫無違和感!步驟如下:
加載模型
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)))
運行結(jié)果:
輸入彩色圖像,轉(zhuǎn)為灰度圖像,然后自動著色對比一下!
直接輸入灰度圖像,著色:
看效果,從此以后再也不擔心灰度圖像無法自動上色啦!
OpenCV成功解鎖!
-
模型
+關(guān)注
關(guān)注
1文章
3243瀏覽量
48836 -
人臉檢測
+關(guān)注
關(guān)注
0文章
80瀏覽量
16462 -
OpenCV
+關(guān)注
關(guān)注
31文章
635瀏覽量
41347
原文標題:OpenCV4.0 灰度圖像彩色化
文章出處:【微信號:CVSCHOOL,微信公眾號:OpenCV學堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論