HDR blending not working with 16 bit images

2 次查看(过去 30 天)
I'm using the camresponse function and the makehdr function to blend few images and create a radiance map. I have no problem using 8 bits images, everything works fine. But if I use the same images but encoded with 16 bits, I get really bad results, as you can see in the following images. Using that crf with mkhdr results in a really bad quality hdr image.
The images are converted to 8 bit and 16 bit png from the original RAW file.
Any help? Is this function supposed to work with images with more than 8 bits? I guess so looking at camresponse.m but still I have these problems.
untitled.bmp
22.bmp
  3 个评论
gbos
gbos 2019-10-31
clc; clear all;
%% Parameters
defaultT = [0.625,1/5,1/3,1.3,3];
%% Collection of photos
setDir = fullfile('img','*.png');
imds = imageDatastore(setDir);
figure(1);
montage(imds);
%Check if there is the exposure info
meta = imfinfo(imds.Files{1});
try
temp = meta.DigitalCamera;
exif = true;
catch
exif = false;
end
%% Response Function
if(not(exif))
crf = camresponse(imds,'ExposureTimes',defaultT);
else
crf = camresponse(imds);
end
range = 0:length(crf)-1;
%Response function plots for every channel
figure(2); hold on;
if(size(crf,2) == 3)
%RGB Image
plot(crf(:,1),range,'--r','LineWidth',2);
plot(crf(:,2),range,'-.g','LineWidth',2);
plot(crf(:,3),range,':b','LineWidth',2);
legend('R-component','G-component','B-component','Location','southeast');
else
%Grayscale Image
plot(crf(:,1),range,'-k','LineWidth',2);
end
xlabel('Log-Exposure');
ylabel('Pixel Value');
title('Camera Response Function');
grid on;
axis('tight');
hold off;
gbos
gbos 2019-10-31
编辑:gbos 2019-10-31
images can be downloaded here. They're different from the ones used to recover the crf I showed you on the first post, but you'll see the same problem shows up.
You can later try to convert the images in 8 bit PNGs and you'll see that the algorithm will work properly.

请先登录,再进行评论。

回答(1 个)

Vinai Datta Thatiparthi
Hey!
I believe that this is expected behavior of the commands makehdr and camresponse. 8 bit images generally produce smoother camresponse curves since the intensity range is narrower as compared to 16 bit images.
As a workaround to obtaining a more accurate looking curve, considering using a higher sampling interval to narrow down the “crf” result.
% Increasing sampling interval
crfNew = crf(1:200:65536,:);
range = 0:length(crfNew)-1;
% Response function plots for every channel
figure(2); hold on;
if(size(crf,2) == 3)
% RGB Image
plot(crfNew(:,1),range,'r','LineWidth',2);
plot(crfNew(:,2),range,'g','LineWidth',2);
plot(crfNew(:,3),range,'b','LineWidth',2);
legend('R-component','G-component','B-component','Location','southeast');
else
% Grayscale Image
plot(crf(:,1),range,'-k','LineWidth',2);
end
Hope this helps!
  1 个评论
gbos
gbos 2019-11-12
Sadly it doesnt work. Weird things happen when I use 16 bit images. This is another example, with an RGB image. I tried using an higher sampling as you suggested.
8 bit PNG
untitled2.jpg
16 bit PNG
untitled.jpg

请先登录,再进行评论。

产品


版本

R2019b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by