我的图像SHADING算法和5x5滤波

我的图像SHADING算法和5x5滤波

本人直接使用Markdown编辑器,用它写博客玩一玩的哦:

  • 目录

项目3
定义 C
定义 D

定义D内容

代码块

下面我的图像SHADING算法和5x5滤波的C#代码:

if (mImage == null)
            {
                MessageBox.Show("Please open or snap an image first.");
                return;
            }
            if (mRectangle.Width == 0)
            {
                MessageBox.Show("Please add a rectangele area first.");
                return;
            }
            //----------------------------------------------------------------------
            // 将源图像内存区域锁定
            Rectangle rect = new Rectangle(0, 0, mImage.Width, mImage.Height);
            BitmapData bmpData = mImage.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed);


            // 获取图像参数
            int width = bmpData.Width;
            int height = bmpData.Height;
            int stride = bmpData.Stride;                // 扫描线的宽度,比实际图片要大 (RGB用)
            //int offset = stride - width * 3;            // 显示宽度与扫描线宽度的间隙  (RGB用)
            IntPtr ptr = bmpData.Scan0;                   // 获取bmpData的内存起始位置的指针
            int scanBytesLength = stride * height;     // 用stride宽度,表示这是内存区域的大小 (RGB用)


            int mBigRectangle = mRectangle.Width * mRectangle.Height;
            iCellGrayValue = new double[mBigRectangle];
            ClassCommon.iCellGrayShadingRate = new double[mBigRectangle];
            ClassCommon.iCellGrayShadingRateFinal = new double[mBigRectangle];

            int mSmallRectangle = mRectMean.Width * mRectMean.Height;
            iCellGrayValueOfSmall = new double[mSmallRectangle];


            int posScan = 0;
            int ordinal = 0;
            byte[] curGrayValue = new byte[scanBytesLength];  // 为目标数组分配内存
            Marshal.Copy(ptr, curGrayValue, 0, scanBytesLength);  // 将图像数据拷贝到rgbValues中  ==>重载之6

            for (int i = mRectangle.Location.Y; i < mRectangle.Location.Y + mRectangle.Height; i++)
            {
                for (int j = mRectangle.Location.X; j < mRectangle.Location.X + mRectangle.Width; j++)
                {
                    //posScan = i * width + (j + s);
                    posScan =i * width + (j + 0);
                    iCellGrayValue[ordinal] = curGrayValue[posScan];
                    ordinal += 1;
                }
            }
            //-------------------------------小框内的亮度平均值
            posScan = 0;
            ordinal = 0;
            double TotalCellGrayValueOfSmall = 0;
            for (int i = mRectMean.Location.Y; i < mRectMean.Location.Y + mRectMean.Height; i++)
            {
                for (int j = mRectMean.Location.X; j < mRectMean.Location.X + mRectMean.Width; j++)
                {
                    //posScan = i * width + (j + s);
                    posScan = i * width + (j + 0);
                    iCellGrayValueOfSmall[ordinal] = curGrayValue[posScan];
                    //---------------------------------------------
                    TotalCellGrayValueOfSmall += iCellGrayValueOfSmall[ordinal];
                    ordinal += 1;
                }
            }

            
            //计算shading值-----------------------------------------------
            double meanGrayValue = TotalCellGrayValueOfSmall / mSmallRectangle;
            for (int i = 0; i < mBigRectangle; i++)
            {
                if (iCellGrayValue[i] == 0) iCellGrayValue[i] = 1;
                ClassCommon.iCellGrayShadingRate[i] = meanGrayValue / iCellGrayValue[i];
            }
            ClassCommon.iCellGrayShadingRateFinal = ClassCommon.iCellGrayShadingRate;
            // 内存解锁
            Marshal.Copy(curGrayValue, 0, ptr, scanBytesLength);  //==>重载之6
            mImage.UnlockBits(bmpData);  // 解锁内存区域

            //对shading值做5*5均值滤波----------------------------- 

            for (int y = 0; y <  mRectangle.Height - 4; y++)
            {
                for (int x = 0; x < mRectangle.Width - 4; x++)
                {
                    posScan = 0;
                    double TotalEvery25CellShadingValue = 0;
                    double AverageEvery25CellShadingValue = 0;
                    for (int i = y; i < y + 5; i++)
                    {
                        for (int j = x; j < x + 5; j++)
                        {
                            //posScan = i * width + (j + s);
                            posScan = i  * mRectangle.Width  + (j + 0);    
                            TotalEvery25CellShadingValue += ClassCommon.iCellGrayShadingRate[posScan];
                        }
                    }
                    AverageEvery25CellShadingValue = TotalEvery25CellShadingValue / 25;
                    //posScan = y * width + (x + s) //s为起始值;
                    int target = (y + 2) * width + (x +2);
                    ClassCommon.iCellGrayShadingRateFinal[target] = Math.Round(AverageEvery25CellShadingValue,3);
                }
            }

###脚注
生成一个脚注1.

目录

[TOC]来生成目录:

文章目录

  • 我的图像SHADING算法和5x5滤波
      • 代码块
      • 目录
      • 数学公式
      • UML 图:
    • 离线写博客

数学公式

使用MathJax渲染LaTex 数学公式,详见math.stackexchange.com.

  • 行内公式,数学公式为: Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN
  • 块级公式:

x = − b ± b 2 − 4 a c 2 a x = \dfrac{-b \pm \sqrt{b^2 - 4ac}}{2a} x=2ab±b24ac

更多LaTex语法请参考 [这儿][3].

UML 图:

可以渲染序列图:

张三 李四 嘿,小四儿, 写博客了没? 李四愣了一下,说 : 忙得吐血,哪有时间写。 张三 李四

或者流程图:

Created with Raphaël 2.2.0 开始 我的操作 确认? 结束 yes no
  • 关于 序列图 语法,参考 [这儿][4],
  • 关于 流程图 语法,参考 [这儿][5].

离线写博客

即使用户在没有网络的情况下,也可以通过本编辑器离线写博客(直接在曾经使用过的浏览器中输入write.blog.csdn.net/mdeditor即可。Markdown编辑器使用浏览器离线存储将内容保存在本地。

用户写博客的过程中,内容实时保存在浏览器缓存中,在用户关闭浏览器或者其它异常情况下,内容不会丢失。用户再次打开浏览器时,会显示上次用户正在编辑的没有发表的内容。

博客发表后,本地缓存将被删除。

用户可以选择 把正在写的博客保存到服务器草稿箱,即使换浏览器或者清除缓存,内容也不会丢失。

**注意:**虽然浏览器存储大部分时候都比较可靠,但为了您的数据安全,在联网后,请务必及时发表或者保存到服务器草稿箱



  1. 这里是 脚注内容. ↩︎

你可能感兴趣的:(SHADING算法,5*5滤波)