【第2章>第2节】基于FPGA的图像双线性插值实现——理论分析与MATLAB仿真

目录

1.一维时间序列线性插值

2.二维图像双线性插值


1.一维时间序列线性插值

线性插值的核心思想:在两个已知点之间,用直线拟合未知点的函数值。

如上图所示,令y=f(x),设一维坐标轴上有两个已知点:(xi-1,yi-1)和(xi,yi),待求点x位于区间[xi-1​,xi​] 内,其对应的函数值y可以表示为。

y=yi-1+(yi-yi-1)/(xi-xi-1)*(x-xi-1)

这个部分对应的matlab程序如下:

clear; clc; close all;

%% ==================== 1. 构造已知原始点(样本点) ====================

x_known = [1:100]; % 已知点x坐标

y_known = sin(2*pi*x_known/100); % 已知点y值(可任意修改)

N_known = length(x_known); % 已知点数量

%% ==================== 2. 生成需要插值的目标点 ====================

% 生成密集x坐标,用于插值(比原始点更密)

x_min = min(x_known);

x_max = max(x_known);

x_interp = linspace(x_min, x_max, 9); % 插值目标点(100个点)

N_interp = length(x_interp);

% 初始化插值结果

y_interp = zeros(1, N_interp);

%% ==================== 3. 一维线性插值核心算法(纯公式实现) ====================

for k = 1:N_interp

x = x_interp(k); % 当前待插值点

% ========== 步骤1:找到x落在哪个已知区间 [x_known(i), x_known(i+1)] ==========

i = 1;

while i < N_known && x > x_known(i+1)

i = i + 1;

end

% 区间两个端点

x0 = x_known(i);

y0 = y_known(i);

x1 = x_known(i+1);

y1 = y_known(i+1);

% ========== 步骤2:计算归一化插值系数 α ==========

dx = x1 - x0;

if dx == 0

alpha = 0; % 避免除零

else

alpha = (x - x0) / dx;

end

% ========== 步骤3:线性插值公式(加权形式) ==========

y = (1 - alpha) * y0 + alpha * y1;

% 保存结果

y_interp(k) = y;

end

%% ==================== 4. 结果可视化 ====================

figure('Name','一维线性插值结果');

plot(x_known, y_known, 'r', 'LineWidth', 2, 'MarkerSize', 8); % 已知点

hold on;

plot(x_interp, y_interp, 'b-o', 'LineWidth', 1.5); % 插值曲线

legend('已知离散点','一维线性插值结果','Location','best');

xlabel('X 轴');

ylabel('Y 轴');

grid on; grid minor;

其对应的仿真结果如下图所示:

2.二维图像双线性插值

双线性插值本质:在二维平面上,分三步执行一维线性插值------ 先对行方向插值,再对列方向插值,最终得到未知点的灰度值。其原理如下图所示:

其中,(x0, y0)、(x0, y1)、(x1, y0)、(x1, y1) 均为原图像上的像素坐标点,灰度值分别对应为f(x0, y0)、f(x0, y1)、f(x1, y0)、f(x1, y1)。而灰度值未知的插值点(x, y),根据双线性插值法的约束,可以先由像素坐标点(x0, y0)和(x0, y1) 在y轴向作一维线性插值得到f(x0, y)、由像素坐标点(x1, y0)和(x1, y1)在y轴向作一维线性插值得到 f(x1, y),然后再由(x0, y)和(x1, y)在x轴向作一维线性插值得到插值点(x, y)的灰度值f(x, y)。

这个部分对应的matlab程序如下:

clear; clc; close all;

%读取图像

img = rgb2gray(imresize(imread('1.jpg'),[256,256])); % 替换为你的图像路径

H, W, C\] = size(img); % H=高 W=宽 C=通道数 %设置目标尺寸(放大2倍) scale = 2; H_new = round(H \* scale); W_new = round(W \* scale); % 新建空白目标图 img_out = zeros(H_new, W_new, C, 'uint8'); %3. 双线性插值核心(逐像素计算) for ch = 1:C for x = 1:H_new for y = 1:W_new % ====================== % 反向映射:目标坐标 → 原图坐标 % ====================== u = (x - 1) \* H / H_new + 1; v = (y - 1) \* W / W_new + 1; % ====================== % 找到四个最近邻点 % ====================== i = floor(u); j = floor(v); i1 = i + 1; j1 = j + 1; % ====================== % 边界检查(防止越界) % ====================== i = max(i, 1); i1 = min(i1, H); j = max(j, 1); j1 = min(j1, W); % ====================== % 取四个点的像素值 % ====================== f11 = double(img(i, j, ch)); f12 = double(img(i, j1, ch)); f21 = double(img(i1, j, ch)); f22 = double(img(i1, j1, ch)); % ====================== % 双线性插值公式 % ====================== a = u - i; % 垂直方向权重 b = v - j; % 水平方向权重 value = (1 - a) \* (1 - b) \* f11 + (1 - a) \* b \* f12 + a \* (1 - b) \* f21 + a \* b \* f22; % 赋值 img_out(x, y, ch) = uint8(value); end end end imshow(img); title('原始图像'); figure; imshow(img_out); title('双线性插值结果');

仿真结果如下图所示:

我们打开上述两个图像的变量名称,以图像中心区域为例,线性插值效果如下:

如上图所示,像素75,44之间,通过插值,多了一个60的像素值。

相关推荐
xrgs_shz14 小时前
直方图法、最大类间方差法、迭代法和自适应阈值法的图像分割的基本原理和MATLAB实现
人工智能·计算机视觉·matlab
hoiii18714 小时前
CSTR反应器模型的Simulink-PID仿真(MATLAB实现)
开发语言·matlab
Evand J17 小时前
【MATLAB例程】基于低精度IMU、GNSS的UAV初始航向(三维角度)校准的仿真,包含卡尔曼滤波、惯导解算与校正
开发语言·matlab·gnss·imu·卡尔曼滤波
简简单单做算法18 小时前
基于CNN卷积神经网络的数据预测matlab仿真,对比BP,RBF,LSTM
matlab·cnn·卷积神经网络·lstm·数据预测
yu85939581 天前
时延估计的互相关算法(MATLAB实现)
开发语言·算法·matlab
强盛机器学习~1 天前
考虑异常天气和太阳辐射下基于强化学习的无人机三维路径规划
算法·matlab·无人机·强化学习·路径规划·无人机路径规划·q-learning
Matlab光学1 天前
Matlab 复现:分数阶&整数阶OAM 变换
算法·matlab·拓扑学
机器学习之心1 天前
ICEEMDAN-CMBE特征提取+Bayes-TCN-LSTM故障诊断+SHAP可解释分析!MATLAB完整代码
matlab·lstm
强盛机器学习~1 天前
2026年SCI一区新算法-贝塞尔曲线优化算法(BCO)-公式原理详解与性能测评 Matlab代码免费获取
算法·matlab·进化计算·智能优化算法·元启发式算法·群体智能算法