双边沿采样

很多图像处理算法,如立体视觉中的深度估计,图像上色,高动态范围HDR中的tone mapping,图像分割,都有一个共性的问题:寻找一个全局的解,这个解是指一个分段的piecewise平滑含糊,描述了感兴趣的值(可以是深度,色度,

很多图像处理算法,如立体视觉中的深度估计,图像上色,高动态范围HDR中的tone mapping,图像分割,都有一个共性的问题:寻找一个全局的解,这个解是指一个分段的piecewise平滑含糊,描述了感兴趣的值(可以是深度,色度,曝光值,标签等)。

另一方面,数字图像越来越大,从one quarter million到multi-Megapixel到Gigapixel,随着图像尺寸的变大,图像处理的耗时和占用空间也线性增长。一个处理方法就是对原始图像先进行下采样的预处理再进行图像处理,但这也带来一个问题,就是将处理之后的图像再恢复到原始的分辨率,这就是图像的超分辨率重建。很显然,我们可以利用原始的大尺寸图像。将原始的图像与双边滤波结合起来,就是本文新提出的算法JBU。

双边滤波bilateral filter是一个保边滤波edge-preserving filter,最早在1998年提出,为了解决传统的插值的图像上采样方法会造成边缘模糊。为了保留边缘,BF在不同位置的核参数应该是不一样的,所以BF属于非线性的滤波器,也是各向异性的滤波器。具体而言,滤波器会根据不同的空间位置和灰度变化范围进行调整,这也是“双边”的含义,一边是空域spatial filter(与中心点的距离远近),一边是与中心点的灰度差值大小range filter。从表达式上看,最终的滤波器系数的两个核的乘积。两个子核都可以是高斯函数,当灰度变化很大或者距离很远,那么滤波器系数就会很小,所以边缘就得以保留。

有人利用BF做HDR中的色调映射tone mapping,有人用来去马赛克,

那么如何将BF和大尺寸的guidance图像结合在一起呢?是使用灰度差异的子核还是使用空间距离的子核呢?为了利用更准确的边缘信息,是按照像素在大尺寸图像中对应的灰度值来计算滤波系数,因为边缘往往是灰度值跳变造成的,所以使用大图位置的灰度值更准确。和OpenCV做图像变换一样,这种像素坐标的映射关系也是从目标图像(这里是大图)到低分辨图像。

作为引导图的高分辨图像是离散采样的,所以超分重建的效果与上采样的比例无关。

4 应用

色调映射tone mapping是为了在普通设备中显示HDR图像。需要解很大的线性方程组,虽然可以通过multi-resolution solvers高效地解出,但是当数据很大时还是会占用相当大的内存。那么,JBF具体是怎么应用在HDR中的呢?首先,I是低分辨率的图像,T是某种tone mapping算子,那么T(I)就是这个算子生成的tone mapped图像。对应的低分辨率的解被定义为映射前后的像素级的比,也就是说,这个图其实是曝光图exposure map,表示应用在每个像素上的曝光校正系数。我们就是在这个图上使用JBF,因为这个图虽然大部分是平滑的,但是在具有显著边缘特性的区域会出现不连续。注意曝光图可能是单通道的(即只对亮度进行调节),也可能是多通道的(即支持多种色调的调节)。

在Levin的图像上色和图像重新着色的方法中也有类似的线性方程组,面对尺寸很大的图像同样有计算量大的问题。Yatziv的方法虽然不需要解线性方程组,但依然要迭代地遍历数据。在这里JBU的应用对象就是着色之后的低分辨率图像,但是在上采样之前,需要先将它转换至YIQ颜色空间(或者其他任意的将亮度与色度解耦的颜色空间),然后在每个色度通道上应用JBU。从图3中可以看到,JBU避免了在边缘区域的色度泄漏。

立体视觉深度估计。深度估计的关键是得到两幅图像中对应点的视差disparities。然而,估计出的深度图在边缘处是不连续的discontinuties。将高分辨率图像作为引导,就可以对低分辨率的深度图像进行上采样。

基于图分割Graph-cut的图像处理。近来出现的一些用户交互性的图像编辑技术涉及到了在图中寻找最小分割。比如交互性的蒙太奇照片系统,使用最小图分割技术来计算图像融合时的最小化接缝。优化的结果是一个标签图label map,label表明的是融合图是每个像素来自于哪个照片。约束条件是用户指定的几个图像,拼接算法做的是计算出label map,指定了剩余的没有被约束的像素来自于哪个图像,这样生成的图像其拼接感是最小的。这个标签图和之前的几个应用的区别在于标签是离散的,做法是这样的,为了得到每个像素的标签,对每个低分辨率的像素会有一个带非零权重的投票,获胜的标签会有累积最高的权重。

5 表现和准确性

JBU的复杂度是O(Nr2),N是输出图像的尺寸,r是滤波器的尺寸。表现与输出尺寸有关,但是与上采样因子无关,因为滤波器始终应用在低分辨率图像上。所有的结果都使用5x5的高斯滤波,速度快,同时可以将足够距离的像素值考虑进去。

function result = JointBilateralUpsample(color,depth,factor,sigma_w,sigma_c,w)
if( size(color,3) ~= 3 ),
    error( 'color data must be of 3 channel' );
end

depth = double(depth);
color = double(color);
highHeight = size( color, 1 );
highWidth  = size( color, 2 );
lowHeight = size(depth,1);
lowWidth = size(depth,2);
result = zeros(highHeight,highWidth);
for i = 1:highHeight
    for j = 1:highWidth
        id = i/factor;
        jd = j/factor;
        iMin = ceil(max(id-w,1));
        iMax = floor(min(id+w,lowHeight));
        jMin = ceil(max(jd-w,1));
        jMax = floor(min(jd+w,lowWidth));
        
        depth_sec = depth(iMin:iMax,jMin:jMax);
        color_sec = color(iMin * factor:factor:iMax * factor,jMin * factor:factor:jMax * factor,:);
        
        % Compute Gaussian range weights.
        dR = color_sec(:,:,1)-color(i,j,1);
        dG = color_sec(:,:,2)-color(i,j,2);
        dB = color_sec(:,:,3)-color(i,j,3);
        range = exp( -(dR.^2 + dG.^2 + dB.^2) / (2*sigma_c^2));
        % Calculate bilateral filter response.
        iw = (iMin:iMax) - id;
        jw = (jMin:jMax) - jd;
        [mx,my] = meshgrid(jw,iw);
        spatial = exp( -(mx.^2 + my.^2) / (2*sigma_w^2) );
        depth_weight = (depth_sec>0) .* range .* spatial;
        depth_sum = depth_sec .* depth_weight;
        result(i,j) = sum(depth_sum(:)) / sum(depth_weight(:));
     end
   end
 end

对于彩色三通道图像,可以分别在RGB中进行上采样,但是可能造成颜色泄漏,通常的做法是先进行颜色空间转换。原文使用使用的是YIQ,但其实只要是亮度分离的颜色空间都可以。YIQ是电视系统中使用的颜色空间,对应美国和日本的NTSC制式,在matlab中rgb到YIQ的转换函数是rgb2ntsc.首先YUV和YIQ三通道都是独立的,所以使得黑白电视机也可以接收彩色电视信号。另外,黑白图像主要提供细节,所以颜色通道的带宽可以适当压缩。

Reference:

1.http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html

2.https://zhuanlan.zhihu.com/p/21983679 

3.https://www.jianshu.com/p/ce4afe599d6a

4.https://blog.csdn.net/CHNguoshiwushuang/article/details/82469162?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param

5.https://www.cnblogs.com/magic-428/p/9172406.html

6.ntsc2rgbhttps://www.mathworks.com/help/images/ref/ntsc2rgb.html

 

知秋君
上一篇 2024-08-31 17:02
下一篇 2024-08-31 16:36

相关推荐