【发布时间】:2015-06-03 03:37:11
【问题描述】:
我正在尝试使用下一个代码使用双线性插值对正弦/余弦进行失真,我保持新图像与旧图像的大小相同。而且结果看起来不太好。
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;
}
最近邻插值的结果更好,有人知道为什么吗?
谢谢
【问题讨论】:
-
张贴图片以供输入和输出(如果适用),请
-
我不能,因为我是 stackoverflaw 的新手,而且我的声誉还不够高。
-
一件事:
R1 = color1.val[0]可能不是读取颜色而是蓝色,但是由于您在Vec3b finalColor(R,G,B);中再次出现同样的错误,所以应该没问题。 -
现在做。它没有改变它。
标签: c++ opencv image-processing distortion