图像基本变换---图像线性变换

图像线性变换即线性点运算,输出灰度级与输入灰度级呈线性关系的点运算。公式如2-(9)所示。

  其中,K,L为变换参数,k属于[0,5],L属于[-128, 128]。

  如果k<l< span="" style="word-wrap: normal;">,则输出图像的对比度将增大,反之对比度将减小,k=1,L=0时,输出图像为输入图像的副本,L是对图像亮度的调整。

[函数代码]

        /// 

        /// Linear transform process(f=kf+v).

        /// 

        /// Source image.

        /// Parameter,from 0 to 5.

        /// Parameter,from -128 to 128.

        /// 

        public static WriteableBitmap LinearTransformProcess(WriteableBitmap src, double k,int v)////8线性变换处理

        {

            if(src!=null )

            {

            int w = src.PixelWidth;

            int h = src.PixelHeight;

            WriteableBitmap linearImage = new WriteableBitmap(w,h);

            byte[] temp = src.PixelBuffer.ToArray();

            for (int i = 0; i < temp.Length; i +=4)

            {

                temp[i] = (byte)(((k * temp[i] + v + 0.5) > 255 ? 255 : (k * temp[i] + v + 0.5)) < 0 ? 0 : ((k * temp[i] + v + 0.5) > 255 ? 255 : (k * temp[i] + v + 0.5)));

                temp[i+1] = (byte)(((k * temp[i+1] + v + 0.5) > 255 ? 255 : (k * temp[i+1] + v + 0.5)) < 0 ? 0 : ((k * temp[i+1] + v + 0.5) > 255 ? 255 : (k * temp[i+1] + v + 0.5)));

                temp[i+2] = (byte)(((k * temp[i+2] + v + 0.5) > 255 ? 255 : (k * temp[i+2] + v + 0.5)) < 0 ? 0 : ((k * temp[i+2] + v + 0.5) > 255 ? 255 : (k * temp[i+2] + v + 0.5)));

            }

            Stream sTemp = linearImage.PixelBuffer.AsStream();

            sTemp.Seek(0, SeekOrigin.Begin);

            sTemp.Write(temp, 0, w * 4 * h);

            return linearImage;

            }

            else

            {

                return null;

            }   

        }

[图像效果]

图像基本变换---图像线性变换_第1张图片

Fig.1原图

图像基本变换---图像线性变换_第2张图片


Fig.2效果图(k=4.0,v=64)


demo 下载: http://www.zealfilter.com/forum.php?mod=viewthread&tid=44&extra=page%3D1

你可能感兴趣的:(图像基本变换)