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黑白老照片上色内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python+AI实现给老照片上色

    目录 1. 准备工作 2. 编写代码 哈喽,大家好. 今天继续给大家分享有趣的 AI 项目. 上次我们分享了用GAN(生成对抗网络)让静态图片动起来. 今天我们分享用NoGAN的图像增强技术给老照片着色.效果如下: 原图 上色后 NoGAN是一种新型GAN,它能花费最少的时间进行GAN训练. 今天分享的这个项目已在GitHub开源项目,下面我们来运行一下. 1. 准备工作 首先,用git clone命令下载源码 git clone https://github.com/jantic/DeOldi

  • Python实现老照片修复之上色小技巧

    导语 "黑白变彩色,就是这么简单" 老照片上色,是一门功夫,费时费力. 老照片上色,也是一门艺术,还原历史. 提起老照片上色,小编第一个想到了的就是一位名叫Marina Amaral的艺术家,她将历史上很多著名的老照片,都用后期处理的方式填补上了颜色. 逼真.写实,看不出丝毫的漏洞,你对她的作品有多钦佩,也就意味着这项技艺有多复杂. 所以,你想学习老照片上色吗?也想把父母的照片,或者儿时的黑白照变成彩色的吗? 那木木子给你的建议的是:别费劲了,因为,这项工作,以后交给AI去完成就可以了

  • Python+DeOldify实现老照片上色功能

    目录 前言 安装 代码改造使用 前言 老照片上色其实很早之前就想写了,也有不少人问了我这个项目. 最近把DeOldify项目好好弄了弄. 项目地址:DeOldify项目地址 先看看项目给出的图片对比效果. 从给出的效果可以看出,上色后的图片对人物.景色.物品.环境等等都变得很生动. 下面来安装一下项目执行环境,测试一下自己的图片. 安装 看一下项目的README中关于安装的部分. 使用anaconda安装环境.安装完成后看一下模型文件需要下载哪些. 仔细看看,文章给出了不同模型的区别. 从作者的

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

    目录 导语 一.环境准备 二.代码展示 三.效果展示 导语 我们都知道,有很多经典的老照片,受限于那个时代的技术,只能以黑白的形式传世.尽管黑白照片别有一番风味,但是彩色照片有时候能给人更强的代入感.今天在这里给大家提供一种给黑白照片上色的方法,尽管无法还原当时真实的颜色,但确实可以达到后期者的心中所想的颜色. 当然,除了让老照片变成彩色这一用途之外,还可以将现时的一些黑白照片自行染上彩色,完全按照自己的想法来上色,再和彩色的原图进行对比,也不失为一种有趣的玩法. ——小故事 年前在家中进行过年

  • python opencv实现证件照换底功能

    本文实例为大家分享了python opencv实现证件照换底功能的具体代码,供大家参考,具体内容如下 思路:先转到HSV空间,利用颜色提取背景制作掩模版mask,然后通过按位操作提取人像和制作新背景,最后叠加背景和人像得到换底后照片 代码 #-*-coding:utf-8-*- import cv2 import numpy as np def cvtBackground(path,color): """ 功能:给证件照更换背景色(常用背景色红.白.蓝) 输入参数:path:

  • python opencv实现目标区域裁剪功能

    这个任务是自己在项目中数据处理的一部分内容,待处理的图片如下所示: 我需要将目标区域给裁剪出来,要不然在后期训练网络的时候整幅图像过大,且目标区域过小,得到结果不好,还会加剧计算量.在网上找了各个大佬的博客看,没找到合适的,便自己动手写了,顺便自己的小破站刚搭建起来,记录一下自己的思路. 思路 去寻找目标区域的最左边,最右边,最上面和最下面的像素点,取到坐标信息以后用CV2的裁剪一下就可以实现了. #难点 数据总共是11952张图片,每张图片是1024*768大小的,依次去遍历的话担心太费时间了

  • Python OpenCV超详细讲解基本功能

    目录 准备工作 转成灰度图像 高斯模糊 边缘检测 膨胀运算 腐蚀运算 准备工作 右击新建的项目,选择Python File,新建一个Python文件,然后在开头import cv2导入cv2库. 转成灰度图像 调用imread()方法获取我们资源文件夹中的图片lena.png cvtColor()方法可以让我们的图片转换成任意颜色,第一个参数是我们要转换的图片,第二个参数是要转成的颜色空间,cv2.COLOR_BGR2GRAY就是由BGR变为GRAY,我们日常生活中都是RGB三通道顺序,而在Op

  • Python Opencv实现图像轮廓识别功能

    本文实例为大家分享了python opencv识别图像轮廓的具体代码,供大家参考,具体内容如下 要求:用矩形或者圆形框住图片中的云朵(不要求全部框出) 轮廓检测 Opencv-Python接口中使用cv2.findContours()函数来查找检测物体的轮廓. import cv2 img = cv2.imread('cloud.jpg') # 灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化 ret, binary = cv2.th

  • Python OpenCV 调用摄像头并截图保存功能的实现代码

    0x01 OpenCV安装 通过命令pip install opencv-python 安装 pip install opencv-python 0x02  示例 import cv2 cap = cv2.VideoCapture(0) #打开摄像头 while(1): # get a frame ret, frame = cap.read() # show a frame cv2.imshow("capture", frame) #生成摄像头窗口 if cv2.waitKey(1)

  • Python在OpenCV里实现极坐标变换功能

    在中学里学习过直角坐标系,也叫做笛卡尔坐标系,它是正交坐标系,不过也学习过极坐标系,这种坐标系比较适合大炮发射的场合.极坐标系的定义如下: 在 平面内取一个定点O, 叫极点,引一条射线Ox,叫做极轴,再选定一个长度单位和角度的正方向(通常取逆时针方向).对于平面内任何一点M,用ρ表示线段OM的长度,θ表示从Ox到OM的角度,ρ叫做点M的极径,θ叫做点M的极角,有序数对 (ρ,θ)就叫点M的极坐标,这样建立的坐标系叫做极坐标系. 极坐标很方便应用到雷达上面,因为雷达不断地转动,反射回来的波计算出距

  • python+opencv打开摄像头,保存视频、拍照功能的实现方法

    以下代码是保存视频 # coding:utf-8 import cv2 import sys reload(sys) sys.setdefaultencoding('utf8') cap = cv2.VideoCapture(0) cap.set(3,640) cap.set(4,480) cap.set(1, 10.0) #此处fourcc的在MAC上有效,如果视频保存为空,那么可以改一下这个参数试试, 也可以是-1 fourcc = cv2.cv.CV_FOURCC('m', 'p', '4

随机推荐