---
title: fft_upsampling
description: "对图像进行相位调整和插值，以实现上采样，即放大图像。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/251RC1/accel/kunpengaccel_kpcv_06_0024.html
sourcePath: /source/zh/kunpengboostkithistory/251RC1/accel/kunpengaccel_kpcv_06_0024.html
indexId: a609913c11fcba69d4dff7ef421effca7e507b8ab31653ae98cabda00afcb98277
---
# fft_upsampling

#### 函数功能

对图像进行相位调整和插值，以实现上采样，即放大图像。

1. 将原始图片矩阵经过FFT转变成频域上的信息矩阵。
2. 将频域矩阵按照shift进行相位的调整。
3. 对频域矩阵进行周期性的填充（高频补0），补充至目标矩阵大小。
4. 经过iFFT将频域矩阵转换回空域矩阵，完成图像插值。


#### 函数接口

```
int kcv_FFTUpsampling_acc(double *_src, double *_dst, size_t src_rows, size_t src_cols, size_t dst_rows, size_t dst_cols, double shift_x, double shift_y)
```


#### 参数

| 参数名 | 描述 | 取值范围 | 输入/输出 |
| --- | --- | --- | --- |
| \_src | 输入图像。 | 非空且申请内存大小为src\_rows\*src\_cols\*sizeof(double) | 输入 |
| \_dst | 插值后的输出图像。 | 非空且申请内存大小为dst\_rows\*dst\_cols\*sizeof(double) | 输出 |
| src\_rows | 输入图像行数。 | (0, 16384] | 输入 |
| src\_cols | 输入图像列数。 | (0, 16384] | 输入 |
| dst\_rows | 输出图像行数。 | [src\_rows, 16384] | 输出 |
| dst\_cols | 输出图像列数。 | [src\_cols, 16384] | 输出 |
| shift\_x | x方向偏移量，输出图像原点相比于输入图像。 | (\-inf, inf) | 输出 |
| shift\_y | y方向偏移量，输出图像原点相比于输入图像。 | (\-inf, inf) | 输出 |


#### 返回值

- 成功：返回LITHO_IMG_STS_NO_ERR。
- 失败：返回错误码。


#### 错误码

| 错误码 | 描述 |
| --- | --- |
| LITHO\_IMG\_STS\_NULL\_PTR\_ERR | 参数“\_src”或“\_dst”存在空指针。 |
| LITHO\_IMG\_STS\_SIZE\_ERR | 参数“src\_rows”或“src\_cols”值等于0。 参数“dst\_rows”值小于“src\_rows”，或“dst\_cols”值小于“src\_cols”。 |
| LITHO\_IMG\_STS\_FFT\_ERR | FFT plan创建失败。 |


#### 示例

```
#include <stdio.h>
#include <stdlib.h>
#include <complex.h>
#include "kp_litho_img.h"

int main() {
    // 定义输入图像的尺寸和目标尺寸
    size_t src_rows = 5;
    size_t src_cols = 5;
    size_t dst_rows = 10;
    size_t dst_cols = 10;
    // 定义输入图像和输出图像的指针
    double *src = (double *)malloc(src_rows * src_cols * sizeof(double));
    double *dst = (double *)malloc(dst_rows * dst_cols * sizeof(double));
    // 初始化输入图像（这里使用一个简单的5x5图像）
    double src_data[5][5] = {
        {0, 0, 0, 0, 0},
        {0, 1, 1, 1, 0},
        {0, 1, 0, 1, 0},
        {0, 1, 1, 1, 0},
        {0, 0, 0, 0, 0}
    };
    for (size_t i = 0; i < src_rows; i++) {
        for (size_t j = 0; j < src_cols; j++) {
            src[i * src_cols + j] = src_data[i][j];
        }
    }
    // 定义相位调整参数
    double shift_x = 0.5;
    double shift_y = 0.5;
    // 调用kcv_FFTUpsampling_acc函数进行上采样
    cv::kcv_FFTUpsampling_acc(src, dst, src_rows, src_cols, dst_rows, dst_cols, shift_x, shift_y);
    // 打印结果（这里只打印部分结果）
    printf("Upsampled Image:\n");
    for (size_t i = 0; i < dst_rows; i++) {
        for (size_t j = 0; j < dst_cols; j++) {
            printf("%.2f ", dst[i * dst_cols + j]);
            if (j == dst_cols - 1) {
                printf("\n");
            }
        }
    }
    // 释放内存
    free(src);
    free(dst);
    return 0;
}
```

运行结果：

```
Upsampled Image:
0.02 0.05 0.09 0.11 0.11 0.09 0.05 0.02 -0.01 -0.01 
0.05 0.17 0.24 0.26 0.26 0.24 0.17 0.05 -0.04 -0.04 
0.09 0.24 0.25 0.20 0.20 0.25 0.24 0.09 -0.07 -0.07 
0.11 0.26 0.20 0.05 0.05 0.20 0.26 0.11 -0.09 -0.09 
0.11 0.26 0.20 0.05 0.05 0.20 0.26 0.11 -0.09 -0.09 
0.09 0.24 0.25 0.20 0.20 0.25 0.24 0.09 -0.07 -0.07 
0.05 0.17 0.24 0.26 0.26 0.24 0.17 0.05 -0.04 -0.04 
0.02 0.05 0.09 0.11 0.11 0.09 0.05 0.02 -0.01 -0.01 
-0.01 -0.04 -0.07 -0.09 -0.09 -0.07 -0.04 -0.01 0.01 0.01 
-0.01 -0.04 -0.07 -0.09 -0.09 -0.07 -0.04 -0.01 0.01 0.01
```
