机器视觉学习-day16-直方图均衡化

代码步骤:图片输入→灰度化→绘制直方图→直方图均衡化→绘制直方图→图片输出

1 绘制直方图

直方图就是对图像中每个像素值进行频数统计,绘制成柱状统计图,x轴是灰度值,y轴是每个灰度出现的频次。

理解下面的函数

# 直方图绘制函数
import cv2
import numpy as np


def draw_hist(image, color):  # 定义了一个名为draw_hist的函数
    """
    绘制直方图
    :param image: 输入图像,哪个图的直方图图像(灰度化之后的)
    :param color: 直方图柱子什么颜色,BGR元组
    :return: 直方图图像
    """
    hist = cv2.calcHist(  # 使用OpenCV的calcHist函数计算图像直方图
        [image],  # 计算直方图的图像,支持多图像输入,因此一个图像也要写成列表
        [0],  # 要计算的图像灰度值通道需要,灰度图只有一个通道,所以是0
        None,  # 掩膜,全图计算不需要
        [256],  # 直方图x轴的精细程度,256表示分为256份
        [0, 255]  # x轴的范围
    )
    print(hist.shape)  # (256, 1) 256表示有256个灰度频数数据
    # 提取关键数据
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(hist)
    # print('min_val:', min_val)  # 0.0,最小的灰度频数
    print('max_val:', max_val)  # 471606.0,最大的灰度频数
    # print('min_loc:', min_loc)  # (0, 255),最小的灰度频数对应的灰度值
    # print('max_loc:', max_loc)  # (0, 1),最大的灰度频数对应的灰度值
    # 创建一张纯黑图,画柱子
    hist_img = np.zeros([256, 256, 3], np.uint8)
    # 为了让y轴最高的柱子留一部门空白,最高柱子的高度
    hpt = int(256 * 0.9)
    for h in range(256):  # 从0到255,每个灰度画柱子
        # 柱子高度(整数) = 直方图的最高值hpt * 每个灰度的频数/最高的频数
        intensity = int(hpt * hist[h] / max_val)
        # print(intensity)
        # 画柱子(线)
        cv2.line(
            hist_img,
            (h, 256),  # x轴的起始点
            (h, 256 - intensity),  # 线段从下往上画的终点
            color
        )
    return hist_img

2 直方图均衡化

一张好的图像通常在直方图上分布比较均匀,这样的图像对比度比较强烈(明暗差别大)。

直方图均衡化可以提升原图的观感,需要遍历图像的像素,统计每个灰度值出现的频数、比例与累积比例,并重新映射到新的范围(如0-255,或其他范围),从而提升图像的观感。

均衡化之后的图像显示效果会更加强烈,具有广泛地应用前景:
1.医学影像处理:
        X光、CT扫描、核磁共振

2.摄影与监控
        改善照片的对比度和色彩平衡提升观感

3.卫星影像处理
        可以增加图像质量,提高解析度

2.1 原始的直方图均衡化

选择hist_method(直方图均衡化方法)中的equalizeHist参数设置为原始的直方图均衡化算法。

<
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值