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]之间,从而起到增强作用。由于各通道分开调节,有可能造成图像偏色。

posted @ 2014-10-03 20:30  Imageshop  阅读(2138)  评论(0编辑  收藏  举报