3. 图像对直方图均衡化

图像对直方图均衡化 学习卡片

任务说明

双目立体匹配的精度高度依赖左右图像在光照、曝光上的一致性。当图像整体偏暗、偏亮或对比度不足时,匹配代价计算容易产生歧义。本案例对双目图像对分别进行直方图均衡化,使左右视图的灰度分布更均匀、对比度增强,为后续立体匹配提供灰度分布更一致的输入。

实现方案

采用OpenCV的equalizeHist函数,对左右灰度图像分别做全局直方图均衡化。该函数将灰度直方图映射为近似均匀分布,从而拉伸动态范围、增强对比度。实现流程:读取双目图像→转为灰度→分别均衡化→拼接显示与保存结果。

左图 left.png (彩色/灰度) 右图 right.png (彩色/灰度) cvtColor → 灰度 cvtColor → 灰度 equalizeHist 左图均衡化 equalizeHist 右图均衡化 left_eq.png 拼接显示 right_eq.png 保存结果 输入双目图像 → 灰度化 → 分别直方图均衡化 → 输出增强对比度后的图像对

代码实现

import cv2
import numpy as np

def load_stereo_pair(left_path, right_path):
    """读取双目图像对,返回灰度图"""
    left = cv2.imread(left_path)
    right = cv2.imread(right_path)
    if left is None or right is None:
        raise FileNotFoundError("无法读取图像,请检查路径")
    # 若为彩色图则转为灰度
    if len(left.shape) == 3:
        left = cv2.cvtColor(left, cv2.COLOR_BGR2GRAY)
    if len(right.shape) == 3:
        right = cv2.cvtColor(right, cv2.COLOR_BGR2GRAY)
    return left, right

def histogram_equalize_pair(left_gray, right_gray):
    """对双目灰度图分别做直方图均衡化"""
    left_eq = cv2.equalizeHist(left_gray)
    right_eq = cv2.equalizeHist(right_gray)
    return left_eq, right_eq

def main():
    # 输入双目图像路径(请替换为实际路径)
    left_path = "left.png"
    right_path = "right.png"

    # 1. 读取并灰度化
    left_gray, right_gray = load_stereo_pair(left_path, right_path)

    # 2. 直方图均衡化
    left_eq, right_eq = histogram_equalize_pair(left_gray, right_gray)

    # 3. 拼接显示(左原图|左均衡|右原图|右均衡)
    h, w = left_gray.shape
    canvas = np.zeros((h, w * 4), dtype=np.uint8)
    canvas[:, 0:w] = left_gray
    canvas[:, w:2*w] = left_eq
    canvas[:, 2*w:3*w] = right_gray
    canvas[:, 3*w:4*w] = right_eq
    cv2.imshow("Stereo Equalization (L|L_eq|R|R_eq)", canvas)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    # 4. 保存均衡化结果
    cv2.imwrite("left_eq.png", left_eq)
    cv2.imwrite("right_eq.png", right_eq)
    print("已保存 left_eq.png 和 right_eq.png")

if __name__ == "__main__":
    main()

依赖与运行

依赖:Python 3、OpenCV(pip install opencv-python)、NumPy(OpenCV安装时自动附带)。

运行方式:将双目图像命名为left.png和right.png放在脚本同目录(或修改代码中的路径),执行python stereo_equalize.py。

验证方法

运行后观察弹出的拼接窗口:左侧两幅为左图均衡前后对比,右侧两幅为右图均衡前后对比。均衡后的图像应明显比原图对比度更高——暗部更暗、亮部更亮、整体灰度层次更丰富。同时程序会在当前目录生成left_eq.png和right_eq.png两个文件。

判定标准:

  1. 程序无报错正常退出,且两个输出文件成功生成;
  2. 均衡化后的图像灰度直方图比原图更平坦(可用cv2.calcHist验证,灰度值分布范围明显展宽);
  3. 左右图均衡化后整体亮度分布趋于一致,不存在一侧明显偏暗或偏亮的情况。

预期输出示例:对于一张整体偏暗、灰度集中在0~80的图像,均衡化后灰度将扩展到接近0~255的完整范围,图像中原本难以分辨的暗部纹理变得清晰可见。此结果由equalizeHist的累积分布函数映射直接决定,与给定输入唯一对应。