单纯形法在秩滤波参数优化中的应用
本文讨论了Julia和MATLAB语言中图像处理算法的实现和比较。 主要任务是利用单纯形法对秩滤波的参数进行优化,以最大化条码图像的对比度。
该算法包括以下步骤。
- 秩滤波是具有自适应阈值的图像中的降噪。
- 对比度计算-评估黑白条码元素之间的差异。
- 单纯形优化-搜索可提供尽可能高的图像质量的滤波器参数。
本文介绍了两种语言的代码,提供了结果的可视化比较并分析了实现特性。
Pkg.add("Statistics")
让我们从可视化输入数据开始。 下面的图片显示了原始的条形码图像,我们将在未来使用它。
using Images
Folder = @__DIR__
puth_to_photo = "$Folder/Img.bmp"
cdata = load(puth_to_photo) # Загружаем изображение
图像处理算法详解
1. 秩过滤(rangefilt)
目的:
使用自适应阈值抑制条形码图像中的脉冲噪声。
实现:
-MATLAB: rangefilt(Initial_Img, T, step)
-朱莉娅: rangefilt(Initial_Img, T, step=1)
输入参数:
Initial_Img-输入图像(亮度矩阵),T-阈值向量,step-过滤器偏移步骤(默认为1)。
输出数据:
-滤波图像(矩阵)。
操作原理:
- 对于每个像素,用尺寸(2*长度(T)+1)分析其邻域;
- 邻域的中位数进行计算;
- 如果与其邻居的差值超过阈值T,则将像素替换为中值。
实现之间的关键区别:
/方面/MATLAB/朱莉娅|
|--------------|---------------------------------|---------------------------------|
/Typing/Dynamic/Strict with type annotations|
/边框处理/隐式/显式大小控制|
/矢量化/嵌入/使用广播(。+) |
/性能/JIT编译/LLVM编译|
2. 对比度计算(contrastBC)
目的:
黑白条形码元素之间差异的量化。
实现:
-MATLAB: [contrast, MeanImg] = contrastBC(Initial_Img)
-朱莉娅: contrast, MeanImg = contrastBC(Initial_Img)
输入参数:
Initial_Img-滤波后的输入图像。
输出数据:
contrast-数值对比度估计(标量),MeanImg-具有平均亮度水平的图像。
算法:
- 按列计算平均亮度分布,
- 自动阈值检测AdaptiveLevel=(Min+Max)/2,
- 分为黑色(BElPos)和白色(WElPos)元素,
- 使用公式计算对比度:
对比度=((MeanW-MeanB)/255)*(Max-Min)/(Max+Min)
实现的特点
-MATLAB使用内置函数 mean 具有特殊的输出格式。
-Julia使用具有显式维度指示的统计处理(dims=1).
-Julia版本需要显式类型转换用于算术运算。
3. 单纯形优化
目的:
搜索使对比度最大化的最佳过滤参数。
实现:
-MATLAB: [Xr, I1, MeanImg] = simplex(Xin, J, I)
-朱莉娅: Xr, I1, MeanImg = simplex(Xin, J, I)
输入参数:
Xin-因子的初始值,J-变异间隔,I-原始图像。
输出数据:
Xr-所有测试点和目标函数值的矩阵,I1-最佳滤波图像,MeanImg-具有突出显示的黑/白元素的图像。
算法的关键步骤:
- 构造初始单纯形(正多面体);
- 操作的循环执行:
-最差顶点的反射,
-目标函数的计算(bbc),
-单工形式的适应; - 停止准则是实现50次迭代。
实现的比较:
/组件/MATLAB/Julia|
|---------------------|---------------------------------|---------------------------------|
/使用矩阵/内置运算符/线性代数包|
|索引|基于1|基于0的数组/
/内存管理/隐式/显式分配(similar()) |
/矢量化/自动/需要 . 操作|
/OOP方法/程序|Multimethods|
Julia实现的特点:
-显式指示类型以提高性能,
-使用广播操作(。+, .*),
-模块化结构,可分配个别功能,
-多线程支持(在此实现中未使用)。
MATLAB实现的特点:
-矩阵运算的紧凑记录,
-自动处理边界条件,
-内置支持处理图像,
-使用全局工作区进行数据交换。
算法比较
using MATLAB
mat"""cd($Folder)"""
@time mat"test_m"
@time include("$Folder/test_jl.jl")
分析代码的结果,你可以看到大约两倍的运行时间的差异。 还可以看出,虽然保留了算法的一般逻辑,但语言的选择显着影响:
- 边界条件的处理方式。,
- 性能优化方法,
- 代码组织风格,
- 扩展功能的可能性。
Julia演示了一种更现代的方法,具有显式类型和更好的优化功能,而MATLAB为矩阵运算提供了更紧凑的表示法。
结果可视化
function center_text(text::String, width::Int)
padding = " " ^ div(width - length(text), 2)
println(padding * text)
end
# Загружаем изображения
Img_contrastBC_julia = load("$Folder/Img_contrastBC_julia.png")
Img_contrastBC_matlab = load("$Folder/Img_contrastBC_matlab.png")
Img_rangfilt_julia = load("$Folder/Img_rangfilt_julia.png")
Img_rangfilt_matlab = load("$Folder/Img_rangfilt_matlab.png")
# Объединяем изображения
center_text("Julia and MATLAB", 140)
println()
center_text("rangfilt", 140)
display(hcat(Img_rangfilt_julia, Img_rangfilt_matlab))
println()
center_text("contrastBC", 140)
display(hcat(Img_contrastBC_julia, Img_contrastBC_matlab))
正如我们所看到的,图像是相同的,这表明所实现的算法的均匀性。
结论
- 这两种语言都成功地完成了任务,但是MATLAB在处理矩阵时显示了更简洁的语法。
- 实现的单纯形法有效地优化了滤波参数,这通过视觉对比度的改善得到了证实。
- 处理后的图像比较(
rangfilt和contrastBC)演示了类似的结果。
进一步的研究可能旨在:
- 通过使用并行计算加速Julia中的计算,
- 测试更复杂的噪声图像,
- 与其他优化方法(梯度下降,遗传算法)的比较。

