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

本文介绍了如何使用查找表(LUT)在C++和Python中对图像进行线性映射,将像素值从[min,max]范围映射到[0,255],以增强图像的亮度和对比度。代码示例展示了如何创建LUT并应用于彩色和灰度图像。
摘要由CSDN通过智能技术生成

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

图像的线性映射

图像的亮度或者对比的增强可以将图像的像素值从范围[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];
            }
        }

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)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值