图像中子图像的双线性插值

时间:2011-10-11 06:38:58

标签: matlab opencv interpolation

我正在做一种增强暗淡照明图像的图像增强技术。我将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);

1 个答案:

答案 0 :(得分:0)

您考虑过histogram equalization contrast stretch吗?


由于我们讨论的是平滑,因此中值滤波器可能是您最好的选择。看看Wikipedia中的输出。另外,请查看Gaussian Blur