C# 图像镜像

时间:2024-10-10 10:32:45

测试页面:

图像镜像是图像旋转变换的一种特殊情况,通常包括垂直方向和水平方向的镜像。水平镜像通常是以原图像的垂直中轴为中心,将图像分为左右两部分进行堆成变换。如下:

垂直镜像通常是以原图像的水平中轴线为中心,将图像划分为上下两部分进行堆成变换的过程。如下图:

数学表达式:

矩阵表现形式:

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代码: