Python 实现两张图片色调一致的科普文章

在许多计算机视觉和图像处理应用中,将图像的色调进行一致化是一个重要的步骤。无论是在艺术创作中将不同的图片融合,还是在商业产品中保证颜色的一致性,图像色调匹配都是必不可少的。

本文将讨论如何使用 Python 完成两张图片的色调一致化,并附带示例代码。我们将使用常见的图像处理库 OpenCV 和 NumPy,来实现这一功能。

什么是色调一致化?

色调一致化(Color Matching)是指将一张图片的色彩调整为与另一张图片相似。常见的应用场景包括:

  1. 图像风格迁移
  2. 图像拼接
  3. 影像修复

在进行色调一致化时,我们通常会关注以下几个方面:

  • 颜色空间转换
  • 色彩直方图
  • 色彩分布调整

准备工作

在开始之前,我们需要安装一些必要的库:

pip install opencv-python numpy matplotlib

读取和显示图像

我们首先要读取图片,并用 Matplotlib 显示它们。

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

def show_images(img1, img2):
    plt.subplot(1, 2, 1)
    plt.imshow(cv2.cvtColor(img1, cv2.COLOR_BGR2RGB))
    plt.title('Image 1')
    
    plt.subplot(1, 2, 2)
    plt.imshow(cv2.cvtColor(img2, cv2.COLOR_BGR2RGB))
    plt.title('Image 2')
    
    plt.show()

# 读取图像
image1 = cv2.imread('image1.jpg')
image2 = cv2.imread('image2.jpg')

show_images(image1, image2)

提示

请确保在代码中将 'image1.jpg''image2.jpg' 替换为您本地的图片路径。

色彩空间转换

在图像处理中,色彩空间转换是非常常见的操作。我们将原图从 BGR 转换为 LAB(CIE Lab*)色彩空间,这样可以更容易地处理图像的色调和亮度。

def convert_to_lab(image):
    return cv2.cvtColor(image, cv2.COLOR_BGR2LAB)

lab_image1 = convert_to_lab(image1)
lab_image2 = convert_to_lab(image2)

计算色彩直方图

接下来,我们需要计算两张图像的 LAB 色彩直方图,以便进行色调匹配。

def calculate_histogram(image):
    # 分别计算 L, A, B 通道的直方图
    l_channel, a_channel, b_channel = cv2.split(image)
    hist_l = cv2.calcHist([l_channel], [0], None, [256], [0, 256])
    hist_a = cv2.calcHist([a_channel], [0], None, [256], [0, 256])
    hist_b = cv2.calcHist([b_channel], [0], None, [256], [0, 256])
    
    return hist_l, hist_a, hist_b

hist1 = calculate_histogram(lab_image1)
hist2 = calculate_histogram(lab_image2)

匹配色彩直方图

我们将通过直方图均衡化来实现色调一致化。

def match_histograms(source, target):
    source_hist, _ = np.histogram(source.flatten(), 256, [0, 256])
    target_hist, _ = np.histogram(target.flatten(), 256, [0, 256])
    
    source_cdf = source_hist.cumsum() / source_hist.sum()
    target_cdf = target_hist.cumsum() / target_hist.sum()
    
    s_values = np.searchsorted(source_cdf, np.arange(256) / 255.0)
    target_values = np.floor(target_cdf[s_values] * 255).astype(np.uint8)
    
    matched = target_values[source.flatten()]
    return matched.reshape(source.shape)

# 对 LAB 的 L 通道进行直方图匹配
l_channel1, a_channel1, b_channel1 = cv2.split(lab_image1)
l_channel2, a_channel2, b_channel2 = cv2.split(lab_image2)

matched_l_channel = match_histograms(l_channel1, l_channel2)
lab_image1_matched = cv2.merge((matched_l_channel, a_channel1, b_channel1))
image1_matched = cv2.cvtColor(lab_image1_matched, cv2.COLOR_LAB2BGR)

最终展示

现在我们已经完成了色调一致化的处理,接下来我们将展示处理后的结果。

show_images(image1, image1_matched)

可视化数据

在处理图像的过程中,我们可以用饼状图和旅行图来表示我们的数据分析过程。

pie
    title 图像处理步骤
    "读取图像": 25
    "转换色彩空间": 25
    "计算直方图": 25
    "匹配色彩": 25
journey
    title 图片处理旅程
    section 读取图片
      读取图1: 5: me
      读取图2: 5: me
    section 转换色彩空间
      转换图1: 5: me
      转换图2: 5: me
    section 计算直方图
      计算图1直方图: 5: me
      计算图2直方图: 5: me
    section 匹配色彩
      匹配图1和图2: 5: me

结尾

通过本次介绍,我们了解了图像色调一致化的基本概念及其实施步骤。通过使用 Python 和 OpenCV,我们可以高效地完成这一任务,不仅使得图像的视觉效果更加一致,同时也为后续的图像处理奠定了坚实的基础。希望这篇文章对您有所帮助,激发您在图像处理领域的更多探索与实践!