应用单纯形法优化秩滤波参数¶
本文讨论了图像处理算法在Julia和MATLAB中的实现和比较。主要目的是应用单纯形法优化秩滤波参数,以最大限度地提高条形码图像的对比度。
该算法包括以下步骤
1.基于等级的滤波--利用自适应阈值抑制图像上的噪声。
2.对比度计算 - 估算条形码黑白元素之间的差异。
3.** Simplex Optimisation** - 查找可提供最高图像质量的过滤参数。
论文介绍了两种语言的代码,对结果进行了直观比较,并分析了实施的特殊性。
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)
- Julia:
rangefilt(Initial_Img, T, step=1)
输入参数:
-Initial_Img
- 输入图像(亮度矩阵)、
-T
- 阈值向量、
-step
- 滤波偏移步长(默认为 1)。
输出数据:
- 过滤后的图像(矩阵)。
运行原理: 1.
- 分析每个像素的邻域大小(2*长度(T)+1);
- 计算邻域的中值;
- 如果像素与其邻域的差值超过阈值 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
- 具有平均亮度等级的图像。
算法:
- 按列计算平均亮度曲线、 自动确定阈值 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)
- Julia:
Xr, I1, MeanImg = simplex(Xin, J, I)
输入参数:
-Xin
- 因子的初始值、
-J
- 变化区间、
-I
- 初始图像。
输出数据:
-Xr
- 所有试验点和目标函数值的矩阵、
-I1
- 最佳滤波图像、
-MeanImg
- 带有选定黑/白元素的图像。
算法的关键步骤: 1.
- 构建初始单纯形(正多面体);
- 循环执行操作:
- 反射最差顶点、
- 计算目标函数 (contrastBC)
- 调整简面形状; 3.停止标准 - 达到 50 次迭代。
** 实现方法比较:**
| Component | MATLAB | Julia | | MATLAB
|---------------------|---------------------------------|---------------------------------|
| 处理矩阵 | 内置运算符 | LinearAlgebra 包 | 线性代数
| 数组索引 | 1-based | 0-based
| 内存管理 | 隐式分配 | 显式分配 (similar()
)
| 矢量化 | 自动 | 需要.
操作
| OOP 方法 | 程序化方法 | 多方法
** 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在处理矩阵时显示出更简洁的语法。
2.实施的simplex 方法有效地优化了滤波参数,对比度的视觉改善就是证明。
3.处理后的图像对比(rangfilt
和contrastBC
)显示出相似的结果。
进一步研究的方向可以是
- 通过并行计算加快Julia的计算速度、
- 在更复杂的噪声图像上进行测试、
- 与其他优化方法(梯度下降法、遗传算法)进行比较。