正弦/余弦的图像失真

时间:2010-08-23 22:37:10

标签: image-processing trigonometry distortion

是否可以使用像正弦余弦这样的三角函数来扭曲图像,以使其呈现波浪状。

若然,怎么做。

PHP 首选语言,但它可以是任何语言...

3 个答案:

答案 0 :(得分:3)

是的,这是可能的。图像只是一个二维像素阵列,可以自由地重新组织它们。一种简单的方法是通过一些失真函数从原始图像创建新的图像和样本像素。

$original = read_image_pixels(); // using GD or some other way
for ($x = 0; $x < $width; $x++) {
  for ($y = 0; $y < $height; $y++) {
    // we are adding $height and taking modulo
    // to insure that $distorted_y is positive and less then $height.
    $distorted_y = ($y + round(10*sin($x/20)) + $height) % $height;

    $distorted[$x][$y] = $original[$x][$distorted_y];
  }
}

编辑:这可以进一步推广。许多熟悉的效果,如模糊和不锐化,都是卷积滤镜。他们在the GameDev article得到了很好的解释。我们可以将上述sin失真视为具有空间变量核(系数矩阵)的卷积滤波器。

答案 1 :(得分:3)

使用phadej的答案我得到了一个解决方案......

图片就是这样......

alt text

代码 -

<?php
    header("Content-type: image/png");
    $im = imagecreatefrompng('pic.png');
    $newim = imagecreatetruecolor(imagesx($im),imagesy($im));
    for ($x = 0; $x < imagesx($im); $x++) {
        for ($y = 0; $y < imagesy($im); $y++) {

        $rgba = imagecolorsforindex($im, imagecolorat($im, $x, $y));
        $col = imagecolorallocate($newim, $rgba["red"], $rgba["green"], $rgba["blue"]);


        $distorted_y = ($y + round(100*sin($x/50)) + imagesy($im)) % imagesy($im);
        imagesetpixel($newim, $x, $distorted_y, $col);
        }
    }

    imagepng($newim);
    ?>

输出

alt text

答案 2 :(得分:2)

这在很大程度上取决于图像的工作方式。我不会说PHP,所以这是一个通用的解决方案。

如果我们可以移动单个像素,那么概念上最简单的方法就是说

y old =像素的旧y位置
y new =像素的新y位置 x =像素的x位置 L =图像的长度,以像素为单位 N =要应用的三角周期数(即正弦波数)

然后我们只是遍历图像。对于x的每个值,我们移动y像素:

y new = y old *(1 + sin(N π x / L))/ 2