• 使用查找表(LUT,Look-Up Table)来进行图像像素值的线性映射,图像对比度增强


    ##实现效果
    在这里插入图片描述

    图像的线性映射

    图像的亮度或者对比的增强可以将图像的像素值从范围[min,max]映射到[0,255]的范围。
    使用查找表(LUT,Look-Up Table)来进行图像像素值的线性映射。
    在这个示例中,你将图像的像素值从范围 [min, max] 映射到 [0, 255] 的范围。

    这段代码的主要步骤包括:

    1. 创建一个长度为 256 的 lut 数组,用于存储像素值的映射。

    2. 使用循环遍历 lut 数组,计算每个像素值的映射。映射的计算是将 [min, max] 范围内的像素值线性映射到 [0, 255]

    3. 遍历图像的每个像素,将每个通道的像素值(红色、绿色、蓝色)映射到 lut 中相应的值。

    这段代码的效果是将输入图像的像素值重新映射,以便使像素值范围更紧凑,通常用于增加对比度或调整图像的亮度范围。这种映射通常称为线性拉伸。在这个示例中,它通过将像素值的范围从 [min, max] 扩展到 [0, 255] 来实现。

    请注意,这段代码是基于 OpenCV 中的 C++ 示例,用于处理彩色图像(3通道)。如果你需要将其用于灰度图像,可以将代码中的通道处理部分删除。此外,你可以根据需要更改 minmax 的值来调整映射的范围。

    C++代码实现

    //set MinMax
            int min = 155;
            int max = 255;
            int v;
            int *lut = new int[256];
            for (int i=0; i<256; i++) {
                v = i - min;
                v = (int)(256.0*v/(max-min));
                if (v < 0)
                    v = 0;
                if (v > 255)
                    v = 255;
                lut[i] = v;
            }
            //apply lut table
    
            for (int i = 0; i < m_mat.rows; i++)
            {
                for (int j = 0; j < m_mat.cols; j++)
                {
                    int r = m_mat.at<cv::Vec3b>(i, j)[0];
                    int g = m_mat.at<cv::Vec3b>(i, j)[1];
                    int b = m_mat.at<cv::Vec3b>(i, j)[2];
                    m_mat.at<cv::Vec3b>(i, j)[0] = lut[r];
                    m_mat.at<cv::Vec3b>(i, j)[1] = lut[g];
                    m_mat.at<cv::Vec3b>(i, j)[2] = lut[b];
                }
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    Python代码实现

    import cv2
    import numpy as np
    
    # 读取彩色图像
    m_mat = cv2.imread('your_color_image.jpg')
    
    # 设置最小和最大像素值范围
    min_value = 155
    max_value = 255
    
    # 创建查找表(LUT)
    lut = np.arange(256, dtype=int)
    lut = np.clip(256 * (lut - min_value) / (max_value - min_value), 0, 255).astype(np.uint8)
    
    # 应用LUT表
    result_image = cv2.LUT(m_mat, lut)
    
    # 保存结果
    cv2.imwrite('result_image.jpg', result_image)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
  • 相关阅读:
    Docker 安装 mysql5.7
    机器视觉(1)——概述
    行为型设计模式(上)
    cmake应用:集成gtest进行单元测试
    图文翻译-免费图文翻译-批量图文翻译软件
    免费背景音人声分离解决方案MVSEP-MDX23,足以和Spleeter分庭抗礼
    HTML期末学生大作业-拯救宠物网页作业html+css
    基于AMD EPYC服务器的EDA芯片设计解决方案
    HTML5与CSS3学习笔记【第十五章 表单(一)】
    助力古彝文保护,AI文字识别技术推动文化传承
  • 原文地址:https://blog.csdn.net/zhuguiqin1/article/details/133886209