正确显示扭曲图像

时间:2013-01-16 00:08:32

标签: c++ image-processing opencv distortion

我正在尝试在C ++和OpenCV中实现图像变形。我的代码如下:

Mat input = imread("Lena.jpg",CV_LOAD_IMAGE_GRAYSCALE);    
Mat out;
double xo, yo;
input.convertTo(input, CV_32FC1);
copyMakeBorder(input, input, 3, 3, 3, 3, 0);

int height = input.rows;
int width = input.cols;

out = Mat(height, width, input.type());


for(int j = 0; j < height; j++){
    for(int i =0; i < width; i++){
        xo = (8.0 * sin(2.0 * PI * j / 128.0));
        yo = (8.0 * sin(2.0 * PI * i / 128.0));
        out.at<float>(j,i) = (float)input.at<float>(((int)(j+yo+height)%height),((int)(i+xo+width)%width));

    }
}
normalize(out, out,0,255,NORM_MINMAX,CV_8UC1);

imshow("output", out);

这会产生以下图像: warped image

由于清晰可见,边界附近的值不为零。任何人都可以告诉我如何获得黑色边框,如下图所示,而不是我从我的代码中获得的工件?

required black border

只应考虑此图像的黑色边框,即图像应为波浪形(正弦曲线)但没有伪影。

...谢谢

1 个答案:

答案 0 :(得分:2)

下面:

    xo = (8.0 * sin(2.0 * PI * j / 128.0));
    yo = (8.0 * sin(2.0 * PI * i / 128.0));
    out.at<float>(j,i) = (float)input.at<float>(((int)(j+yo+height)%height),((int)(i+xo+width)%width));

您计算源像素的位置,但是您可以使用宽度/高度的mod来确保它位于图像中。这导致像素在边缘处缠绕。相反,您需要将图像外部的任何像素设置为黑色(或者,如果源图像具有黑色边框,则将其固定到边缘)。

由于你已经有了边框,你可以按下这样的坐标:

int ix = min(width-1, max(0, (int) (i + xo)));
int iy = min(height-1, max(0, (int) (j + yo)));
out.at<float>(j,i) = (float)input.at<float>(iy,ix);