Engee 文档
Notebook

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

本文讨论了图像处理算法在JuliaMATLAB中的实现和比较。主要目的是应用单纯形法优化秩滤波参数,以最大限度地提高条形码图像的对比度。

该算法包括以下步骤
1.基于等级的滤波--利用自适应阈值抑制图像上的噪声。 2.对比度计算 - 估算条形码黑白元素之间的差异。
3.** Simplex Optimisation** - 查找可提供最高图像质量的过滤参数。

论文介绍了两种语言的代码,对结果进行了直观比较,并分析了实施的特殊性。

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)
  • Julia:rangefilt(Initial_Img, T, step=1)

输入参数: -Initial_Img - 输入图像(亮度矩阵)、 -T - 阈值向量、 -step - 滤波偏移步长(默认为 1)。

输出数据:

  • 过滤后的图像(矩阵)。

运行原理: 1.

  1. 分析每个像素的邻域大小(2*长度(T)+1);
  2. 计算邻域的中值;
  3. 如果像素与其邻域的差值超过阈值 T,则用中值替换该像素。

实现方法之间的主要区别: | Aspect | MATLAB | Julia | | MATLAB |--------------|---------------------------------|---------------------------------| | Typing | Dynamic | Strict with type annotations | 类型注解 | 边界处理 | 隐式 | 显式大小控制 | 矢量化 | 嵌入式 | 使用广播(.+) | | 矢量化 | 嵌入式 | 使用广播(. | 性能 | JIT 编译 | LLVM 编译

2.对比度计算 (contrastBC)

目的: 量化黑白条形码元素之间的差异。

仿真:

  • MATLAB:[contrast, MeanImg] = contrastBC(Initial_Img)
  • Julia:contrast, MeanImg = contrastBC(Initial_Img)

输入参数: -Initial_Img - 滤波后的输入图像。

输出数据: -contrast - 对比度数值估算(标量)、 -MeanImg - 具有平均亮度等级的图像。

算法:

  1. 按列计算平均亮度曲线、 自动确定阈值 AdaptiveLevel = (Min + Max)/2、
  2. 分离成黑色 (BElPos) 和白色 (WElPos) 元素、
  3. 使用公式计算对比度
 对比度 = ((MeanW - MeanB)/255)*(Max - Min)/(Max + Min)

实现的特殊功能

  • MATLAB 使用带有特殊输出格式的内置函数mean
  • Julia 使用具有显式维度的统计处理 (dims=1)。
  • Julia 版本要求对算术运算进行显式类型转换。

3. 单纯形优化

目的: 寻找对比度最大化的最佳滤波参数。

模拟:

  • MATLAB:[Xr, I1, MeanImg] = simplex(Xin, J, I)
  • Julia:Xr, I1, MeanImg = simplex(Xin, J, I)

输入参数: -Xin - 因子的初始值、 -J - 变化区间、 -I - 初始图像。

输出数据: -Xr - 所有试验点和目标函数值的矩阵、 -I1 - 最佳滤波图像、 -MeanImg - 带有选定黑/白元素的图像。

算法的关键步骤: 1.

  1. 构建初始单纯形(正多面体);
  2. 循环执行操作:
    • 反射最差顶点、
    • 计算目标函数 (contrastBC)
    • 调整简面形状; 3.停止标准 - 达到 50 次迭代。

** 实现方法比较:**

| Component | MATLAB | Julia | | MATLAB |---------------------|---------------------------------|---------------------------------| | 处理矩阵 | 内置运算符 | LinearAlgebra 包 | 线性代数 | 数组索引 | 1-based | 0-based | 内存管理 | 隐式分配 | 显式分配 (similar()) | 矢量化 | 自动 | 需要. 操作 | OOP 方法 | 程序化方法 | 多方法

** 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. 扩展功能的可能性。

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.实施的simplex 方法有效地优化了滤波参数,对比度的视觉改善就是证明。
    3.处理后的图像对比(rangfiltcontrastBC )显示出相似的结果。

进一步研究的方向可以是

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