📚旁证博引

光学计算 非线性光学 互信息 光腔 积分球 玻恩级数 散斑图案 微镜 图像抖动算法 格林矩阵 压缩感知

🎯要点

🎯多重散射腔内的被动非线性光学映射 | 🎯积分球构建多重散射腔 | 🎯改变腔内的光散射增强非线性阶数 | 🎯使用Fashion MNIST图像集,面部关键点数据集和行人检测数据集评估算法

光学和散射用例

🍪语言内容分比

pie title 语言分比
"Python":90
"C++":20
pie title 内容分比
"光学":90
"物理":20
"数学":30
"算法":10
"图像分类、面部识别和行人识别":50

✂️梗概

🍇Python图像抖动算法优化

我们可以使用此算法将灰度图像转换为黑色和白色两种颜色。该算法将像素值四舍五入为两个极值中的最接近值(0 表示黑色,255 表示白色)。原始值与四舍五入值之间的差值(称为误差)将添加到相邻像素,分布如下:

[ ...            , current pixel (rounded)   , + 7/16 of error, ... ]
[ + 3/16 of error, + 5/16 of error           , + 1/16 of error, ... ]

因此,该行上的下一个像素的误差为 7/16,而下一行的像素的误差为 5/16,依此类推。处理完当前像素后,算法将转到下一个像素,该像素现在包含前一个像素的部分误差。优化此算法的一个关键问题是,并行处理像素可能是不可能的:每个像素的最终值都会受到对先前像素进行的计算的影响。这表明使用多个线程进行并行处理可能很困难或不可能。

让我们加载将要使用的库以及测试图像(一个 400×400 NumPy 的 uint8 数组)。

from numba import njit
import numpy as np
from skimage import io

image = io.imread("images/hallway.jpg")

如果这不仅仅是一个示例,我们希望使用各种图像和尺寸对代码进行基准测试,以匹配我们期望遇到的各种输入。然而,为了简单起见,我们将坚持使用这张图片。

以下,我将从一个简单的实现开始,使其更快,减少内存使用量,然后再进行进一步优化。为清晰起见,省略了一些中间步骤和失败的实验。

最简单实现:

代码将临时结果存储在 16 位整数中,因为添加错误可能会使某些像素为负数或大于 255。这两种情况都不适合无符号 8 位整数。最后,我将结果转换为 8 位图像,这就是函数应该返回的内容。

用 numba.njit 修饰的代码看起来像 Python 代码,但是实际上在运行时编译成机器代码。这是快速、低水平的代码!