- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试使用下一个代码通过双线性插值对正弦/余弦进行失真,我将新图像的大小保持为与旧图像相同。结果看起来不太好。
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;
最近邻插值的结果好得多,有人知道为什么吗?
谢谢
最佳答案
您实际上并没有在该代码中进行任何双线性插值,您只是将所有四个像素加在一起。
您需要计算 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;
因此,当您在一个纹素上移动时,fi_part 从 0.0 增加到 1.0,越来越少的 R1、G1、B1 和越来越多的 R2、G2、B2 将对 RT1、GT1、BT1 产生影响。对于 RT2 等也是如此,对于涉及 fj_part 的计算也是如此。
代码在速度方面可以改进很多,但希望你能理解基本的想法。
关于c++ - 双线性插值正弦图像失真 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29340828/
我写的函数有问题。想法是使用 taylor 展开而不是 js 数学对象来计算 sin 和 cosin 值(在 radians 上运行) .这些是方程式: sin(x) = (x^1)/1! - (x^
我不知道这是编程还是数学问题,但我整理了一些FFT的简短示例。我加载了440hz的波并在顶部添加了一些正弦波,但是由于某种原因,频谱中存在一个我不理解的“波”。 据我了解,频谱应该具有相同的| Y(f
这个问题在这里已经有了答案: Java Math.cos(Math.toRadians()) returns weird values (4 个答案) 关闭 10 年前。 我正在编写一个程序,我必须
我想在 ios4 中实现一个正弦和余弦计算器: if([operation isEqual:@"sin"]){ operand = (operand*M_PI/180.0); oper
我使用 256 个元素为 VHDL 制作了一个正弦 LUT。 我使用 MIDI 输入,因此值范围为 8.17Hz(注 #0)到 12543.85z(注 #127)。 我有另一个 LUT 计算必须发送到
我想在ios4中实现一个正弦和余弦计算器: if([operation isEqual:@"sin"]){ operand = (operand*M_PI/180.0); operan
我是一名优秀的程序员,十分优秀!