如何实现该图所示的鱼眼镜头效果:

可以使用Google的徽标进行尝试:

顺便说一句,它的用语是什么?

最佳答案

我相信通常将其称为“鱼眼镜头”效果或“镜筒变换”。这是我找到的演示的两个链接:

  • Sample code,说明如何使用 'custom' 中的功能Image Processing Toolboxmaketform选项将鱼眼失真应用于图像。
  • An image processing demo使用功能 tformarray 执行桶形转换。

  • 例子

    在此示例中,我从first link above中的函数radial.m开始,并修改了它在输入和输出空间之间关联点的方式以创建漂亮的圆形图像。下面提供了新功能fisheye_inverse,应将其放在MATLAB path上的文件夹中,以便稍后在本示例中使用它:
    function U = fisheye_inverse(X, T)
    
      imageSize = T.tdata(1:2);
      exponent = T.tdata(3);
      origin = (imageSize+1)./2;
      scale = imageSize./2;
    
      x = (X(:, 1)-origin(1))/scale(1);
      y = (X(:, 2)-origin(2))/scale(2);
      R = sqrt(x.^2+y.^2);
      theta = atan2(y, x);
    
      cornerScale = min(abs(1./sin(theta)), abs(1./cos(theta)));
      cornerScale(R < 1) = 1;
      R = cornerScale.*R.^exponent;
    
      x = scale(1).*R.*cos(theta)+origin(1);
      y = scale(2).*R.*sin(theta)+origin(2);
      U = [x y];
    
    end
    

    鱼眼失真在应用于正方形图像时看起来最好,因此您将需要通过裁剪或用某种颜色填充来使图像成为正方形。由于indexed images的图像转换看起来不正确,因此您还希望使用RGB images将所有索引图像转换为 ind2rgb Grayscalebinary images也可以正常工作。这是您的示例Google logo的操作方法:
    [X, map] = imread('logo1w.png');  % Read the indexed image
    rgbImage = ind2rgb(X, map);       % Convert to an RGB image
    [r, c, d] = size(rgbImage);       % Get the image dimensions
    nPad = (c-r)/2;                   % The number of padding rows
    rgbImage = cat(1, ones(nPad, c, 3), rgbImage, ones(nPad, c, 3));  % Pad with white
    

    现在,我们可以使用 maketform 创建转换,并使用 imtransform (或在较新版本中建议使用 imwarp )应用该转换:
    options = [c c 3];  % An array containing the columns, rows, and exponent
    tf = maketform('custom', 2, 2, [], ...  % Make the transformation structure
                   @fisheye_inverse, options);
    newImage = imtransform(rgbImage, tf);   % Transform the image
    imshow(newImage);                       % Display the image
    

    这是您应该看到的图像:

    matlab - 如何在MATLAB中实现鱼眼镜头效果(镜筒变换)?-LMLPHP

    您可以通过更改options数组中的第三个值来调整失真度,该值是在图像点的径向变形中使用的指数幂。

    关于matlab - 如何在MATLAB中实现鱼眼镜头效果(镜筒变换)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2589851/

    10-12 20:37