使用OpenCV把照片变成老照片

老照片风格

各种相机有很多滤镜,有一种是像老照片一样的泛黄风格。如下列图片所示。
使用OpenCV把照片变成老照片-LMLPHP

使用OpenCV把照片变成老照片-LMLPHP

算法设计

老照片风格的设计核心在于对图像的颜色空间进行精心处理。以GRB空间为例,我们通过对R、G、B这三个关键通道的颜色数值进行精细调整,赋予图像一种独特的泛黄老照片效果。具体的转换公式如下:

在此公式中,r、g、b分别表示输入原图某一像素点的原始RGB值,而R、G、B则代表经过转换后的新RGB值。值得注意的是,转换后的RGB值必须保持在0至255的范围内,以确保图像的正常显示。

效果演示

左边是原始图片,右边是经过处理的输出图片:
使用OpenCV把照片变成老照片-LMLPHP
使用OpenCV把照片变成老照片-LMLPHP

代码

import cv2
import numpy as np


# 定义一个函数,用于实现复古风格的图像处理
def retro_style(img):
    # 将图像的三个通道分离出来
    b = img[:, :, 0]
    g = img[:, :, 1]
    r = img[:, :, 2]

    # 根据复古风格的公式,计算新的三个通道的值
    B = np.clip((0.272 * r + 0.534 * g + 0.131 * b), 0, 255).astype(np.uint8)
    G = np.clip((0.349 * r + 0.686 * g + 0.168 * b), 0, 255).astype(np.uint8)
    R = np.clip((0.393 * r + 0.769 * g + 0.189 * b), 0, 255).astype(np.uint8)

    # 将新的三个通道合并成图像
    img2 = np.dstack((B, G, R))

    # 显示处理后的图像
    cv2.imshow("retroimg", img2)


# 主函数
def main():
    # 读取图像
    img = cv2.imread('img22.jpeg')

    # 调用复古风格处理函数
    retro_style(img)

    # 显示原始图像
    cv2.imshow("img", img)

    # 等待按键输入
    cv2.waitKey(0)


# 程序入口
if __name__ == '__main__':
    main()



04-02 21:15