## 图像缩放--双线性插值 原

t
tigerBin

（i，j）表示 destination 目标图片中的像素点， P(x0， y0) 表示 source源图像中的像素点

P(i, j)就是要求的像素点

1.首先，计算 水平压缩因子与垂直压缩因子，

``````double horFactor = srcWidth / dstWidth,

double verFactor = srcHeight / dstHeight``````

2. 计算 P(x0, y0)

``````double x0 = i * horFactor

double y0 = j * verFactor``````

3. 计算 Source中 距离P（x0, y0）最近的四个像素点的坐标（x1, y1), (x1, y2), (x2, y1), (x2, y2)

``````x1  =int(x0)
x2 = x1 + 1
y1 = int(y0)
y2 = y1 + 1``````

4.计算权值

5.利用公式求解 P（i，j）

6. Source Code

``````uint8_t  *Scale(uint8_t *src, int srcWidth, int srcHeight, int dstWidth, int dstHeight)
{
uint8_t *buf = new uint8_t[dstWidth * dstHeight * 3];

double horFactor = double(srcWidth) / dstWidth;  //水平缩放因子
double verFactor = double(srcHeight) / dstHeight; //垂直缩放因子

double w0, w1, w2, w3; // weight
int x1, y1, x2, y2; // (x1, y1), (x2, y2)
double fx1, fx2, fy1, fy2;

for (int i = 0; i < dstHeight; i++)
{
double x0 = i * verFactor;
x1 = int(i * verFactor);
x2 = x1 + 1;

fx1 = x2 - x0;
fx2 = x0 - x1;
for (int j = 0; j < dstWidth; j++)
{
double y0 = j * horFactor;
y1 = int(j * horFactor);
y2 = y1 + 1;

fy1 = y2 - y0;
fy2 = y0 - y1;

// 计算权值
w0 = fx1 * fy1;
w1 = fx1 * fy2;
w2 = fx2 * fy1;
w3 = fx2 * fy2;

int dstOffset = (i * dstWidth + j) * 3;
int srcOffset1 = (x1 * srcWidth + y1) * 3;
int srcOffset2 = (x2 * srcWidth + y1) * 3;

buf[dstOffset + 0] = w0 * src[srcOffset1] + w1 * src[srcOffset1 + 3] + w2 * src[srcOffset2] + w3 * src[srcOffset2 + 3];     //B
buf[dstOffset + 1] = w0 * src[srcOffset1+1] + w1 * src[srcOffset1 + 4] + w2 * src[srcOffset2+1] + w3 * src[srcOffset2 + 4]; //G
buf[dstOffset + 2] = w0 * src[srcOffset1+2] + w1 * src[srcOffset1 + 5] + w2 * src[srcOffset2+2] + w3 * src[srcOffset2 + 5]; //R
}
}

return buf;
}``````

``````int main(int argc, char *argv[])
{

JpegDecoder decoder("02.jpg");
auto &img = decoder.Decoder();

uint8_t *scale = Scale(img.Data, img.Width, img.Height, img.Width / 2, img.Height / 2);

cv::Mat src, dst;
src.create(img.Height, img.Width, CV_8UC3);
dst.create(img.Height / 2, img.Width / 2, CV_8UC3);

src.data = img.Data;
dst.data = scale;

cv::imshow("src", src);
cv::imshow("dst", dst);

cvWaitKey();
return 0;
}``````

t

### tigerBin

Resize 图像缩放是把原图像按照目标尺寸放大或者缩小，是图像处理的一种。 图像缩放有多种算法。最为简单的是最临近插值算法，它是根据原图像和目标图像的尺寸，计算缩放的比例，然后根据缩放...

fengzhizi715
2017/12/14
0
0
OpenCV尺寸调整函数resize

src：输入，原图像，即待改变大小的图像； dst：输出，改变大小之后的图像，这个图像和原图像具有相同的内容，只是大小和原图像不一样而已； dsize：输出图像的大小。如果这个参数不为0，那么...

OceanStar
2018/08/30
0
0
【图像处理】图像灰度级减少, 图像缩放（Reducing the Number of Gray Levels, Zooming and Shrinking）

u013165921
2018/01/14
0
0
5- OpenCV+TensorFlow 入门人工智能图像处理-图片的几何变换(一)

2018/04/19
0
0
【图像缩放】双立方（三次）卷积插值

2017/11/02
0
0

max佩恩

11
0
Redux 三大原则

1.单一数据源 在传统的MVC架构中，我们可以根据需要创建无数个Model，而Model之间可以互相监听、触发事件甚至循环或嵌套触发事件，这些在Redux中都是不被允许的。 因为在Redux的思想里，一个...

wenxingjun

7
0

4
0
XML

stars永恒

2
0
RabbitMQ学习（2）

1. 生产者客户端 void basicPublish(String exchange, String routingKey, boolean mandatory, boolean immediate, BasicProperties props, byte[] body) 1. 在生产者客户端发送消息时，首先......

4
0