导语
哈喽大家好呀!我是每天疯狂赶代码的木木子吖~情人节快乐呀!
所有文章完整的素材+源码都在👇👇
粉丝白嫖源码福利,请移步至CSDN社区或文末公众hao即可免费。
我们都知道,有很多经典的老照片,受限于那个时代的技术,只能以黑白的形式传世。尽管黑
白照片别有一番风味,但是彩色照片有时候能给人更强的代入感。今天在这里给大家提供一种
给黑白照片上色的方法,尽管无法还原当时真实的颜色,但确实可以达到后期者的心中所想的
颜色。
当然,除了让老照片变成彩色这一用途之外,还可以将现时的一些黑白照片自行染上彩色,完
全按照自己的想法来上色,再和彩色的原图进行对比,也不失为一种有趣的玩法。
——小故事
年前在家中进行过年春节大扫除的时候,意外发现了爷爷奶奶年轻时的照片,只不过当时的拍
摄技术还不发达,出来的相片都是黑白色的。所以我想将它们还原成彩色,给他们一个惊喜!
我不是敲代码的蛮,于是今天在情人节这天偷偷把老照片进行了一个色彩修复,这次尝试还别
说,亲测了一下效果感觉效果还不错,于是今天打算将它们分享给有同样想法的你们。
旧时代的爷爷奶奶、外公外婆的照片都可以进行一个色彩修复哦,超惊艳滴~
如果你也想知道黑白照片还原成彩色怎么弄的话,就赶紧跟着我的步骤一步步操作起来吧,过
程并不繁琐,就算你是修图小白也可以轻松驾驭!(只要你会代码一切皆有可能~厚脸皮.jpg)
正文
利用图像处理技术,基于数字化存储的玻璃底板图像自动生成尽量非虚化的彩色图像。从原始
图像文件中分割提取三个彩色通道图像,将它们对齐并彼此叠加在一起,最终形成一张RGB彩
色图像。
一、环境准备
1)运行环境
本文用到的环境如下——
Python3、Pycharm社区版,第三方模块:Opencv、numpy。
部分自带的模块只要安装完 Python就可以直接使用了,需要安装 的库的话看教程下🎐
模块安装👇:
pip install +模块名 镜像源安装:pip install -i https://pypi.douban.com/simple/+模块名
(之前有说过安装报错的几种方式跟解决方法,不会安装的可以去看下,还有很多国内镜像源
也有文章的)
图片文本素材等👇——
都是一些老照片,大家可以随便准备一些哈,当然需要完整的素材图片跟源码的文末找我即可!
二、代码展示
1) fixTif.py: tif图像的修复,使用的是openCV内置的高斯金字塔
import numpy as np
import cv2 as cv
def img_translate(img, tx, ty):
"""对图像进行平移"""
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函数,衡量颜色通道是否对齐"""
return np.sum((I1 - I2)*(I1 - I2))
def find_xy(img1, g):
"""找到最佳的平移参数,并对该颜色通道图片进行平移"""
# 初始化
loss = ssd(img1, g)
img = img1
u = 0
v = 0
# 根据ssd函数寻找最佳的对齐位置
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):
"""将三个颜色通道进行merge"""
return cv.merge((b,g,r))
def gaussianPyramid(img):
"""直接使用OpenCV的高斯金字塔进行实现"""
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)
# 获取平均切割的三个颜色通道
b, g, r = separate(im)
# 对三个颜色通道分别应用高斯金字塔
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)
# 颜色通道平移进行对齐,对齐的过程中以绿色作为基准
b = find_xy(b, g)
r = find_xy(r, g)
# 将平移处理后的三通道merge,得到处理后的图片im_out1
im_out1 = merge(b, g, r)
# 将修复后的图片写进磁盘
#cv.imwrite('out/after_' + imname[7:], im_out1)
cv.imshow("after", im_out1)
#print(im_out1.shape)
cv.waitKey(0)
2)运行程序
import numpy as np
import cv2 as cv
# name of the input file
imname = 'images/monastery.jpg'
# read in the image
im = cv.imread(imname)
im = cv.cvtColor(im, cv.COLOR_BGR2GRAY)
print(im.shape)
cv.imshow("source image", im)
# convert to double (might want to do this later on to save memory)
# im = img_as_float(im)
# compute the height of each part (just 1/3 of total)
height = np.floor(im.shape[0] / 3.0).astype(np.int)
# separate color channels
b = im[:height]
g = im[height: 2 * height]
r = im[2 * height: 3 * height]
# align the images
# functions that might be useful for aligning the images include: np.roll, np.sum
# ag = align(g, b)
# ar = align(r, b)
# create a color image
# im_out = cv.merge((ar, ag, b)) # this line should be activated after implementing the align functions
im_out = cv.merge((b, g, r)) # this line should be deleted after implementing the align functions
# save and display the output image
cv.imwrite("out/out_fname.jpg", im_out)
cv.imshow("output image", im_out)
cv.waitKey(0)
三、效果展示
1)黑白照片风景上色
2)黑白照片色彩修复多图
3)黑白照片-奥黛丽赫本彩色
4)黑白照片-结婚老照片上色
总结
大家看完以上详细教程,学会黑白照片还原成彩色怎么弄了吗?如果你们有更简单的方法,欢
迎在评论区分享出来,我们可以一块探讨一番~
好啦。今天的内容写到这里旧正式结束了哈,喜欢的小可爱三连领取免费的源码哦👇
🎯完整的免费源码领取处:找我吖!文末公众hao可自行领取,滴滴我也可!
🔨推荐往期文章——
项目1.1 动漫化人物
【突破次元壁】谁说二次元离我们遥远?Python特效火遍全网,关键技术原来是它。
项目1.2 颜值打分系统
Python小测试 2021最新男女颜值打分小系统标准出炉,看哭无数人...
项目3.0 Opencv换背景图
【Opencv实战】AI换背景:朋友结婚没有蓝天白云怎么办?幸亏我急中生智。
项目3.1 抠图神器
【爆赞】这款Python小程序自动抠图只需5秒,秒杀PS手动抠图?
项目3.3 图片处理加/去水印
【一篇解决】Python图片处理: 去水印/加水印—这几个方法你一定要学会,太神奇了~(建议保留)
项目3.4 Opencv水果识别小程序
【Opencv实战】识别水果的软件叫什么?一款超好用的识别软件分享,一秒鉴定(真是活~久~见~啊)
🎄文章汇总——
汇总合集 Python—2022 |已有文章汇总 | 持续更新,直接看这篇就够了
(更多内容+源码都在✨文章汇总哦!!欢迎阅读喜欢的文章🎉~