OpenCV使用直方图均衡,修正曝光过度和曝光不足的图片

本文介绍了如何利用OpenCV的直方图均衡化技术来修正曝光过度和曝光不足的图片,通过图像直方图的讲解和代码示例展示了直方图均衡化的效果,实现了对多通道图像的处理,从而改善图像质量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

《OpenCV系列教程》
《深度学习-如何提高数据集质量》

项目位置:OpenCV-Sample
代码位置:39-equalizeHist.py

图像直方图讲解

如果用一句话来表示的话,那就统计每个像素点数值出现的次数,如下图:
在这里插入图片描述
这里是一张图片,里面表示的是灰度数值,灰度值为1的有4个点,灰度值为2的有7个数值,灰度值为3的有5个。如果表示为直方图的形式就是下面的状态了。
在这里插入图片描述
这里用直方图的形式对像素数值进行了展示。

使用直方图均衡修正的图片对比

曝光过度曝光不足
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述
通过修复,图像有了很大的改进。
直方图效果对比:
在这里插入图片描述

代码部分

这里面支持对多通道的均衡处理

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


def main():
    Overexpose = cv2.imread("res/Overexposed.jpg")
    underexpose = cv2.imread("res/underexposed.jpg")
    #cv2.imshow("Over", Overexpose)
    #cv2.imshow("under", underexpose)
    plt.figure(1)

    plt.subplot(4,2,1)
    plt.imshow(Overexpose)

    plt.subplot(4,2,2)
    plt.imshow(underexpose)

    plt.subplot(4, 2, 3)
    chans = cv2.split(Overexpose)
    colors = ("b", "g", "r")
    for (chan, color) in zip(chans, colors):
        hist = cv2.calcHist([chan], [0], None, [256], [0, 256])
        plt.plot(hist, color=color)
        plt.xlim([0, 256])

    plt.subplot(4, 2, 4)
    chans = cv2.split(underexpose)
    colors = ("b", "g", "r")
    for (chan, color) in zip(chans, colors):
        hist = cv2.calcHist([chan], [0], None, [256], [0, 256])
        plt.plot(hist, color=color)
        plt.xlim([0, 256])

    plt.subplot(4, 2, 5)
    equalizeOver = np.zeros(Overexpose.shape, Overexpose.dtype)
    equalizeOver[:, :, 0] = cv2.equalizeHist(Overexpose[:, :, 0])
    equalizeOver[:, :, 1] = cv2.equalizeHist(Overexpose[:, :, 1])
    equalizeOver[:, :, 2] = cv2.equalizeHist(Overexpose[:, :, 2])
    plt.imshow(equalizeOver)
    cv2.imwrite('./out/equlizeOver.jpg', equalizeOver)
#    cv2.imshow('equalizeOver', equalizeOver)

    plt.subplot(4, 2, 6)
    equalizeUnder = np.zeros(underexpose.shape, underexpose.dtype)
    equalizeUnder[:, :, 0] = cv2.equalizeHist(underexpose[:, :, 0])
    equalizeUnder[:, :, 1] = cv2.equalizeHist(underexpose[:, :, 1])
    equalizeUnder[:, :, 2] = cv2.equalizeHist(underexpose[:, :, 2])
    plt.imshow(equalizeUnder)
    cv2.imwrite('./out/equalizeunder.jpg', equalizeUnder)

    plt.subplot(4, 2, 7)
    chans = cv2.split(equalizeOver)
    colors = ("b", "g", "r")
    for (chan, color) in zip(chans, colors):
        hist = cv2.calcHist([chan], [0], None, [256], [0, 256])
        plt.plot(hist, color=color)
        plt.xlim([0, 256])

    plt.subplot(4, 2, 8)
    chans = cv2.split(equalizeUnder)
    colors = ("b", "g", "r")
    for (chan, color) in zip(chans, colors):
        hist = cv2.calcHist([chan], [0], None, [256], [0, 256])
        plt.plot(hist, color=color)
        plt.xlim([0, 256])

    plt.show()
    cv2.waitKey(0)

if __name__ == '__main__':
    main()
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值