基于不同算法的数字图像修复Matlab源代码实现及说明,涵盖滤波修复、偏微分方程修复和基于纹理合成的高级算法:
一、基础滤波修复算法(中值滤波/均值滤波)
适用场景:小面积椒盐噪声或高斯噪声修复
核心原理:通过邻域统计量替换缺失像素
matlab
% 读取图像并创建掩膜(假设白色区域为待修复区域)
img = imread('damaged.jpg');
grayImg = rgb2gray(img);
mask = (grayImg == 255); % 根据实际掩膜修改
% 中值滤波修复
kernel = ones(5,5)/25; % 5x5均值滤波核
filteredImg = imfilter(double(img), kernel, 'same');
% 将滤波结果应用于掩膜区域
repairedImg = img;
for ch = 1:3
repairedImg(:,:,ch)(mask) = filteredImg(:,:,ch)(mask);
end
% 显示结果
figure;
subplot(1,3,1); imshow(img); title('原始图像');
subplot(1,3,2); imshow(mask); title('修复掩膜');
subplot(1,3,3); imshow(repairedImg); title('滤波修复结果');
改进方向:可结合自适应滤波核大小---
二、TV模型修复算法(各向异性扩散)
适用场景:边缘保持的连续区域修复
核心原理:最小化能量函数保持梯度连续性
matlab
function repaired = TV_inpainting(damaged, mask, lambda, iter)
[h,w,~] = size(damaged);
repaired = damaged;
for iter = 1:iter
[Ix, Iy] = gradient(repaired);
div = (Ix(:,:,2)-Ix(:,:,1)) + (Iy(:,:,2)-Iy(:,:,1)); % 散度计算
gradNorm = sqrt(Ix.^2 + Iy.^2 + eps);
c = 1./(gradNorm + eps); % 扩散系数
c(mask) = 0; % 掩膜区域不更新
repaired = repaired + lambda * div .* c;
end
end
% 调用示例
damaged = imread('damaged.jpg');
mask = imbinarize(rgb2gray(damaged));
lambda = 0.1; iter = 200;
result = TV_inpainting(damaged, mask, lambda, iter);
关键参数 :lambda控制扩散强度,iter决定迭代次数---
三、Criminisi算法(纹理合成修复)
适用场景:大块缺失区域修复
核心原理:优先修复置信度低的边缘区域,通过纹理块匹配填充
matlab
function [repaired, priority] = criminisi(damaged, mask, patchSize)
[h,w,~] = size(damaged);
repaired = damaged;
priority = zeros(h,w);
for iter = 1:1000
% 计算优先级(Criminisi核心公式)
[C, D] = compute_priority(repaired, mask, patchSize);
priority = C .* D;
% 寻找最大优先级点
[y,x] = find(priority == max(priority(:)));
if isempty(y) break; end
% 块匹配修复
targetPatch = get_patch(repaired, x, y, patchSize);
sourcePatch = find_best_match(repaired, mask, x, y, patchSize);
repaired(mask) = sourcePatch(mask);
end
end
% 辅助函数示例(需完整实现)
function [C,D] = compute_priority(img, mask, patchSize)
% 计算数据项C和一致性项D
% ...(具体实现参考文献)
end
优化技巧:使用积分图像加速块匹配,限制搜索范围---
四、Fast Marching Method (FFM) 算法
适用场景:狭窄线性损伤修复(如划痕、细小孔洞)
核心原理:基于水平集的快速行进算法
matlab
function repaired = FMM_inpainting(damaged, mask)
[h,w,~] = size(damaged);
repaired = damaged;
F = ones(h,w); % 特征函数
T = inf(h,w); % 到边界的距离
% 初始化边界
[T, F] = init_frontier(mask, T, F);
heap = build_min_heap(T);
while ~isempty(heap)
[y,x] = extract_min(heap);
F(y,x) = 0; % 更新特征函数
% 更新邻域
for dx = -1:1
for dy = -1:1
if valid(y+dy,x+dx,h,w) && mask(y+dy,x+dx)==0
newT = compute_distance(T(y,x), y+dy, x+dx);
if newT < T(y+dy,x+dy)
T(y+dy,x+dy) = newT;
F(y+dy,x+dy) = compute_feature(img, y+dy, x+dy);
update_heap(heap, T(y+dy,x+dy), y+dy, x+dy);
end
end
end
end
end
% 最终修复
repaired(mask) = img(~mask);
end
性能优化:使用快速行进算法替代传统迭代---
五、完整GUI实现框架
matlab
function image_repair_gui
% 创建GUI界面(参考文献)
fig = uifigure('Name','图像修复工具');
% 控件布局
uicontrol('Style','pushbutton', 'String','加载图像',...
'Position',[20 350 100 30], 'Callback',@load_callback);
uicontrol('Style','popupmenu', 'String',{'中值滤波','Criminisi','TV模型'},...
'Position',[150 350 120 30], 'Tag','methodSelect');
% 图像显示区域
ax1 = uiaxes(fig, 'Position',[0.1 0.3 0.4 0.6]);
ax2 = uiaxes(fig, 'Position',[0.55 0.3 0.4 0.6]);
% 回调函数示例
function load_callback(~,~)
[file,path] = uigetfile({'*.jpg;*.png'},'选择图像');
img = imread(fullfile(path,file));
imshow(img, 'Parent', ax1);
% 生成掩膜(需自定义)
mask = create_mask(img);
imshow(mask, 'Parent', ax2);
end
end
算法选择建议
| 算法类型 | 优势 | 局限性 | 适用场景 |
|---|---|---|---|
| 中值/均值滤波 | 计算快,适合噪声修复 | 边缘模糊 | 小面积噪声 |
| TV模型 | 保持边缘连续性 | 需要多次迭代 | 划痕、渐变区域 |
| Criminisi | 处理大块缺失效果好 | 计算复杂度高 | 复杂纹理修复 |
| FMM | 快速收敛 | 依赖初始掩膜质量 | 线性损伤修复 |
参考代码 数字图像修复的matlab源代码 www.youwenfan.com/contentcsn/83970.html
扩展优化方向
- 多尺度修复:结合小波变换实现多分辨率修复
- 深度学习集成:使用预训练CNN模型提取特征辅助修复
- 实时修复:利用GPU加速算法(如CUDA并行计算)
- 交互式修复:支持手动标记修复区域并自适应调整参数