OpenCV DNN模块黑白图片上色修复

Posted 咕里个咚

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV DNN模块黑白图片上色修复相关的知识,希望对你有一定的参考价值。

大家新年快乐啊,时隔多日,今天又来给博客添砖加瓦了,话不多说,我们先上效果图吧 

 

 

 

 图片左边部分是原始的黑白图像,右边是生产的彩色图片。

这个项目是基于在加利福尼亚大学,伯克利,Richard Zhang,Phillip Isola和Alexei A. Efros开发的研究工作--Colorful Image Colorization

论文地址:https://arxiv.org/pdf/1603.08511.pdf

作者项目github地址:https://github.com/richzhang/colorization/tree/caffe 

本人也是在看了之后试了效果的。基于OpenCV DNN模块给黑白老照片上色(附Python/C++源码) (qq.com)https://mp.weixin.qq.com/s/04_UtnP-56MaoOI3d1MSsg

然后,我这添油加醋的写了一个黑白视频转换为彩色视频的脚本,上代码

import numpy as np
import matplotlib.pyplot as plt
import cv2

print(cv2.__version__)

# Path of our caffemodel, prototxt, and numpy files
prototxt = "./model/colorization_deploy_v2.prototxt"
caffe_model = "./model/colorization_release_v2.caffemodel"
pts_npy = "./model/pts_in_hull.npy"

# Loading our model
net = cv2.dnn.readNetFromCaffe(prototxt, caffe_model)
pts = np.load(pts_npy)

layer1 = net.getLayerId("class8_ab")
print(layer1)
layer2 = net.getLayerId("conv8_313_rh")
print(layer2)
pts = pts.transpose().reshape(2, 313, 1, 1)
net.getLayer(layer1).blobs = [pts.astype("float32")]
net.getLayer(layer2).blobs = [np.full([1, 313], 2.606, dtype="float32")]

video_path = r'./heibai.mp4'
cap = cv2.VideoCapture(video_path)

fps = 24	#保存视频的FPS,可以适当调整
fourcc = cv2.VideoWriter_fourcc(*'XVID')
videoWriter = cv2.VideoWriter('video.avi',fourcc,fps,(1296,486))#最后一个是保存图片的尺寸
i = 0

while cap.isOpened():
    fps = cap.get(cv2.CAP_PROP_FPS)  # 返回视频的fps--帧率
    width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)  # 返回视频的宽
    height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)  # 返回视频的高
    print('fps:', fps, 'width:', width, 'height:', height)
    ret, ori_frame = cap.read()  # 读取一帧视频

    if ret:
        ori_frame = cv2.cvtColor(ori_frame, cv2.COLOR_BGR2GRAY)
        # Convert image from gray scale to RGB format
        ori_frame = cv2.cvtColor(ori_frame, cv2.COLOR_GRAY2RGB)
        normalized = ori_frame.astype("float32") / 255.0
        # Converting the image into LAB
        lab_image = cv2.cvtColor(normalized, cv2.COLOR_RGB2LAB)
        # Resizing the image
        resized = cv2.resize(lab_image, (224, 224))
        # Extracting the value of L for LAB image
        L = cv2.split(resized)[0]
        L -= 50  # OR we can write L = L - 50

        ######inference######
        net.setInput(cv2.dnn.blobFromImage(L))
        # Finding the values of 'a' and 'b'
        ab = net.forward()[0, :, :, :].transpose((1, 2, 0))
        # Resizing
        ab = cv2.resize(ab, (ori_frame.shape[1], ori_frame.shape[0]))

        # Combining L, a, and b channels
        L = cv2.split(lab_image)[0]
        # Combining L,a,b
        LAB_colored = np.concatenate((L[:, :, np.newaxis], ab), axis=2)

        ## Converting LAB image to RGB
        RGB_colored = cv2.cvtColor(LAB_colored, cv2.COLOR_LAB2RGB)
        # Limits the values in array
        RGB_colored = np.clip(RGB_colored, 0, 1)
        # Changing the pixel intensity back to [0,255],as we did scaling during pre-processing and converted the pixel intensity to [0,1]
        RGB_colored = (255 * RGB_colored).astype("uint8")

        RGB_BGR = cv2.cvtColor(RGB_colored, cv2.COLOR_RGB2BGR)
        finall_image = cv2.hconcat((ori_frame,RGB_BGR))
        videoWriter.write(finall_image)
    else:
        break
cap.release()
videoWriter.release()

可以看到的是,运行这个脚本需要先下载3个文件

为了方便大家运行代码,所以我给大家准备好了这3个文件和测试用的视频,放在百度云盘了。大家自行下载。

链接:https://pan.baidu.com/s/1d7ZDRG8AAWJY8G56tbok2Q 
提取码:gudo 

好了,最后在展示一下最后合成的视频,上链接

video

video20222161652361

 

好了,老规矩,上咩咩图。

至此,敬礼,salute!!!!!!


以上是关于OpenCV DNN模块黑白图片上色修复的主要内容,如果未能解决你的问题,请参考以下文章

OpenCv之黑白上色小技巧,奥黛丽赫本神颜,超惊艳滴~

人工智能--黑白图片上色

Pytthon实战------黑白老照片上色,手把手教你用Python怎么玩儿!

使用百度AI平台图像识别-人脸动漫化与黑白图片上色(PHP)

OpenCV的dnn模块调用TesorFlow训练的MoblieNet模型

OpenCV的dnn模块调用TesorFlow训练的MoblieNet模型