C++ 带双线性插值的正弦图像失真c++;

C++ 带双线性插值的正弦图像失真c++;,c++,opencv,image-processing,distortion,C++,Opencv,Image Processing,Distortion,我尝试用正弦/余弦和双线性插值来做失真,下一个代码,我保持新图像和旧图像的大小相同。结果看起来不太好 Mat biliniar(Mat old, int freq){ namedWindow( "car2", CV_WINDOW_AUTOSIZE ); imshow( "car2", old); int height = old.size().height; int width = old.size().width; unsigned char R1,R2,R3,R4; // Col

我尝试用正弦/余弦和双线性插值来做失真,下一个代码,我保持新图像和旧图像的大小相同。结果看起来不太好

Mat biliniar(Mat old, int freq){
namedWindow( "car2", CV_WINDOW_AUTOSIZE );
imshow( "car2", old); 
int height = old.size().height;
int width = old.size().width;

unsigned char R1,R2,R3,R4;     // Colours at the four neighbours
unsigned char G1,G2,G3,G4;
unsigned char B1,B2,B3,B4;
double RT1, GT1, BT1;          // Interpolated colours at T1 and T2
double RT2, GT2, BT2;
unsigned char R,G,B;           // Final colour at a destination pixel
unsigned char *dst;            // Destination image - must be allocated here! 
int x,y;               // Coordinates on destination image
double fi,fj;              // Corresponding coordinates on source image

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) ; 
        //cout << fj << " ";
        if(fj > 0 &  fj < height){
            //cout << " p1: x:" << floor(fi) << " y:" << floor(fj);
            //cout << " p2: x:" << ceil(fi) << " y:" << floor(fj);
            //cout << " p3: x:" << floor(fi) << " y:" << ceil(fj);
            //cout << " p4: x:" << ceil(fi) << " y:" << ceil(fj);
            Vec3b color1 = old.at<Vec3b>(Point(floor(fi)-1,floor(fj)));
            R1 = color1.val[0]; G1 = color1.val[1]; B1 = color1.val[2];
            Vec3b color2 = old.at<Vec3b>(Point(ceil(fi)+1,floor(fj)));
            R2 = color2.val[0]; G2 = color2.val[1]; B2 = color2.val[2];
            Vec3b color3 = old.at<Vec3b>(Point(floor(fi)-1,ceil(fj)));
            R3 = color3.val[0]; G3 = color3.val[1]; B3 = color3.val[2];
            Vec3b color4 = old.at<Vec3b>(Point(ceil(fi)+1,ceil(fj)));
            R4 = color4.val[0]; G4 = color4.val[1]; B4 = color4.val[2];
            RT1 = (R1+R2)/2; GT1 = (G1+G2)/2; BT1 = (B1+B2)/2;
            RT2 = (R3+R4)/2; GT2 = (G3+G4)/2; BT2 = (B3+B4)/2;
            R=(unsigned char)(RT1+RT2);
            G=(unsigned char)(GT1+GT2);
            B=(unsigned char)(BT1+BT2);
            Vec3b finalColor(R,G,B);
            res.at<Vec3b>(j,i) = finalColor;
        }
    }
}
namedWindow( "bilinear", CV_WINDOW_AUTOSIZE );
imshow( "bilinear", res); 
return res;
Mat biliniar(Mat old,int freq){
namedWindow(“car2”,CV\u窗口\u自动调整大小);
imshow(“car2”,旧);
int height=old.size().height;
int width=old.size().width;
无符号字符R1、R2、R3、R4;//四个相邻字符的颜色
无符号字符G1、G2、G3、G4;
无符号字符B1、B2、B3、B4;
双RT1、GT1、BT1;//T1和T2处的插值颜色
双RT2,GT2,BT2;
无符号字符R,G,B;//目标像素处的最终颜色
unsigned char*dst;//必须在此处分配目标映像!
int x,y;//目标图像上的坐标
双fi,fj;//源图像上对应的坐标
材料(高度、宽度、CV_8UC3、CV::标量(100));
对于(int i=0;i//cout在代码中实际上没有做任何双线性插值,只是将所有四个像素相加

您需要计算fi和fj的分数部分,并使用它们执行插值,例如:

double fi_part = fi - floor(fi);
double fj_part = fj - floor(fj);

// perform interpolation in i direction:
RT1 = (R1*(1.0-fi_part)) + (R2*fi_part);
GT1 = (G1*(1.0-fi_part)) + (G2*fi_part);
BT1 = (B1*(1.0-fi_part)) + (B2*fi_part);
RT2 = (R3*(1.0-fi_part)) + (R4*fi_part);
GT2 = (G3*(1.0-fi_part)) + (G4*fi_part);
BT2 = (B3*(1.0-fi_part)) + (B4*fi_part);

// perform interpolation in j direction:
R=(unsigned char)(RT1*(1.0-fj_part)+RT2*fj_part);
G=(unsigned char)(GT1*(1.0-fj_part)+GT2*fj_part);
B=(unsigned char)(BT1*(1.0-fj_part)+BT2*fj_part);

Vec3b finalColor(R,G,B);
res.at<Vec3b>(j,i) = finalColor;
double fi_part=fi-楼层(fi);
双fj_零件=fj-地板(fj);
//在i方向执行插值:
RT1=(R1*(1.0-fi_部分))+(R2*fi_部分);
GT1=(G1*(1.0-fi_部分))+(G2*fi_部分);
BT1=(B1*(1.0-fi_部分))+(B2*fi_部分);
RT2=(R3*(1.0-fi_部分))+(R4*fi_部分);
GT2=(G3*(1.0-fi_零件))+(G4*fi_零件);
BT2=(B3*(1.0-fi_部分))+(B4*fi_部分);
//在j方向执行插值:
R=(无符号字符)(RT1*(1.0-fj_部分)+RT2*fj_部分);
G=(无符号字符)(GT1*(1.0-fj_部分)+GT2*fj_部分);
B=(无符号字符)(BT1*(1.0-fj_部分)+BT2*fj_部分);
Vec3b最终颜色(R、G、B);
res.at(j,i)=最终颜色;
因此,当你移动一个texel时,fi_部分从0.0增加到1.0,R1、G1、B1越来越少,R2、G2、B2越来越多,这将有助于RT1、GT1、BT1。同样,对于RT2等,也同样适用于涉及fj_部分的计算


代码的速度可以提高很多,但希望您能了解基本的想法。

请发布输入和输出的图像(如果适用),因为我是StackOverlaw的新手,声誉不够高。有一件事:R1=color1.val[0]
可能不是读取颜色,而是蓝色,但由于在
Vec3b finalColor(R,G,B)中再次出现相同的错误;
应该没有问题。现在执行了。它没有更改。