
基于MATLAB的图像去雨系统带GUI界面雨天拍摄的照片总是让人头疼那些斜斜的雨线就像划在画面上的透明伤痕。今天咱们来玩点有意思的——用MATLAB做个带图形界面的图像去雨玩具。别担心需要多高深的数学知识咱们主要用空间滤波和频域处理这对黄金搭档。先看核心思路雨滴在图像中主要表现为高频成分像不像撒在画面上的细盐粒咱们先设计个自适应的滤波器来捕捉这些捣蛋鬼。这里我尝试了高斯差分滤波结合阈值分割function filtered_img rain_filter(img) % 高斯滤波去噪 hsize 7; sigma 2; gauss_filter fspecial(gaussian, hsize, sigma); smoothed imfilter(img, gauss_filter, replicate); % 高频成分提取 dog_filter fspecial(gaussian, hsize, sigma*0.6) - gauss_filter; rain_mask imfilter(img, dog_filter); % 动态阈值处理 threshold graythresh(rain_mask)*1.2; binary_mask imbinarize(rain_mask, threshold); % 形态学优化 se strel(disk,2); cleaned_mask imopen(binary_mask, se); % 原图修复 filtered_img roifilt2(gauss_filter, img, cleaned_mask); end这段代码就像个智能橡皮擦。先用高斯滤波抹平画面hsize控制橡皮大小sigma控制力度接着用高斯差分DoG找出雨丝边缘。graythresh自动找阈值特别实用乘以1.2是给雨天场景留的余量实际操作时可以拖动滑块调整这个系数。接下来是重头戏——GUI设计。MATLAB的GUIDE工具虽然有点年头但做原型开发是真方便。我在布局里塞了三个关键部件图像显示区域、参数滑动条和酷炫的进度条虽然进度是假的但仪式感很重要。基于MATLAB的图像去雨系统带GUI界面看看打开图像按钮的回调函数function openButton_Callback(hObject, ~) [filename, pathname] uigetfile({*.jpg;*.png,图片文件}); if filename ~ 0 handles.original imread(fullfile(pathname, filename)); axes(handles.originalAxes); imshow(handles.original); % 默认参数初始化 set(handles.sigmaSlider, Value, 2); set(handles.threshSlider, Value, 1.2); guidata(hObject, handles); end end这里藏着个小技巧用fullfile拼接路径比字符串拼接更安全特别是跨平台时。guidata相当于数据保险箱保证各个回调函数都能拿到最新数据。处理按钮的代码更有意思function processButton_Callback(~, ~, handles) rain_img handles.original; % 把滑动条数值映射到参数 sigma get(handles.sigmaSlider, Value); enhance_factor get(handles.threshSlider, Value); % 假装在努力处理 for i1:10 pause(0.1) set(handles.progressBar, Value, i*0.1); end % 实际处理 final_img rain_filter(rain_img); axes(handles.resultAxes); imshow(final_img); end那个虚假的进度条循环是不是很眼熟虽然在实际工程里不推荐但做演示时确实能让等待显得不那么漫长。注意这里直接把sigma写死了有兴趣可以自己改成关联滑动条值。跑起来的效果嘛对付细雨效果拔群。比如处理沾了雾水的车窗照片雨滴被去掉后车牌号码瞬间清晰。但遇到暴雨倾盆的情况算法可能会把柳树枝条也当雨丝过滤——这时候就该搬出更复杂的频域分解方法了不过那就是另一个故事了。最后留个思考题如果把高斯滤波换成双边滤波处理时间会增加多少试试把imfilter替换成imbilatfilt记得准备好咖啡等着看性能变化。图像处理就是这样总是在效果和效率之间走钢丝不是吗