##实现效果
图像的线性映射
图像的亮度或者对比的增强可以将图像的像素值从范围[min,max]映射到[0,255]的范围。
使用查找表(LUT,Look-Up Table)来进行图像像素值的线性映射。
在这个示例中,你将图像的像素值从范围 [min, max]
映射到 [0, 255]
的范围。
这段代码的主要步骤包括:
-
创建一个长度为 256 的
lut
数组,用于存储像素值的映射。 -
使用循环遍历
lut
数组,计算每个像素值的映射。映射的计算是将[min, max]
范围内的像素值线性映射到[0, 255]
。 -
遍历图像的每个像素,将每个通道的像素值(红色、绿色、蓝色)映射到
lut
中相应的值。
这段代码的效果是将输入图像的像素值重新映射,以便使像素值范围更紧凑,通常用于增加对比度或调整图像的亮度范围。这种映射通常称为线性拉伸。在这个示例中,它通过将像素值的范围从 [min, max]
扩展到 [0, 255]
来实现。
请注意,这段代码是基于 OpenCV 中的 C++ 示例,用于处理彩色图像(3通道)。如果你需要将其用于灰度图像,可以将代码中的通道处理部分删除。此外,你可以根据需要更改 min
和 max
的值来调整映射的范围。
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)