Я делаю технику улучшения изображения, которая улучшает тусклое изображение. Я разделил изображение 640 x 480 на блоки по 16 изображений размером 160 x 120 и выполнил улучшение для каждого блока отдельно в зависимости от яркости каждого блока, а затем соединил все эти блоки обратно, чтобы сформировать окончательное изображение.
Конечное выходное изображение будет выглядеть как 16 субизображений с разным контрастом и, следовательно, с блочной внешностью. Я предполагаю, что билинейная интерполяция должна решить эту проблему. Может ли кто-нибудь, пожалуйста, скажите мне, как сделать интерполяцию на этом изображении и исправить это. Я делал кодирование в matlab и opencv, поэтому любые коды также приветствуются.
Программа проверяет общую яркость изображения и соответственно увеличивает ее. Если изображение получено при ярком освещении, улучшение будет минимальным, тогда как, если изображение темное, будет сделано большее улучшение.
О том, как программа проверяет, является ли изображение ярким или нет, делается соответственно. Изображение делится на четверти и шестнадцатые, и выбирается эталон из 9 пикселей. Суммирование значений яркости этих пикселей дает общую яркость изображения. Более низкие значения для суммы указывают темное изображение и наоборот.
Я разделил изображение таким образом, чтобы при ярком освещении в темной среде область вокруг яркого света была минимальной или не улучшалась, тогда как темные области усиливались больше. Таким образом, конечный результат - это субизображения с разными контрастами.
Я думаю, что интерполяция сгладит края, которые сформированы между двумя подизображениями. Есть ли другой способ исправить окончательное изображение, чтобы оно выглядело более гладким?
Надеюсь, приведенное выше объяснение сделает его более понятным. Код, приведенный ниже, является грубым кодом, а не фактическим кодом, который я использую. Код просто показывает, как работает метод, и после того, как усовершенствование выполнено, выглядит изображение.
f=imread('3.jpg');
f=imresize(f,[480 640]);
figure(1);image(f);
f=rgb2ycbcr(f);
a=1;b=1;q=0;
f1=f(:,:,1);
for r=1:4
for c=1:4
sumterm = uint16(f1(30*r,40*c))+uint16(f1(30*r,80*c))+uint16(f1(30*r,120*c))+uint16(f1(60*r,40*c))+uint16(f1(60*r,80*c))+uint16(f1(60*r,120*c))+uint16(f1(90*r,40*c))+uint16(f1(90*r,80*c))+uint16(f1(90*r,120*c));
q=q+1;
for i=a:a+119
for j=b:b+159
if sumterm >=0 && sumterm <= 113
f1(i,j) =f1(i,j)*5;
elseif sumterm > 113 && sumterm <=226
f1(i,j) =f1(i,j)*5;
elseif sumterm >226 && sumterm <=339
f1(i,j) =f1(i,j)*4;
elseif sumterm >339 && sumterm <=452
f1(i,j) =f1(i,j)*3;
elseif sumterm >452 && sumterm <=565
f1(i,j) =f1(i,j)*2;
elseif sumterm >565 && sumterm <=678
f1(i,j) =f1(i,j)*1.8;
elseif sumterm >678 && sumterm <=791
f1(i,j) =f1(i,j)*1.6;
elseif sumterm >791 && sumterm <=904
f1(i,j) =f1(i,j)*1.4;
elseif sumterm >904 && sumterm <=1020
f1(i,j) =f1(i,j)*1.2;
else
f1(i,j) =f1(i,j)*1;
end
end
end
if(b<640-160)
b=j+1;
end
end
a=i+1;
b=1;
end
f(:,:,1)=f1;
f=ycbcr2rgb(f);
image(f);