C++ 基于三次插值的正弦图像失真

C++ 基于三次插值的正弦图像失真,c++,opencv,image-processing,distortion,C++,Opencv,Image Processing,Distortion,我试图在y轴上做一个正弦/余弦的失真,用下一个代码进行三次插值,我保持新图像和旧图像的大小相同。结果看起来不太好。我只在y轴上做插值。我是在这个基础上计算的 } 原始照片 双线性插值 三次插值 谢谢,问题解决了 Mat cubic(Mat old, int freq){ int height = old.size().height; int width = old.size().width; int p0,p1,p2,p3; int Bp0,Bp1,Bp2,Bp3; int Gp0,Gp1

我试图在y轴上做一个正弦/余弦的失真,用下一个代码进行三次插值,我保持新图像和旧图像的大小相同。结果看起来不太好。我只在y轴上做插值。我是在这个基础上计算的

} 原始照片

双线性插值

三次插值

谢谢,问题解决了

Mat cubic(Mat old, int freq){
int height = old.size().height;
int width = old.size().width;
int p0,p1,p2,p3;
int Bp0,Bp1,Bp2,Bp3;
int Gp0,Gp1,Gp2,Gp3;
int Rp0,Rp1,Rp2,Rp3;
double B,G,R;

double fi,fj;
Mat res(height,width,CV_8UC3,cv::Scalar(100));
for (int i = 0; i < width; i++) {
    for (int j = 0; j < height; j++) {
        fi = i;
        fj = (j - (((height/30)*(sin((M_PI*i)/(freq/2)))))) + sqrt(height) ;
        //Get the indexes of the for neighbors 
         if(fj > 20 &  fj < height){
        p1 = floor(fj);
        p2 = ceil(fj);
        p0 = p1-1;
        p3 = p2+1;
        //get the color values
        Vec3b p0Color = old.at<Vec3b>(Point(floor(fi),p0));
        Vec3b p1Color = old.at<Vec3b>(Point(floor(fi),p1)); 
        Vec3b p2Color = old.at<Vec3b>(Point(floor(fi),p2)); 
        Vec3b p3Color = old.at<Vec3b>(Point(floor(fi),p3));
        if(i == 258 && j==59){
        }
        Bp0 = p0Color.val[0]; Bp1 = p1Color.val[0]; Bp2 = p2Color.val[0]; Bp3 = p3Color.val[0]; 
        Gp0 = p0Color.val[1]; Gp1 = p1Color.val[1]; Gp2 = p2Color.val[1]; Gp3 = p3Color.val[1]; 
        Rp0 = p0Color.val[2]; Rp1 = p1Color.val[2]; Rp2 = p2Color.val[2]; Rp3 = p3Color.val[2];

       //Normalize the fj
       fj = (fj - floor(fj));

        B= Bp1 + 0.5 * fj*(Bp2 - Bp0 + fj*(2.0*Bp0 - 5.0*Bp1 + 4.0*Bp2 - Bp3 + fj*(3.0*(Bp1 - Bp2) + Bp3 - Bp0)));
        G= Gp1 + 0.5 * fj*(Gp2 - Gp0 + fj*(2.0*Gp0 - 5.0*Gp1 + 4.0*Gp2 - Gp3 + fj*(3.0*(Gp1 - Gp2) + Gp3 - Gp0)));   
        R= Rp1 + 0.5 * fj*(Rp2 - Rp0 + fj*(2.0*Rp0 - 5.0*Rp1 + 4.0*Rp2 - Rp3 + fj*(3.0*(Rp1 - Rp2) + Rp3 - Rp0)));

        if(B > 255)
            B=255;
        if(G>255)
            G=255;
        if(R>255)
            R=255;
        if(B < 0)
            B=0;
        if(G<0)
            G=0;
        if(R<0)
            R=0;
        Vec3b finalColor(B,G,R);
        res.at<Vec3b>(j,i) = finalColor;
    }   
    }
}
namedWindow( "cubic", CV_WINDOW_AUTOSIZE );
imshow( "cubic", res); 
return res;
}

在将fj放入最终的立方函数之前,我忘记了对其进行规格化

新的结果是:


可能是整数溢出?的确,在段的边缘有整数溢出。我不知道怎么解决它。也许会改变一些因素的量化范围?您可以在计算之前将每个像素除以2或某个常数,然后将所有像素再次乘以2。
Mat cubic(Mat old, int freq){
int height = old.size().height;
int width = old.size().width;
int p0,p1,p2,p3;
int Bp0,Bp1,Bp2,Bp3;
int Gp0,Gp1,Gp2,Gp3;
int Rp0,Rp1,Rp2,Rp3;
double B,G,R;

double fi,fj;
Mat res(height,width,CV_8UC3,cv::Scalar(100));
for (int i = 0; i < width; i++) {
    for (int j = 0; j < height; j++) {
        fi = i;
        fj = (j - (((height/30)*(sin((M_PI*i)/(freq/2)))))) + sqrt(height) ;
        //Get the indexes of the for neighbors 
         if(fj > 20 &  fj < height){
        p1 = floor(fj);
        p2 = ceil(fj);
        p0 = p1-1;
        p3 = p2+1;
        //get the color values
        Vec3b p0Color = old.at<Vec3b>(Point(floor(fi),p0));
        Vec3b p1Color = old.at<Vec3b>(Point(floor(fi),p1)); 
        Vec3b p2Color = old.at<Vec3b>(Point(floor(fi),p2)); 
        Vec3b p3Color = old.at<Vec3b>(Point(floor(fi),p3));
        if(i == 258 && j==59){
        }
        Bp0 = p0Color.val[0]; Bp1 = p1Color.val[0]; Bp2 = p2Color.val[0]; Bp3 = p3Color.val[0]; 
        Gp0 = p0Color.val[1]; Gp1 = p1Color.val[1]; Gp2 = p2Color.val[1]; Gp3 = p3Color.val[1]; 
        Rp0 = p0Color.val[2]; Rp1 = p1Color.val[2]; Rp2 = p2Color.val[2]; Rp3 = p3Color.val[2];

       //Normalize the fj
       fj = (fj - floor(fj));

        B= Bp1 + 0.5 * fj*(Bp2 - Bp0 + fj*(2.0*Bp0 - 5.0*Bp1 + 4.0*Bp2 - Bp3 + fj*(3.0*(Bp1 - Bp2) + Bp3 - Bp0)));
        G= Gp1 + 0.5 * fj*(Gp2 - Gp0 + fj*(2.0*Gp0 - 5.0*Gp1 + 4.0*Gp2 - Gp3 + fj*(3.0*(Gp1 - Gp2) + Gp3 - Gp0)));   
        R= Rp1 + 0.5 * fj*(Rp2 - Rp0 + fj*(2.0*Rp0 - 5.0*Rp1 + 4.0*Rp2 - Rp3 + fj*(3.0*(Rp1 - Rp2) + Rp3 - Rp0)));

        if(B > 255)
            B=255;
        if(G>255)
            G=255;
        if(R>255)
            R=255;
        if(B < 0)
            B=0;
        if(G<0)
            G=0;
        if(R<0)
            R=0;
        Vec3b finalColor(B,G,R);
        res.at<Vec3b>(j,i) = finalColor;
    }   
    }
}
namedWindow( "cubic", CV_WINDOW_AUTOSIZE );
imshow( "cubic", res); 
return res;