【第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的像素值。

相关推荐
2zcode15 小时前
免费开源项目文档:基于MATLAB图像处理的啤酒瓶口缺陷检测系统设计与实现
开发语言·图像处理·matlab
gihigo199819 小时前
FastSLAM2.0(精度优于1.0)MATLAB 实现
开发语言·matlab
foundbug99921 小时前
Polar Code 编解码 MATLAB 实现
开发语言·算法·matlab
2zcode1 天前
基于MATLAB图像处理的啤酒瓶口缺陷检测系统设计与实现
开发语言·图像处理·matlab
2zcode1 天前
基于MATLAB图像处理的水果识别与分类系统设计与实现
图像处理·matlab·分类
matlab代码2 天前
基于matlab人脸疲劳驾驶检测系统(可使用其它人脸视频)【源码39期】
开发语言·matlab·人脸疲劳检测
matlab代码2 天前
基于matlab人脸门禁识别系统(可增加其它人脸图像)源码40期】
开发语言·matlab·人脸识别·人脸门禁
民乐团扒谱机2 天前
【微实验】从迷雾中看清世界:卡尔曼滤波的数学诗意与MATLAB实践
人工智能·算法·matlab·卡尔曼滤波·kalman
2zcode2 天前
基于MATLAB图像处理的细胞检测与计数分析系统设计与实现
图像处理·人工智能·matlab
2zcode2 天前
免费开源项目文档:基于MATLAB图像处理的水果识别与品质分级系统设计与实现
图像处理·计算机视觉·matlab