利用CImg实现直方图均衡和色彩迁移

直方图均衡(histogram equalization)

图像直方图用以表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素数。直方图均衡就是将直方图均衡的分布在整个像素空间中,可以提高图像的对比度和视觉效果。

实验步骤

对于灰度图像,首先统计图像中每个像素的频数和频率
在这里插入图片描述

然后计算累积概率密度分布函数
在这里插入图片描述

由于像素都是整数值,使用round函数将小数四舍五入,并拓展到0-255,最后根据原图像亮度值赋值新的亮度。

我把上述步骤写成了一个函数myHisteq,然后在main中调用。

彩色图像

对于彩色图像,首先想到的是将RGB三个通道分别进行直方图均衡,然后再合成一张图像。但是这种方法再均衡化的过程中不仅改变了亮度,也改变了色彩,造成了图片的失真。
改进的方法是先将图像从RGB空间转到HSV空间,然后对V通道进行直方图均衡。处理完后再转回RGB空间显示。

在HSV空间中,H代表色调,用角度度量,取值范围为0°~360°,S代表饱和度,取值范围为0%~100%,V代表明度,取值范围为0%(黑)到100%(白)。只对V通道采用直方图均衡可以很好的改善图片的亮度,同时又不产生失真。

实验效果

Original是原图,gray是灰度图像均衡,color1是对RGB空间均衡,color2是对HSV是对HSV空间均衡,可以看到color2的色彩还原更好。

在这里插入图片描述

颜色迁移(color transfer)

颜色迁移是指根据目标图片调整图片的颜色特征。这里使用的是 Color Transfer between Images 这篇论文的方法。RGB三通道有很强的关联性,而做颜色的改变同时恰当地改变三通道比较困难。作者使用了Lab空间,三个通道分别代表亮度,黄蓝和红绿。三个通道相互正交,互不影响。

实验步骤

先将原图像和目标图像转换到Lab空间,分通道计算均值和标准差。下面对每个像素分通道进行处理,把原图像减去原图像的均值乘上目标图片与原图片标准差的比值再加上目标图片的均值,最后转换到RGB空间显示。

实验效果

可以看到src原图像的颜色变得和dest目标图像相近。
在这里插入图片描述

结果分析

这个算法的优点在于实现简单,运行效率高,缺点在于该算法基于整体色彩迁移,对全局颜色比较少的图片有比较好的效果,而对于颜色较多的图片效果不明显。同时如果两张图像的颜色非常不同,再Lab颜色空间处理会扩大色差,导致颜色不自然。对于这些缺点,可以使用局部色彩迁移。论文Local Color Transfer via Probabilistic Segmentation by Expectation-Maximization 提出了利用GMM高斯混合模型以及修改的EM算法来对颜色区域进行分割,得到更好的局部色彩迁移结果。

代码地址

Github

### Reeds-Shepp 曲线算法解释 Reeds-Shepp曲线由J.A.ReedsL.A.Sheep于1990年提出,旨在解决汽车既能前进又能倒车情况下的最优路径问题[^2]。相比于仅能前移的Dubins曲线,这种扩展显著提升了复杂环境中的路径优化能力。 #### 运动模式特点 该模型允许车辆执行三种基本操作:直行、转向左侧行驶以及转向右侧行驶;特别之处在于它不仅支持正向行驶还兼容反向移动。这赋予了其更强灵活性,在狭窄空间内找到更短捷径成为可能[^1]。 #### 算法核心原理 为了计算两点间最短路径,Reeds-Shepp算法通过一系列几何变换来简化原始问题: - **坐标变换**:调整起始位置至原点并设定初始方向为X轴正向。 - **时间翻转(time-flip)**:处理含有后退动作的情况,即将部分路段视为逆序遍历。 - **反射变换(reflect)**:当目标方位角超过特定阈值时应用此方法改变参照系。 - **后向变换(backwards)**:用于转换最终得到的结果回到实际物理场景中去。 这些技术手段共同作用下实现了高效求解任意两姿态间的最小距离路径方案。 ### 实现方式概览 针对不同开发平台提供了多种编程语言版本的具体实施方案说明文档,包括但不限于C++ (适用于ROS框架)、Python脚本形式及MATLAB工具箱接口调用等方式[^3]。每种实现都遵循上述理论基础构建而成,并根据各自特性进行了适当优化适配工作。 ```cpp // C++ 示例代码片段展示如何初始化ReedsShepp类对象 #include "reeds_shepp.h" int main() { reeds_shepp::State start{0, 0, 0}; // 起点状态(x,y,theta) reeds_shepp::State goal{10, 5, M_PI_2}; // 终点状态 std::vector<reeds_shepp::Path> paths; bool success = reeds_shepp::computePaths(start, goal, &paths); } ``` ```python # Python 示例代码片段展示了简单的路径查询过程 from reeds_shepp import PathPlanner planner = PathPlanner() start_pose = (0., 0., 0.) goal_pose = (8., 4., np.pi / 2) path = planner.plan_path(start_pose=start_pose, end_pose=goal_pose) print(f"Total length of the planned path is {sum([segment.length for segment in path])}") ``` ### 应用领域探讨 在自动驾驶领域特别是低速无人驾驶物流配送车、自动泊车辅助系统等方面有着广泛应用前景。由于能够精确控制车辆完成较为复杂的机动动作序列而备受青睐。此外,在机器人学研究里同样扮演着重要角色——帮助机械臂规划避障轨迹或是指导多足行走装置探索未知地形等任务均可见到此类算法的身影。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值