Python+OpenCV實(shí)現(xiàn)黑白老照片上色功能
導(dǎo)語(yǔ)
我們都知道,有很多經(jīng)典的老照片,受限于那個(gè)時(shí)代的技術(shù),只能以黑白的形式傳世。盡管黑白照片別有一番風(fēng)味,但是彩色照片有時(shí)候能給人更強(qiáng)的代入感。今天在這里給大家提供一種給黑白照片上色的方法,盡管無(wú)法還原當(dāng)時(shí)真實(shí)的顏色,但確實(shí)可以達(dá)到后期者的心中所想的顏色。
當(dāng)然,除了讓老照片變成彩色這一用途之外,還可以將現(xiàn)時(shí)的一些黑白照片自行染上彩色,完全按照自己的想法來(lái)上色,再和彩色的原圖進(jìn)行對(duì)比,也不失為一種有趣的玩法。
——小故事
年前在家中進(jìn)行過(guò)年春節(jié)大掃除的時(shí)候,意外發(fā)現(xiàn)了爺爺奶奶年輕時(shí)的照片,只不過(guò)當(dāng)時(shí)的拍攝技術(shù)還不發(fā)達(dá),出來(lái)的相片都是黑白色的。所以我想將它們還原成彩色,給他們一個(gè)驚喜!
我不是敲代碼的蠻,于是今天在情人節(jié)這天偷偷把老照片進(jìn)行了一個(gè)色彩修復(fù),這次嘗試還別說(shuō),親測(cè)了一下效果感覺(jué)效果還不錯(cuò),于是今天打算將它們分享給有同樣想法的你們。
舊時(shí)代的爺爺奶奶、外公外婆的照片都可以進(jìn)行一個(gè)色彩修復(fù)哦,超驚艷滴~
如果你也想知道黑白照片還原成彩色怎么弄的話,就趕緊跟著我的步驟一步步操作起來(lái)吧,過(guò)程并不繁瑣,就算你是修圖小白也可以輕松駕馭!(只要你會(huì)代碼一切皆有可能~厚臉皮.jpg)
利用圖像處理技術(shù),基于數(shù)字化存儲(chǔ)的玻璃底板圖像自動(dòng)生成盡量非虛化的彩色的圖像。從原始圖像文件中分割提取三個(gè)彩色通道圖像,將它們對(duì)齊并彼此疊加在一起,最終形成一張RGB彩色的圖像。
一、環(huán)境準(zhǔn)備
1)運(yùn)行環(huán)境
本文用到的環(huán)境如下——
Python3、Pycharm社區(qū)版,第三方模塊:Opencv、numpy。
部分自帶的模塊只要安裝完 Python就可以直接使用了,需要安裝 的庫(kù)的話看教程下
模塊安裝:
pip install +模塊名 鏡像源安裝:pip install -i https://pypi.douban.com/simple/+模塊名
(之前有說(shuō)過(guò)安裝報(bào)錯(cuò)的幾種方式跟解決方法,不會(huì)安裝的可以去看下,還有很多國(guó)內(nèi)鏡像源也有文章的)
圖片文本素材等——
都是一些老照片,大家可以隨便準(zhǔn)備一些哈,當(dāng)然需要完整的素材圖片跟源碼的文末找我即可!
二、代碼展示
1) fixTif.py: tif圖像的修復(fù),使用的是openCV內(nèi)置的高斯金字塔
import numpy as np import cv2 as cv def img_translate(img, tx, ty): """對(duì)圖像進(jìn)行平移""" heigh, width = img.shape[:2] m = np.float32([[1, 0, tx], [0,1, ty]]) res = cv.warpAffine(img, m, (width, heigh)) return res def ssd(I1, I2): """ssd函數(shù),衡量顏色通道是否對(duì)齊""" return np.sum((I1 - I2)*(I1 - I2)) def find_xy(img1, g): """找到最佳的平移參數(shù),并對(duì)該顏色通道圖片進(jìn)行平移""" # 初始化 loss = ssd(img1, g) img = img1 u = 0 v = 0 # 根據(jù)ssd函數(shù)尋找最佳的對(duì)齊位置 for i in range(-20, 30): for j in range(-20, 30): img2 = img_translate(img1, i, j) loss1 = ssd(img2, g) if loss > loss1: loss = loss1 img = img2 u = i v = j print(u, v) return img def readImage(imname): """read in the image""" im = cv.imread(imname) im = cv.cvtColor(im, cv.COLOR_BGR2GRAY) return im def separate(im): """separate color channels""" # compute the height of each part (just 1/3 of total) height = np.floor(im.shape[0] / 3.0).astype(np.int) b = im[:height] g = im[height: 2 * height] r = im[2 * height: 3 * height] return b, g, r def merge(b,g,r): """將三個(gè)顏色通道進(jìn)行merge""" return cv.merge((b,g,r)) def gaussianPyramid(img): """直接使用OpenCV的高斯金字塔進(jìn)行實(shí)現(xiàn)""" return cv.pyrDown(img) if __name__ == '__main__': # name of the input file #imname = 'images/train.tif' imname = 'images/three_generations.tif' #imname = 'images/lady.tif' #imname = 'images/emir.tif' #imname = 'images/icon.tif' #imname = 'images/self_portrait.tif' #imname = 'images/village.tif' #imname = 'images/turkmen.tif' im = readImage(imname) print(im.shape) #cv.imshow("source image", im) # 獲取平均切割的三個(gè)顏色通道 b, g, r = separate(im) # 對(duì)三個(gè)顏色通道分別應(yīng)用高斯金字塔 b = gaussianPyramid(b) b = gaussianPyramid(b) b = gaussianPyramid(b) g = gaussianPyramid(g) g = gaussianPyramid(g) g = gaussianPyramid(g) r = gaussianPyramid(r) r = gaussianPyramid(r) r = gaussianPyramid(r) im_out0 = merge(b, g, r) cv.imshow("before", im_out0) # 顏色通道平移進(jìn)行對(duì)齊,對(duì)齊的過(guò)程中以綠色作為基準(zhǔn) b = find_xy(b, g) r = find_xy(r, g) # 將平移處理后的三通道m(xù)erge,得到處理后的圖片im_out1 im_out1 = merge(b, g, r) # 將修復(fù)后的圖片寫進(jìn)磁盤 #cv.imwrite('out/after_' + imname[7:], im_out1) cv.imshow("after", im_out1) #print(im_out1.shape) cv.waitKey(0)
三、效果展示
1)黑白照片風(fēng)景上色
2)黑白照片色彩修復(fù)多圖
到此這篇關(guān)于Python+OpenCV實(shí)現(xiàn)黑白老照片上色功能的文章就介紹到這了,更多相關(guān)Python OpenCV黑白老照片上色內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
openCV實(shí)踐項(xiàng)目之銀行卡卡號(hào)識(shí)別功能
最近在惡補(bǔ)opencv,在前期不太那么認(rèn)真的學(xué)習(xí)狀態(tài)下,著手搞了一下這個(gè)小項(xiàng)目實(shí)戰(zhàn),基于模板匹配下的銀行卡卡號(hào)識(shí)別,下面這篇文章主要給大家介紹了關(guān)于openCV實(shí)踐項(xiàng)目之銀行卡卡號(hào)識(shí)別功能的相關(guān)資料,需要的朋友可以參考下2022-11-11Python中l(wèi)ogger模塊的使用場(chǎng)景分析
logger是python的內(nèi)置模塊,用以輸出代碼運(yùn)行過(guò)程中的運(yùn)行情況,極大的方便了我們的debug過(guò)程,本文通過(guò)實(shí)例代碼給大家介紹了Python中l(wèi)ogger模塊的使用教程,需要的朋友可以參考下2023-06-06python調(diào)用Matplotlib繪制分布點(diǎn)并且添加標(biāo)簽
這篇文章主要為大家詳細(xì)介紹了python調(diào)用Matplotlib繪制分布點(diǎn)并且添加標(biāo)簽的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05python中使用Celery容聯(lián)云異步發(fā)送驗(yàn)證碼功能
Celery 是一個(gè) 基于python開(kāi)發(fā)的分布式異步消息任務(wù)隊(duì)列,通過(guò)它可以輕松的實(shí)現(xiàn)任務(wù)的異步處理,本文重點(diǎn)給大家介紹使用Celery容聯(lián)云異步發(fā)送驗(yàn)證碼功能,感興趣的朋友一起看看吧2021-09-09Python3控制路由器——使用requests重啟極路由.py
通過(guò)本文給大家介紹Python3控制路由器——使用requests重啟極路由.py的相關(guān)知識(shí),代碼寫了相應(yīng)的注釋,以后再寫成可以方便調(diào)用的模塊,感興趣的朋友一起學(xué)習(xí)吧2016-05-05