测试页面:
图像镜像是图像旋转变换的一种特殊情况,通常包括垂直方向和水平方向的镜像。水平镜像通常是以原图像的垂直中轴为中心,将图像分为左右两部分进行堆成变换。如下:
垂直镜像通常是以原图像的水平中轴线为中心,将图像划分为上下两部分进行堆成变换的过程。如下图:
数学表达式:
矩阵表现形式:
C# 代码实现(都是8位深度、单通道500w图像,后面介绍24、32位深度):
结果如下:
耗时32ms,我们来优化此代码,如下:
结果如下:
耗时15ms,性能提升了不少,但是还没有到极致,我们使用simd指令集优化,如下:
结果如下:
耗时3ms,性能再次提升!!!
simd指令解释:垂直镜像直接交换两个向量的元素即可,但是水平镜像不行,在交换位置前需要对向量内部元素进行位置颠倒,Avx2.Shuffle对32位向量低位和高位分开进行颠倒,所以我们需要使用Avx2.Permute2x128指令颠倒低位和高位。
对于24,它是以B、G、R顺序排列,对于32位深度,它是以B、G、R、alpha排列,如下(这里使用普通代码):
附OpenCV Sharp代码: