AutoLevel(自动色阶)
C++原型:
void __stdcall AutoLevel(unsigned char *Src, unsigned char *Dest, int Width, int Height ,int Stride, double CutLimit = 0.001)
C#声明:
[DllImport("ImageProcessing.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, ExactSpelling = true)] internal static extern void AutoLevel(byte* Src, byte *Dest, int Width, int Height, int Stride, double CutLimit = 0.001);
VB.NET声明:
<DllImport("ImageProcessing.dll", CallingConvention := CallingConvention.StdCall, CharSet := CharSet.Unicode, ExactSpelling := True)> _ Friend Shared Sub AutoLevel(ByVal Src As IntPtr, ByVal Dest As IntPtr, ByVal Width As Integer, ByVal Height As Integer, ByVal Stride As Integer, ByVal CutLimit As Double) End Sub
VB6.0声明:
Private Declare Sub AutoLevel Lib "ImageProcessing" (ByVal Src As Long, ByVal Dest As Long, ByVal Width As Long, ByVal Height As Long, ByVal StrideAs Long, ByVal CutLimit As Double)
函数说明:
/// <summary> /// "自动色阶"分析照片并校正亮度方面的问题,如由于过度曝光或曝光不足导致照片缺乏细节。使用了汇编层次的优化。(2014.9.4日) /// </summary> /// <param name="Src">源图像数据在内存的起始地址。</param> /// <param name="Dest">目标图像数据在内存的起始地址。</param> /// <param name="Width">源和目标图像的宽度。</param> /// <param name="Height">源和目标图像的高度。</param> /// <param name="Stride">源和目标图像的扫描行大小。</param> /// <param name="CutLimit">需要裁减掉的直方图的比例。</param> /// <remarks> 1: 只处理8位灰度和24位图像。</remarks> /// <remarks> 2: Src和Dest可以相同,在相同时速度更快。</remarks> /// <remarks> 3: 对每个通道进行单独的校正,可能会导致偏色。</remarks>
算法效果:
以上处理效果分别为CutLimit=0.001、0.01、0.02时的效果,其中photoshop中使用的是0.001该值。
处理速度:
I3 M380 2.53GHZ 笔记本上测试:1000 * 1000 彩色像素,用时6ms(时间是于参数无关的)。
代码情况:
该函数通过裁剪各通道的最亮和最暗的部分,并将中间部分的数据量化到[0,255]之间,从而起到增强作用。由于各通道分开调节,有可能造成图像偏色。