Python+OpenCV实现黑白老照片上色功能

 更新时间:2023年02月15日 08:42:40   作者:木木子学python  
我们都知道,有很多经典的老照片,受限于那个时代的技术,只能以黑白的形式传世。尽管黑白照片别有一番风味,但是彩色照片有时候能给人更强的代入感。本文就来用Python和OpenCV实现老照片上色功能,需要的可以参考一下

导语

我们都知道,有很多经典的老照片,受限于那个时代的技术,只能以黑白的形式传世。尽管黑白照片别有一番风味,但是彩色照片有时候能给人更强的代入感。今天在这里给大家提供一种给黑白照片上色的方法,尽管无法还原当时真实的颜色,但确实可以达到后期者的心中所想的颜色。

当然,除了让老照片变成彩色这一用途之外,还可以将现时的一些黑白照片自行染上彩色,完全按照自己的想法来上色,再和彩色的原图进行对比,也不失为一种有趣的玩法。

——小故事

年前在家中进行过年春节大扫除的时候,意外发现了爷爷奶奶年轻时的照片,只不过当时的拍摄技术还不发达,出来的相片都是黑白色的。所以我想将它们还原成彩色,给他们一个惊喜!

我不是敲代码的蛮,于是今天在情人节这天偷偷把老照片进行了一个色彩修复,这次尝试还别说,亲测了一下效果感觉效果还不错,于是今天打算将它们分享给有同样想法的你们。

旧时代的爷爷奶奶、外公外婆的照片都可以进行一个色彩修复哦,超惊艳滴~

如果你也想知道黑白照片还原成彩色怎么弄的话,就赶紧跟着我的步骤一步步操作起来吧,过程并不繁琐,就算你是修图小白也可以轻松驾驭!(只要你会代码一切皆有可能~厚脸皮.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)

三、效果展示

1)黑白照片风景上色

2)黑白照片色彩修复多图

到此这篇关于Python+OpenCV实现黑白老照片上色功能的文章就介绍到这了,更多相关Python OpenCV黑白老照片上色内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Jupyter notebook 输出部分显示不全的解决方案

    Jupyter notebook 输出部分显示不全的解决方案

    这篇文章主要介绍了Jupyter notebook 输出部分显示不全的解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • 详解TensorFlow训练网络两种方式

    详解TensorFlow训练网络两种方式

    本文主要介绍了TensorFlow训练网络两种方式,一种是基于tensor(array),另外一种是迭代器,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • python如何实现API的调用详解

    python如何实现API的调用详解

    Web API是网站的一部分,用于与使用非常具体的URL请求特定信息的程序交互,下面这篇文章主要给大家介绍了关于python实现API的快速调用指南,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • Python图像处理库处理步骤

    Python图像处理库处理步骤

    这篇文章主要介绍了Python图像处理探索之Python图像处理库,我们将学习使用不同的 Python 库实现一些常见的图像处理、变换和可视化技术,这些技术通常可以用作更复杂的图像处理任务的基本预处理/后处理步骤,需要的朋友可以参考下
    2023-04-04
  • python单元测试框架pytest的使用示例

    python单元测试框架pytest的使用示例

    这篇文章主要介绍了python单元测试框架pytest的使用示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • python中from import的使用解读

    python中from import的使用解读

    本文总结了Python中from和import的使用方法,包括导入模块和导入模块中的对象,强调了模块和对象的概念,并给出了具体的使用示例,最后,建议根据代码维护性和团队编码风格来选择合适的导入方式
    2025-03-03
  • python神经网络tfrecords文件的写入读取及内容解析

    python神经网络tfrecords文件的写入读取及内容解析

    这篇文章主要为大家介绍了python神经网络tfrecords文件的写入读取及内容解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Python爬虫Scrapy框架CrawlSpider原理及使用案例

    Python爬虫Scrapy框架CrawlSpider原理及使用案例

    这篇文章主要介绍了Python爬虫Scrapy框架(CrawlSpider),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • 分享Pytest fixture参数传递的几种方式

    分享Pytest fixture参数传递的几种方式

    这篇文章主要分享的是Pytest fixture参数传递的几种方式,文章基于python的相关资料展开对主题的详细介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-04-04
  • Python数据分析之双色球中蓝红球分析统计示例

    Python数据分析之双色球中蓝红球分析统计示例

    这篇文章主要介绍了Python数据分析之双色球中蓝红球分析统计,结合实例形式较为详细的分析了Python针对双色球蓝红球中奖数据分析的相关操作技巧,需要的朋友可以参考下
    2018-02-02

最新评论