【Opencv实战】几十年前的Vlog火了:黑白老照片如何上色?这黑科技操作一定要知道,复原度超高,竟美的出奇~(图像修复神级代码)

本文主要是介绍【Opencv实战】几十年前的Vlog火了:黑白老照片如何上色?这黑科技操作一定要知道,复原度超高,竟美的出奇~(图像修复神级代码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

导语

哈喽大家好呀!我是每天疯狂赶代码的木木子吖~情人节快乐呀!

所有文章完整的素材+源码都在👇👇

粉丝白嫖源码福利,请移步至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 cvdef 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 resdef ssd(I1, I2):"""ssd函数,衡量颜色通道是否对齐"""return np.sum((I1 - I2)*(I1 - I2))def find_xy(img1, g):"""找到最佳的平移参数,并对该颜色通道图片进行平移"""# 初始化loss = ssd(img1, g)img = img1u = 0v = 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 = loss1img = img2u = iv = jprint(u, v)return imgdef readImage(imname):"""read in the image"""im = cv.imread(imname)im = cv.cvtColor(im, cv.COLOR_BGR2GRAY)return imdef 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, rdef 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_out1im_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 |已有文章汇总 | 持续更新,直接看这篇就够了

(更多内容+源码都在✨文章汇总哦!!欢迎阅读喜欢的文章🎉~

这篇关于【Opencv实战】几十年前的Vlog火了:黑白老照片如何上色?这黑科技操作一定要知道,复原度超高,竟美的出奇~(图像修复神级代码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/391807

相关文章

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工

Java 线程池+分布式实现代码

《Java线程池+分布式实现代码》在Java开发中,池通过预先创建并管理一定数量的资源,避免频繁创建和销毁资源带来的性能开销,从而提高系统效率,:本文主要介绍Java线程池+分布式实现代码,需要... 目录1. 线程池1.1 自定义线程池实现1.1.1 线程池核心1.1.2 代码示例1.2 总结流程2. J

使用Java填充Word模板的操作指南

《使用Java填充Word模板的操作指南》本文介绍了Java填充Word模板的实现方法,包括文本、列表和复选框的填充,首先通过Word域功能设置模板变量,然后使用poi-tl、aspose-words... 目录前言一、设置word模板普通字段列表字段复选框二、代码1. 引入POM2. 模板放入项目3.代码

Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题

《Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题》在爬虫工程里,“HTTPS”是绕不开的话题,HTTPS为传输加密提供保护,同时也给爬虫带来证书校验、... 目录一、核心问题与优先级检查(先问三件事)二、基础示例:requests 与证书处理三、高并发选型:

利用Python操作Word文档页码的实际应用

《利用Python操作Word文档页码的实际应用》在撰写长篇文档时,经常需要将文档分成多个节,每个节都需要单独的页码,下面:本文主要介绍利用Python操作Word文档页码的相关资料,文中通过代码... 目录需求:文档详情:要求:该程序的功能是:总结需求:一次性处理24个文档的页码。文档详情:1、每个

Python内存管理机制之垃圾回收与引用计数操作全过程

《Python内存管理机制之垃圾回收与引用计数操作全过程》SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式,本文将介绍如何使用SQLAlc... 目录安装核心概念连接数据库定义数据模型创建数据库表基本CRUD操作创建数据读取数据更新数据删除数据查

Go语言中json操作的实现

《Go语言中json操作的实现》本文主要介绍了Go语言中的json操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、jsOChina编程N 与 Go 类型对应关系️ 二、基本操作:编码与解码 三、结构体标签(Struc

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

Vue实现路由守卫的示例代码

《Vue实现路由守卫的示例代码》Vue路由守卫是控制页面导航的钩子函数,主要用于鉴权、数据预加载等场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、概念二、类型三、实战一、概念路由守卫(Navigation Guards)本质上就是 在路