对彩色图像求相机响应函数 matlab
时间: 2023-05-29 11:04:47 浏览: 111
1. 采集一组不同曝光时间的图片,建议曝光时间差异不要太大,最好不超过2倍。
2. 将采集的图片转换为灰度图像,并将每个像素点的灰度值取对数。
3. 对于每个像素点,计算其在不同曝光时间下的灰度值,得到一组数据。将这组数据作为自变量,将相应的曝光时间作为因变量,拟合出一个函数,即为相机的响应函数。
下面是matlab代码实现:
% 读入图片,假设已经将图片存储在img文件夹中
img_folder = 'img/';
img_files = dir([img_folder '*.jpg']);
num_imgs = length(img_files);
% 读取第一张图片,获取图片大小
img_name = [img_folder img_files(1).name];
img = imread(img_name);
[height, width, ~] = size(img);
% 初始化灰度值矩阵和曝光时间矩阵
ln_E = zeros(height*width, num_imgs);
B = zeros(num_imgs, 1);
% 对每张图片进行处理
for i = 1:num_imgs
% 读取图片并转为灰度图像
img_name = [img_folder img_files(i).name];
img = imread(img_name);
img_gray = rgb2gray(img);
% 取对数
img_log = log(double(img_gray)+1);
% 将像素点的灰度值存入矩阵
ln_E(:, i) = img_log(:);
% 记录曝光时间
B(i) = get_exposure_time(img_name);
end
% 拟合响应函数
g = fit(ln_E, B, 'poly2');
% 绘制响应函数曲线
ln_E_vals = linspace(min(ln_E(:)), max(ln_E(:)), 100);
B_vals = g(ln_E_vals);
plot(ln_E(:), B, '.', ln_E_vals, B_vals, '-');
xlabel('ln(E)'); ylabel('B');
legend('Measured data', 'Fitted curve');
% 获取曝光时间
function [exposure_time] = get_exposure_time(img_name)
% 从文件名中获取曝光时间
exposure_time = str2double(extractBetween(img_name, '_t', '.jpg'));
end
阅读全文