Engee 文档
Notebook

单纯形法在秩滤波参数优化中的应用

本文讨论了JuliaMATLAB语言中图像处理算法的实现和比较。 主要任务是利用单纯形法对秩滤波的参数进行优化,以最大化条码图像的对比度。

该算法包括以下步骤。

  1. 秩滤波是具有自适应阈值的图像中的降噪。
  2. 对比度计算-评估黑白条码元素之间的差异。
  3. 单纯形优化-搜索可提供尽可能高的图像质量的滤波器参数。

本文介绍了两种语言的代码,提供了结果的可视化比较并分析了实现特性。

In [ ]:
Pkg.add("Statistics")

让我们从可视化输入数据开始。 下面的图片显示了原始的条形码图像,我们将在未来使用它。

In [ ]:
using Images
Folder = @__DIR__
puth_to_photo = "$Folder/Img.bmp"
cdata = load(puth_to_photo)  # Загружаем изображение
Out[0]:
No description has been provided for this image

图像处理算法详解

1. 秩过滤(rangefilt)

目的:
使用自适应阈值抑制条形码图像中的脉冲噪声。

实现:
-MATLAB: rangefilt(Initial_Img, T, step)
-朱莉娅: rangefilt(Initial_Img, T, step=1)

输入参数:

  • Initial_Img -输入图像(亮度矩阵),
  • T -阈值向量,
  • step -过滤器偏移步骤(默认为1)。

输出数据:
-滤波图像(矩阵)。

操作原理:

  1. 对于每个像素,用尺寸(2*长度(T)+1)分析其邻域;
  2. 邻域的中位数进行计算;
  3. 如果与其邻居的差值超过阈值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 -具有平均亮度水平的图像。

算法:

  1. 按列计算平均亮度分布,
  2. 自动阈值检测AdaptiveLevel=(Min+Max)/2,
  3. 分为黑色(BElPos)和白色(WElPos)元素,
  4. 使用公式计算对比度:
    对比度=((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 -具有突出显示的黑/白元素的图像。

算法的关键步骤:

  1. 构造初始单纯形(正多面体);
  2. 操作的循环执行:
    -最差顶点的反射,
    -目标函数的计算(bbc),
    -单工形式的适应;
  3. 停止准则是实现50次迭代。

实现的比较:

/组件/MATLAB/Julia|
|---------------------|---------------------------------|---------------------------------|
/使用矩阵/内置运算符/线性代数包|
|索引|基于1|基于0的数组/
/内存管理/隐式/显式分配(similar()) |
/矢量化/自动/需要 . 操作|
/OOP方法/程序|Multimethods|

Julia实现的特点:
-显式指示类型以提高性能,
-使用广播操作(。+, .*),
-模块化结构,可分配个别功能,
-多线程支持(在此实现中未使用)。

MATLAB实现的特点:
-矩阵运算的紧凑记录,
-自动处理边界条件,
-内置支持处理图像,
-使用全局工作区进行数据交换。

算法比较

In [ ]:
using MATLAB
mat"""cd($Folder)"""
@time mat"test_m"
>> >> >>     "X = 8"    "X = 18"    "X = 28"

    "S = 0.73263"    "S = 0.73263"    "S = 0.73263"

  7.044407 seconds (72 allocations: 3.586 KiB)
In [ ]:
@time include("$Folder/test_jl.jl")
X = [8.0 18.0 28.0]
S = [0.7326267443914503 0.7326267443914503 0.7326267443914503]
  3.121629 seconds (27.54 M allocations: 1.824 GiB, 8.88% gc time, 47.39% compilation time)

分析代码的结果,你可以看到大约两倍的运行时间的差异。 还可以看出,虽然保留了算法的一般逻辑,但语言的选择显着影响:

  1. 边界条件的处理方式。,
  2. 性能优化方法,
  3. 代码组织风格,
  4. 扩展功能的可能性。

Julia演示了一种更现代的方法,具有显式类型和更好的优化功能,而MATLAB为矩阵运算提供了更紧凑的表示法。

结果可视化

In [ ]:
function center_text(text::String, width::Int)
    padding = " " ^ div(width - length(text), 2)
    println(padding * text)
end
Out[0]:
center_text (generic function with 1 method)
In [ ]:
# Загружаем изображения
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))
                                                              Julia and MATLAB

                                                                  rangfilt
No description has been provided for this image
                                                                 contrastBC
No description has been provided for this image

正如我们所看到的,图像是相同的,这表明所实现的算法的均匀性。

结论

  1. 这两种语言都成功地完成了任务,但是MATLAB在处理矩阵时显示了更简洁的语法。
  2. 实现的单纯形法有效地优化了滤波参数,这通过视觉对比度的改善得到了证实。
  3. 处理后的图像比较(rangfiltcontrastBC)演示了类似的结果。

进一步的研究可能旨在:

  1. 通过使用并行计算加速Julia中的计算,
  2. 测试更复杂的噪声图像,
  3. 与其他优化方法(梯度下降,遗传算法)的比较。