• 大功告成

    日期:2006年10月11日 | 分类:日记

    终于、终于、终于把这期图像处理的作业做了~~(除了一道信号的,输出功率谱,头都大了还是不会!)

    根本没想到有这么麻烦,开始以为轻轻松松几道题,一天搞定,没想到是一天又拖一天……(俺真是个又懒又没效率的家伙)前天好不容易差不多了,去问老师才知道,那几个上机都不能直接用matlab的函数,要自己写……  只好今天下午开始重新奋战,结果一念之差,为了方便显示图片决定用matlab,爬去找来那本大厚书研究了好久好久~~方才意识到:俺对这玩意儿太不熟悉了!

    不知道为什么,直接写入像素的图片总是显示效果不好,我改了又改、测了又测,一个旋转程序就弄了有2个多钟头,真希望据说只用matlab做图像处理的小昱同学在身边阿~~好歹是术业有专攻(顺便流口水一下她的微软年薪)!幸亏算法本身都不复杂,对语言上手了就好办,那个均化直方图写得是:如鱼得水、一气呵成!

    估计是老师鄙视我们,其他的那些非上机题几乎都没什么技术含量,哪怕是还没讲到的东西(反正我也没怎么听过,讲没讲过一回事),翻翻书、看看别的资料,也就都能研究出来。唯独有一道,硬是没翻到在哪里,看了好几个版本的教材里也都不见踪影……实在是每办法——不会做!

    不管怎么说,总算是做完了,明天去交差,只希望不要答得漏洞百出被那老师鄙视回来就好……

  • 物欲横流,心灵还能被什么感动?

    日期:2006年10月10日 | 分类:评论及其他

    在天涯上看到的帖子,非本人原创。

    1.

    http://bbsimg.qianlong.com/upload/01/17/83/60/1178360_1143543431968.jpg

    2.

    http://bbsimg.qianlong.com/upload/01/17/83/60/1178360_1143543483734.jpg

    3.

    http://bbsimg.qianlong.com/upload/01/17/83/60/1178360_1143543529156.jpg

    4.

    http://bbsimg.qianlong.com/upload/01/17/83/60/1178360_1143543604421.jpg

    5.

    http://bbsimg.qianlong.com/upload/01/17/83/60/1178360_1143543673390.jpg

    6.

    http://bbsimg.qianlong.com/upload/01/17/83/60/1178360_1143543749296.jpg

    7.

    http://bbsimg.qianlong.com/upload/01/17/83/60/1178360_1143543822453.jpg

    8.

    http://bbsimg.qianlong.com/upload/01/17/83/60/1178360_1143543943046.jpg

    9.

    http://bbsimg.qianlong.com/upload/01/17/83/60/1178360_1143544013015.jpg

    10.

    http://bbsimg.qianlong.com/upload/01/17/83/60/1178360_1143544080109.jpg

    11.

    http://bbsimg.qianlong.com/upload/01/17/83/60/1178360_1143544139703.jpg

    12.

    http://bbsimg.qianlong.com/upload/01/17/83/60/1178360_1143544193390.jpg

    13.

    http://bbsimg.qianlong.com/upload/01/17/83/60/1178360_1143544268515.jpg

    14.

    http://bbsimg.qianlong.com/upload/01/17/83/60/1178360_1143544826093.jpg

    15.

    http://bbsimg.qianlong.com/upload/01/17/83/60/1178360_1143544762031.jpg

    16.

    http://bbsimg.qianlong.com/upload/01/17/83/60/1178360_1143544688843.jpg

    17.

    http://bbsimg.qianlong.com/upload/01/17/83/60/1178360_1143544604171.jpg

    18.

    http://bbsimg.qianlong.com/upload/01/17/83/60/1178360_1143544537343.jpg

    19.

    http://bbsimg.qianlong.com/upload/01/17/83/60/1178360_1143544433234.jpg

    20.

    http://bbsimg.qianlong.com/upload/01/17/83/60/1178360_1143544338625.jpg

    原帖地址:http://www14.tianya.cn/publicforum/Content/no04/1/580327.shtml

  • 数学形态学

    日期:2006年10月10日 | 分类:IT

    要做数字识别,就要跟这玩意儿打交道。上次写细化算法的模板太晕了,后来去维普一搜,好算法一堆一堆的……虽然这篇代码写得也不怎么样,但好歹可以拿来用,到时候写识别模块测试的时候可以省时间了!

    C++的源代码:

     *   ErosiontionDIB() 腐蚀运算
     *   DilationDIB()  膨胀运算
     *   OpenDIB()   开运算
     *   CloseDIB()   闭运算
     *   CountDIB()   边缘检测
     *   ThinDIB()   细化
     *   FillDIB()          填充

    #include "stdafx.h"
    #include
    #include
    #include
    #include "dibapi.h"
    /*////////////////////////////////////////////////////////////////////////////////////
    // DXF.2003.10.20
    // myfile4.cpp
     *   ErosiontionDIB() 腐蚀运算
     *   DilationDIB()  膨胀运算
     *   OpenDIB()   开运算
     *   CloseDIB()   闭运算
     *   CountDIB()   边缘检测
     *   ThinDIB()   细化
     *   FillDIB()          填充
     ///////////////////////////////////////////////////////////////////////////////////////*/

    /*************************************************************************
     *
     * 函数名称:
     *   ErosiontionDIB()
     *
     * 参数:
     *   HDIB hDib    - 指向源DIB图像句柄
     *  unsigned char ** PixelData 像素数组
     *  int   structure[3][3]
     *      - 自定义的3×3结构元素。
     *
     * 返回值:
     *   BOOL               - 腐蚀成功返回TRUE,否则返回FALSE。
     *
     * 说明:
     * 该函数用于对图像进行腐蚀运算。结构元素为水平方向或垂直方向的三个点,中间点位于原点;
     * 或者由用户自己定义3×3的结构元素。
     *
     * 要求目标图像为只有0和255两个灰度值的灰度图像。
     ************************************************************************/
    BOOL WINAPI ErosionDIB (HDIB hDib, unsigned char ** PixelData, const int structure[3][3])
    {
       LPBITMAPINFOHEADER lpBi;
     unsigned char * hData;
     int i,j,n,m;
     long lWidth,lHeight;

     AfxGetApp()->BeginWaitCursor();
     lpBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hDib);
     hData=(unsigned char*)FindDIBBits((LPSTR)lpBi);

     lWidth = lpBi->biWidth;
     lHeight = lpBi->biHeight;
     

     // 计算图像每行的字节数
     long lLineBytes = WIDTHBYTES(lWidth * 8);
     
     for(i = 0; i  {
      for(j = 0;j   {
       //目标图像中含有0和255外的其它灰度值
       if(PixelData[i][j] != 255 && PixelData[i][j]!= 0)
        return FALSE;
        
       //目标图像中的当前点先赋成黑色
       *(hData +lLineBytes * i + j) = 0;

       for (m =-1;m < 3;m++ )
        for (n =-1;n < 3;n++)
        {
         if( structure[m+1][n+1] == -1)
          continue;

         if ((i+m>=0)&&(i+m=0)&&(j+n      if (PixelData[i+m][j+n] == 255 )
          { 
           *(hData +lLineBytes * i + j) = 255;
           break;
          }
        }
      }
     }


     ::GlobalUnlock((HGLOBAL)hDib);
        AfxGetApp()->EndWaitCursor();
     // 返回
     return TRUE;
    }

    /*************************************************************************
     *
     * 函数名称:
     *   DilationDIB()
     *
     * 参数:
     *   HDIB hDib    - 指向源DIB图像句柄
     *  unsigned char ** PixelData 像素数组
     *  int   structure[3][3]
          - 自定义的3×3结构元素。
     *
     * 返回值:
     *   BOOL               - 膨胀成功返回TRUE,否则返回FALSE。
     *
     * 说明:
     * 该函数用于对图像进行膨胀运算。结构元素为水平方向或垂直方向的三个点,中间点位于原点;
     * 或者由用户自己定义3×3的结构元素。
     *
     * 要求目标图像为只有0和255两个灰度值的灰度图像。
     ************************************************************************/

    BOOL WINAPI DilationDIB (HDIB hDib, unsigned char ** PixelData, const int structure[3][3])
    {
     
       LPBITMAPINFOHEADER lpBi;
     unsigned char * hData;
     int i,j,n,m;
     long lWidth,lHeight;

     AfxGetApp()->BeginWaitCursor();
     lpBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hDib);
     hData=(unsigned char*)FindDIBBits((LPSTR)lpBi);

     lWidth = lpBi->biWidth;
     lHeight = lpBi->biHeight;
     

     // 计算图像每行的字节数
     long lLineBytes = WIDTHBYTES(lWidth * 8);

     for(i= 0; i {
      for(j= 0;j  {
       //目标图像中含有0和255外的其它灰度值
       if(PixelData[i][j] != 255 && PixelData[i][j]!= 0)
        return FALSE;
        
       //目标图像中的当前点先赋成百色
       *(hData +lLineBytes * i + j) = 255;

       for (m =-1;m <1;m++ )
        for (n =-1;n <1;n++)
        {
         if( structure[m+1][n+1] == -1)
          continue;

         if ((i+m>=0)&&(i+m=0)&&(j+n      if (PixelData[i+m][j+n] == 0 )
          { 
           *(hData +lLineBytes * i + j) =0;
           break;
          }
        }
      }
     }
     
     ::GlobalUnlock((HGLOBAL)hDib);
        AfxGetApp()->EndWaitCursor();
     // 返回
     return TRUE;
    }
    /*************************************************************************
     *
     * 函数名称:
     *   OpenDIB()
     *
     * 参数:
     *   HDIB hDib    - 指向源DIB图像句柄
     *  unsigned char ** PixelData 像素数组
     *   int   nMode  - 开运算方式,0表示水平方向,1表示垂直方向,2表示自定义结构元素。
     *  int   structure[3][3]
          - 自定义的3×3结构元素。
     *
     * 返回值:
     *   BOOL               - 开运算成功返回TRUE,否则返回FALSE。
     *
     * 说明:
     * 该函数用于对图像进行开运算。结构元素为水平方向或垂直方向的三个点,中间点位于原点;
     * 或者由用户自己定义3×3的结构元素。
     *
     * 要求目标图像为只有0和255两个灰度值的灰度图像。
     ************************************************************************/

    BOOL WINAPI OpenDIB (HDIB hDib,unsigned char ** PixelData,const int structure[3][3])

     if (ErosionDIB(hDib, PixelData, structure))
     {
      if (DilationDIB(hDib, PixelData, structure))
      {
       return TRUE;
      }
     }
     return FALSE;
    }


    /*************************************************************************
     *
     * 函数名称:
     *   CloseDIB()
     *
     * 参数:
     *   HDIB hDib    - 指向源DIB图像句柄
     *  unsigned char ** PixelData 像素数组
     *  int   structure[3][3]
          - 自定义的3×3结构元素。
     *
     * 返回值:
     *   BOOL               - 闭运算成功返回TRUE,否则返回FALSE。
     *
     * 说明:
     * 该函数用于对图像进行开运算。结构元素为水平方向或垂直方向的三个点,中间点位于原点;
     * 或者由用户自己定义3×3的结构元素。
     *
     * 要求目标图像为只有0和255两个灰度值的灰度图像。
     ************************************************************************/

    BOOL WINAPI CloseDIB (HDIB hDib, unsigned char ** PixelData, const int structure[3][3])
    {
     if (DilationDIB(hDib, PixelData ,structure))
     {
      if (ErosionDIB(hDib,PixelData ,structure))
      {
       return TRUE;
      }
     }
     return FALSE;

    }
    /*************************************************************************
     *
     * 函数名称:
     *   ThinDIB()
     *
     * 参数:
     *   HDIB hDib    - 指向源DIB图像句柄
     *  unsigned char ** PixelData 像素数组
     * 返回值:
     *   BOOL               - 闭运算成功返回TRUE,否则返回FALSE。
     *
     * 说明:
     * 该函数用于对图像进行细化运算。
     *
     * 要求目标图像为只有0和255两个灰度值的灰度图像。
     ************************************************************************/
    BOOL WINAPI ThiningDIB(HDIB hDib)
    {
    ////////////////////////////////////////////////////////////////////
    //???????????????????????????????????????????????????????????????// 
       LPBITMAPINFOHEADER lpBi;
     LPSTR  hData;
     long lWidth,lHeight;

     AfxGetApp()->BeginWaitCursor();
     lpBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hDib);
     hData=FindDIBBits((LPSTR)lpBi);
     // 指向源图像的指针,缓存图像的指针
     LPSTR lpSrc,lpDst;
     
     // 指向缓存DIB图像的指针
     LPSTR lpNewDIBBits;
     HLOCAL hNewDIBBits;

     //脏标记
     BOOL bModified;

     //循环变量
     long i,j,n, m,nCount;

     //四个条件
     BOOL bCondition1,bCondition2, bCondition3,bCondition4;

     lWidth = WIDTHBYTES(lpBi->biWidth * 8);
     lHeight = lpBi->biHeight;

     //像素值
     unsigned char pixel;

     //5×5相邻区域像素值
     unsigned char neighbour[5][5];

     // 暂时分配内存,以保存新图像
     hNewDIBBits = LocalAlloc(LHND, lWidth * lHeight);

     if (hNewDIBBits == NULL)
     // 分配内存失败
      return FALSE;
     
     // 锁定内存
     lpNewDIBBits = (char * )LocalLock(hNewDIBBits);

     // 初始化新分配的内存,设定初始值为255
     lpDst = (char *)lpNewDIBBits;
     memset(lpDst, (BYTE)255, lWidth * lHeight);

     bModified=TRUE;

     while(bModified)
     {

      bModified = FALSE;
      // 初始化新分配的内存,设定初始值为255
      lpDst = (char *)lpNewDIBBits;
      memset(lpDst, (BYTE)255, lWidth * lHeight);

      for(j = 2; j   {
       for(i = 2;i    {

        bCondition1 = FALSE;
        bCondition2 = FALSE;
        bCondition3 = FALSE;
        bCondition4 = FALSE;

        //由于使用5×5的结构元素,为防止越界,所以不处理外围的几行和几列像素

        // 指向源图像倒数第j行,第i个象素的指针   
        lpSrc = (char *)hData + lWidth * j + i;

        // 指向目标图像倒数第j行,第i个象素的指针   
        lpDst = (char *)lpNewDIBBits + lWidth * j + i;

        //取得当前指针处的像素值,注意要转换为unsigned char型
        pixel = (unsigned char)*lpSrc;

        //目标图像中含有0和255外的其它灰度值
        if(pixel != 255 && *lpSrc != 0)
         //return FALSE;
         continue;
        //如果源图像中当前点为白色,则跳过
        else if(pixel == 255)
         continue;

        //获得当前点相邻的5×5区域内像素值,白色用0代表,黑色用1代表
        for (m = 0;m < 5;m++ )
        {
         for (n = 0;n < 5;n++)
         {
          neighbour[m][n] =(255 - (unsigned char)*(lpSrc + ((4 - m) - 2)*lWidth + n - 2 )) / 255;
         }
        }
    //    neighbour[][]
        //逐个判断条件。
        //判断2<=NZ(P1)<=6
        nCount =  neighbour[1][1] + neighbour[1][2] + neighbour[1][3] \
          + neighbour[2][1] + neighbour[2][3] + \
          + neighbour[3][1] + neighbour[3][2] + neighbour[3][3];
        if ( nCount >= 2 && nCount <=6)
         bCondition1 = TRUE;

        //判断Z0(P1)=1
        nCount = 0;
        if (neighbour[1][2] == 0 && neighbour[1][1] == 1)
         nCount++;
        if (neighbour[1][1] == 0 && neighbour[2][1] == 1)
         nCount++;
        if (neighbour[2][1] == 0 && neighbour[3][1] == 1)
         nCount++;
        if (neighbour[3][1] == 0 && neighbour[3][2] == 1)
         nCount++;
        if (neighbour[3][2] == 0 && neighbour[3][3] == 1)
         nCount++;
        if (neighbour[3][3] == 0 && neighbour[2][3] == 1)
         nCount++;
        if (neighbour[2][3] == 0 && neighbour[1][3] == 1)
         nCount++;
        if (neighbour[1][3] == 0 && neighbour[1][2] == 1)
         nCount++;
        if (nCount == 1)
         bCondition2 = TRUE;

        //判断P2*P4*P8=0 or Z0(p2)!=1
        if (neighbour[1][2]*neighbour[2][1]*neighbour[2][3] == 0)
         bCondition3 = TRUE;
        else
        {
         nCount = 0;
         if (neighbour[0][2] == 0 && neighbour[0][1] == 1)
          nCount++;
         if (neighbour[0][1] == 0 && neighbour[1][1] == 1)
          nCount++;
         if (neighbour[1][1] == 0 && neighbour[2][1] == 1)
          nCount++;
         if (neighbour[2][1] == 0 && neighbour[2][2] == 1)
          nCount++;
         if (neighbour[2][2] == 0 && neighbour[2][3] == 1)
          nCount++;
         if (neighbour[2][3] == 0 && neighbour[1][3] == 1)
          nCount++;
         if (neighbour[1][3] == 0 && neighbour[0][3] == 1)
          nCount++;
         if (neighbour[0][3] == 0 && neighbour[0][2] == 1)
          nCount++;
         if (nCount != 1)
          bCondition3 = TRUE;
        }

        //判断P2*P4*P6=0 or Z0(p4)!=1
        if (neighbour[1][2]*neighbour[2][1]*neighbour[3][2] == 0)
         bCondition4 = TRUE;
        else
        {
         nCount = 0;
         if (neighbour[1][1] == 0 && neighbour[1][0] == 1)
          nCount++;
         if (neighbour[1][0] == 0 && neighbour[2][0] == 1)
          nCount++;
         if (neighbour[2][0] == 0 && neighbour[3][0] == 1)
          nCount++;
         if (neighbour[3][0] == 0 && neighbour[3][1] == 1)
          nCount++;
         if (neighbour[3][1] == 0 && neighbour[3][2] == 1)
          nCount++;
         if (neighbour[3][2] == 0 && neighbour[2][2] == 1)
          nCount++;
         if (neighbour[2][2] == 0 && neighbour[1][2] == 1)
          nCount++;
         if (neighbour[1][2] == 0 && neighbour[1][1] == 1)
          nCount++;
         if (nCount != 1)
          bCondition4 = TRUE;
        }
        if(bCondition1 && bCondition2 && bCondition3 && bCondition4)
        {
         *lpDst = (unsigned char)255;
         bModified = TRUE;
        }
        else
        {
         *lpDst = (unsigned char)0;
        }
       }
      }
       // 复制图像
       memcpy(hData, lpNewDIBBits, lWidth * lHeight);


     }
     // 复制腐蚀后的图像
     memcpy(hData, lpNewDIBBits, lWidth * lHeight);

     // 释放内存
     LocalUnlock(hNewDIBBits);
     LocalFree(hNewDIBBits);
     ::GlobalUnlock((HGLOBAL)hDib);

     // 返回
     return TRUE;
    }

    /*************************************************************************
     *
     * 函数名称:
     *   Fill2DIB()
     *
     * 参数:
     *   LPSTR lpDIBBits    - 指向源DIB图像指针
     *   LONG  lWidth       - 源图像宽度(象素数,必须是4的倍数)
     *   LONG  lHeight      - 源图像高度(象素数)
     * 返回值:
     *   BOOL               - 种子填充成功返回TRUE,否则返回FALSE。
     *
     * 说明:
     * 该函数用于对图像进行种子填充运算。
     *
     * 要求目标图像为只有0和255两个灰度值的灰度图像。
     ************************************************************************/

    BOOL WINAPI Fill2DIB(HDIB hDib, unsigned char ** PixelData,
          const COLORREF bColor,const COLORREF fColor,CPoint point)
    {
     
       LPBITMAPINFOHEADER lpBi;
     unsigned char * hData;
     int i,j;
     long lWidth,lHeight;

     AfxGetApp()->BeginWaitCursor();
     lpBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hDib);
     hData=(unsigned char*)FindDIBBits((LPSTR)lpBi);

     lWidth = lpBi->biWidth;
     lHeight = lpBi->biHeight;
     

     // 计算图像每行的字节数
     long lLineBytes = WIDTHBYTES(lWidth * 8);

     for(i= 0; i {
      for(j= 0;j  {
      }
     }
     
     ::GlobalUnlock((HGLOBAL)hDib);
        AfxGetApp()->EndWaitCursor(); 

     // 返回
     return TRUE;

    }

    /*************************************************************************
     *
     * 函数名称:
     *   FillDIB()
     *
     * 参数:
     *   LPSTR lpDIBBits    - 指向源DIB图像指针
     *   LONG  lWidth       - 源图像宽度(象素数,必须是4的倍数)
     *   LONG  lHeight      - 源图像高度(象素数)
     * 返回值:
     *   BOOL               - 种子填充成功返回TRUE,否则返回FALSE。
     *
     * 说明:
     * 该函数用于对图像进行种子填充运算。
     *
     * 要求目标图像为只有0和255两个灰度值的灰度图像。
     ************************************************************************/
    BOOL Fill(unsigned char ** PixelData,
        const COLORREF bColor,const COLORREF fColor,long x,long y,long height,long width)
    {

     if ((x>=height)||(y>=width)) return FALSE;
     if ((x<0)||(y<0)) return FALSE;
     if (PixelData[x][y]!=bColor) return FALSE;

     if (PixelData[x][y]==bColor)
     {
      PixelData[x][y] = fColor;
      
      Fill(PixelData,bColor,fColor,x-1,y,height,width);
      Fill(PixelData,bColor,fColor,x-1,y+1,height,width);
      Fill(PixelData,bColor,fColor,x-1,y-1,height,width);
      Fill(PixelData,bColor,fColor,x,y-1,height,width);
      Fill(PixelData,bColor,fColor,x,y+1,height,width);
      Fill(PixelData,bColor,fColor,x+1,y,height,width);
      Fill(PixelData,bColor,fColor,x+1,y-1,height,width);
      Fill(PixelData,bColor,fColor,x+1,y+1,height,width);
     }
     return TRUE;
    }

    BOOL WINAPI FillDIB(HDIB hDib, unsigned char ** PixelData,
         const COLORREF bColor,const COLORREF fColor,CPoint point)
    {
       LPBITMAPINFOHEADER lpBi;
     unsigned char * hData;
     unsigned char ** NewPixelData;

     int i,j;
     long lWidth,lHeight;
     CPoint NewPoint;

     AfxGetApp()->BeginWaitCursor();
     lpBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hDib);
     hData=(unsigned char*)FindDIBBits((LPSTR)lpBi);

     lWidth = lpBi->biWidth;
     lHeight = lpBi->biHeight;

     NewPoint.x = lHeight - point.y -1;
     NewPoint.y = point.x ;

     NewPixelData=new unsigned char*[lHeight];
     
     for(i=0; i  NewPixelData[i]=new unsigned char[lWidth];
     
     for(i= 0; i  for(j= 0;j   NewPixelData[i][j] =PixelData[i][j];

     Fill(NewPixelData, bColor,fColor,
      NewPoint.x,NewPoint.y,lHeight,lWidth);
     // 计算图像每行的字节数
     long lLineBytes = WIDTHBYTES(lWidth * 8);

     for(i= 0; i {
      for(j= 0;j  {
       *(hData +lLineBytes * i + j) =NewPixelData[i][j];
      }
     }
     
     for(i = 0; i < lHeight; i++)
          delete [] NewPixelData[i];
            
      delete [] NewPixelData;

     ::GlobalUnlock((HGLOBAL)hDib);
        AfxGetApp()->EndWaitCursor(); 

     // 返回
     return TRUE;
    }

    /*************************************************************************
     *
     * 函数名称:
     *   ContourDIB()
     *
     * 参数:
     *   LPSTR lpDIBBits    - 指向源DIB图像指针
     *   LONG  lWidth       - 源图像宽度(象素数,必须是4的倍数)
     *   LONG  lHeight      - 源图像高度(象素数)
     * 返回值:
     *   BOOL               - 运算成功返回TRUE,否则返回FALSE。
     *
     * 说明:
     * 该函数用于对图像进行轮廓提取运算。
     *
     * 要求目标图像为只有0和255两个灰度值的灰度图像。
     ************************************************************************/

    BOOL WINAPI ContourDIB(HDIB hDib, unsigned char ** PixelData)
    {
       LPBITMAPINFOHEADER lpBi;
     unsigned char * hData;
     int i,j;
     long lWidth,lHeight;

     AfxGetApp()->BeginWaitCursor();
     lpBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hDib);

     hData=(unsigned char*)FindDIBBits((LPSTR)lpBi);

     lWidth = lpBi->biWidth;
     lHeight = lpBi->biHeight;
     

     // 计算图像每行的字节数
     long lLineBytes = WIDTHBYTES(lWidth * 8);

     lHeight=lHeight-1;
     lWidth=lWidth-1;

     for(i= 1; i {
      for(j= 1;j  {
       if(PixelData[i][j] == 0)
       {
        *(hData +lLineBytes * i + j) = (unsigned char)0;
        //如果相邻的八个点都是黑点
        if(PixelData[i-1][j-1]+PixelData[i-1][j]+
           PixelData[i-1][j+1]+PixelData[i][j-1]+
           PixelData[i][j+1]+PixelData[i+1][j-1]+
           PixelData[i+1][j]+PixelData[i+1][j+1]==0)
         *(hData +lLineBytes * i + j)= (unsigned char)255;
       }
      }
     }
     
     ::GlobalUnlock((HGLOBAL)hDib);
        AfxGetApp()->EndWaitCursor();
     return TRUE;

    }

  • blog改版

    日期:2006年10月08日 | 分类:日记

    长假过去了。

    大概是放假放得受了刺激,心血来潮想去拉头发,只为了它能够顺一点,不要那么难打理。也不知怎么的,就孜孜地想着这事儿,简直就像毛主席几年不吃红烧肉一样心痒难耐。于是就去了,完了之后却又嫌太麻烦,几天不能洗不能弯的,成天跟贞子似的披着头发,无限痛苦。还好视觉效果并不是很差。

    人改变了造型,就寻思着把这地儿也变变样子。跑去研究了老半天CSS,找了一堆代码,顺便PS了一下教学楼传了上来,修改、发布、修改、发布……来来回回好几回,却总是页面有错误……真是头都大了。最后发现有一句不能删,删了就出错,可留着却又弄出一片乱七八糟不知道是什么东西出来(就在右边那一栏东东的下方,如果能看到的话),只好牺牲外观确保正确性了……真不知是造了什么孽!

    总觉得自己在自言自语,空间里的日志是一篇篇地更新,评论却没几条,像是在台上唱着独角戏。还好能看到计数器的数字在增加,仿佛听见台下哪怕只是稀稀落落的掌声,至少说明我不是面对着空无一人的观众席。

  • 我承认我自恋

    日期:2006年10月06日 | 分类:日记

    和舅妈、妹妹拍了大头贴,忍不住贴来玩玩,还有早几次照的

    http://conan-whf.blogbus.com/files/1160144701.jpg

    安全起见,偶把亲戚们的脸模糊处理……

    难得的逛了一次街,还算高兴吧!

  • 传个偶做的gif

    日期:2006年10月03日 | 分类:日记

    主要是试试看网易的相册能不能用而已……

    另HC一下帅哥~~

  • Bresenham算法

    日期:2006年10月03日 | 分类:IT

    事先声明:只有C语言版没交过,使用时请自行作修改!

    C语言版:

    #include

    #define MAX 60

    char a[MAX][MAX];
    int i,j,x1,x2,y1,y2,x,y,deltax,deltay,s1,s2,interchange,f;
    void main()
    {
     for (i=0;i  for (j=0;j printf("输入起始和结束坐标 [0,%d]:",MAX);
     scanf("%d%d%d%d",&x1,&y1,&x2,&y2);

     x=x1;
     y=y1;
     deltax=abs(x2-x1);
     deltay=abs(y2-y1);

     if (x2-x1>=0) s1=1;
      else s1=-1;
     if (y2-y1>=0) s2=1;
      else s2=-1;
     if (deltay>deltax)
     {
      int temp=deltax;
      deltax=deltay;
      deltay=temp;
      interchange=1;
     }
      else interchange=0;
     f=2*deltay-deltax;
     for (i=1;i<=deltax;i++)
     {
      a[x][y]=' ';
      if (f>=0)
       if (interchange==1) x=x+s1;
        else y=y+s2;
            f=f-2*deltax;
      if (interchange==1) y=y+s2;
       else x=x+s1;
            f=f+2*deltay;
     }
     for (i=0;i {
      for (j=0;j  putchar('\n');
     }
    }

     

    Matlab版:

    function Bresenham(x1,y1,x2,y2)
    %初始化,生成坐标数组
    deltax=abs(x2-x1);
    deltay=abs(y2-y1);
    if (deltay>deltax)
        temp=deltax;
        deltax=deltay;
        deltay=temp;
        interchange=1;
    else interchange=0;
    end;
    A=ones(1,deltax+1);
    B=A;

    %Bresenham算法
    x=x1;
    y=y1;
    if (x2-x1>=0)
        s1=1;
    else s1=-1;
    end;
    if (y2-y1>=0)
        s2=1;
    else s2=-1;
    end;
    f=2*deltay-deltax;
    for i=1:1:deltax
        A(i)=x;
        B(i)=y;
        if (f>=0)
            if (interchange==1)
                x=x+s1;
            else y=y+s2;
            end;
            f=f-2*deltax;
        end;
        if (interchange==1)
            y=y+s2;
        else x=x+s1;
        end;
        f=f+2*deltay;   
    end;

    %绘制图形
    axis equal;
    line(A,B);

    Delphi版:

    unit Unit1;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, StdCtrls;

    type
      TForm1 = class(TForm)
        Image1: TImage;
        ComboBox1: TComboBox;
        ColorBox1: TColorBox;
        Button1: TButton;
        Memo1: TMemo;
        Label1: TLabel;
        Label2: TLabel;
        Label3: TLabel;
        Label4: TLabel;
        Label5: TLabel;
        Label6: TLabel;
        procedure FormCreate(Sender: TObject);
        procedure down(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;

    var
      Form1: TForm1;
      a,x1,y1,net:integer;

    implementation

    {$R *.dfm}

    {============================初始化=======================================}
    procedure TForm1.FormCreate(Sender: TObject);
    var
      i,j:integer;
    begin
      a:=0;
      memo1.Lines.Clear;
      for i:=1 to image1.Height do
        for j:=1 to image1.Width do Image1.Canvas.Pixels[i,j]:=clwhite;
      memo1.Lines.Clear;
    end;

    {===============================动作处理:鼠标按下==========================}
    procedure TForm1.down(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
      i,j,k,nx,ny,x2,y2,temp,f,s1,s2,dx,dy:integer;
    begin
      inc(a);
      //第一次按下——定位起始点
      if (a mod 2=1) then
        begin
           net:=1 shl (4-form1.ComboBox1.ItemIndex);
           image1.Canvas.Brush.Color:=form1.ColorBox1.Selected;
           x1:=x;
           y1:=y;
           memo1.Lines.Add(format('起始点坐标(%d, %d)',[trunc(x1/net),trunc(y1/net)]));
        end
      //第二次按下——定位结束点
        else begin
              nx:=x1;
              ny:=y1;
              x2:=x;
              y2:=y;
              memo1.Lines.Add(format('结束点坐标(%d, %d)',[x2,y2]));
              memo1.Lines.Add(' ');
              dx:=abs(x2-nx);
              dy:=abs(y2-ny);
              //此处坐标系与迪卡尔体系y轴方向相反,故将s1/s2赋值情况对调
              if x2-x1<=0 then s1:=-1
                else s1:=1;
              if y2-y1<=0 then s2:=-1
                else s2:=1;
              if dy>dx then
                begin
                  temp:=dx;
                  dx:=dy;
                  dy:=temp;
                  temp:=1;
                end
                else temp:=0;
              f:=2*dy-dx;
              //按照选择的分辨率输出直线
              for i:=1 to round(dx/net) do
                begin
                  for j:=nx-(net div 2) to nx+(net div 2) do
                    for k:=ny-(net div 2) to ny+(net div 2) do image1.Canvas.Pixels[j,k]:=form1.ColorBox1.Selected;
                  if f>=0 then
                    begin
                      if temp=1 then nx:=nx+s1*net
                        else ny:=ny+s2*net;
                      f:=f-2*dx;
                    end;
                  if temp=1 then ny:=ny+s2*net
                    else nx:=nx+s1*net;
                  f:=f+2*dy;
                end;
              end;
    end;

    {===================================清除画面=================================}
    procedure TForm1.Button1Click(Sender: TObject);
    var
      i,j:integer;
    begin
      for i:=0 to form1.image1.Height do
        for j:=0 to form1.image1.Width do form1.Image1.Canvas.Pixels[i,j]:=clwhite;
      memo1.Lines.Clear;
    end;

    end.

  • 给小呆

    日期:2006年10月02日 | 分类:评论及其他

    发现我们都是一样的人!

    小时候,似乎是不一样的吧?至少,我的队礼敬得比你标准;至少,脑门被老师点了红点我会擦掉而你却很乖(放心,这是你一辈子的把柄阿~Hia~hia~hia~~~~)……那个时候你真的好可爱啊!

    高中报到的时候,赫然发现了你,当时感觉就像发现了新大陆一样(当时要我们签字不去新加坡的时候我发现了leon,也感觉像发现了新大陆……我自动面壁去!);后来,你选的是生物还是化学?反正就是一起上课,你把一本《三重门》放在课桌里看得全身抽搐,我也跑去买了一本,在家里笑得全身抽搐;湘潭集训,我们同时伸向同一个菜,那个时候就觉得,你怎么总是跟我一样?更奇怪的是,你也不吃葱?!整个电脑组,我们俩好像是最不务正业的人:在你的带领下,我学会上网、关心动漫、痴迷FF……当然我的痴迷程度自然不如你,搬到新机房换了座位以后,我就移情别恋跟hunter一起痴迷Tank Race去了,你却还沉浸在FFSky里面。

    一直觉得,跟你有一种与生俱来的熟悉感,像是自己的兄弟姐妹,干什么都喜欢拉上你,高中三年,几乎没有我去定王台或电脑城身边没有你的情况!(偶的神啊,偶们多么纯洁~完全灭有其他想法!)感谢上帝高中赐予我三个帅哥:R是那种cola一样的男生,超级好喝的饮料但总觉得刺激性太强;H是Tea很有味道值得慢慢品;你是??我不知道!但一定是任何时候喝都觉得舒服的那种东西!这就叫投缘吗?

    好像太煽情了一点……可我真的是看了你的blog才突然明白:这一切,都是因为你跟我太像了哇!我们俩,一样的懒、一样的凭兴趣做事、一样的对做乖宝宝感到厌倦、一样为自己不够好感到苦恼……拥抱拥抱!

    其实……其实……其实我写这个,只是想安慰一下你……上学期我的心情跟你差不多,现在想明白了:像我这种,不追求成就一番大事业,只是想这辈子过得幸福一点,那些费力又烦人的事情,不如不要去争。不用给自己定太高的目标,使把劲能达到的就可以了,然后踏踏实实去做,心里想着这是自己立足所必需的,就能好好完成。

    人生总要有些乐趣的,如果为了更加辉煌的事业什么的而放弃自己的爱好,对我来说太痛苦了!你也是的,对不?虽然也许我的爱好在别人看来很无聊或者难以理解,但只要它是健康的并且不影响正常的生活,我便不会放弃,因为这是我活的快乐的方式。除非是为生活所迫,不然物质生活基本满足便会有精神生活,难道把创造大大超出自身所需要的物质条件所获得的成就感作为精神生活的满足?

    我好像在说教了……也不知你看不看得到?不管怎样,我们共勉吧!

  • 百年校庆

    日期:2006年09月30日 | 分类:日记

    刚回来,好累。头昏脑胀的,感觉都有点发烧了。

    同学去得不多,倒是见到了很多老师、长辈,可是我太害羞,明明很激动也只是淡淡的笑……对同学却不会这样,真是个笨蛋!

    可能是太纷杂没有头绪,竟然不知道该写些什么,算了,就这样吧。什么时候照片整理好了再发就是

    希望李老师的包,至少可以把重要东西找回来。就像我上次丢钱包,虽然小偷连个钢镚儿也不给我留,但证件和银行卡都完好。

  • 发现一个新帅哥

    日期:2006年09月29日 | 分类:娱乐

    看了《东方茱丽叶》,无比超级喜欢亮……那么标致、温文尔雅的帅哥,白马王子一样……尤其是笑起来的样子,是否迷倒众生不知道,我是已经被电晕了!林依晨真是好命~~
    http://conan-whf.blogbus.com/files/1159540753.jpg      http://conan-whf.blogbus.com/files/1159540822.jpg
    吴尊                                            
    出生日期   1980年10月10日
    出生地点   汶莱
    国籍   中国台湾                                                  
    血型   B
    三围尺寸   胸围 (40英寸) ; 腰围 (31英寸) ; 臀围 (38英寸)
    身高   183 厘米
    体重   74 公斤
    鞋号 10 号
    星 座:天平座
    吴尊在汶莱时是健身教练
    以前为伊林的模特儿,现为飞轮海团员之一
    作品:
    <东方茱丽叶 >,吴尊 .... 亮
    个性:害羞,见忘,事业为重。
    嗜好: 打篮球,健身,看书,听音乐,看电影,吃,煮饭和旅行。
    喜欢的颜色:看情况…
    喜欢的食物: 我很爱吃,除了油腻的食物我甚麼都吃。
    喜欢的饮料:无酒精的鸡尾酒饮料 MOCKTAIL
    喜欢的音乐: 看心情
    喜欢的地方: 纽约
    最想去的城市: 纽约
    喜欢的电影: 英雄本色
    最喜欢的季节: 春
    喜欢的卡通人物: 超人    
    最喜欢的花/花语:百合
    几岁初恋:16岁
    喜欢异性类型: 对我而言,最重要的昰感觉。
    最讨厌的事情:失去我身边最重要的人
    最大的愿望: 在生命里做个好与事业有成的人
    做过最难忘的事情: 在照顾去世前的妈妈
    做过最後悔的事情: 在妈妈去世前没花足够的时间在她的身边
    做过最有勇气的事情: 在台湾继续追求我在演艺圈的事业
    团体:飞轮海