zoukankan      html  css  js  c++  java
  • 图像处理算法篇1

    Alogrithm.h的全部程序如下:


    #ifndef ALGORITHM_H_INCLUDE
    #define ALGORITHM_H_INCLUDE

    #include <math.h>

    #include "Bitmap.h"

    //图像细化
    int Thining(BYTE* image,DWORD dwWidth,DWORD dwHeight,WORD wBitCount)
    {
     static int erasetable[256]={
      0,0,1,1,0,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,
      0,0,1,1,0,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,
      1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
      1,1,0,0,1,1,0,0,1,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
      0,0,1,1,0,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,
      0,0,1,1,0,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,
      1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,
      1,1,0,0,1,1,0,0,1,1,0,1,1,1,0,0,1,1,0,0,1,1,1,0,1,1,0,0,1,0,0,0
     };

     DWORD dwLineBytes=(dwWidth*wBitCount+31)/32*4;
     BYTE *temp=NULL;
     DWORD i=0;
     DWORD j=0;
     BYTE g=0;
     BYTE zs=0,s=0,ys=0,z=0,y=0,zx=0,x=0,yx=0;
     int num=0;

     temp=(BYTE*)malloc(dwHeight*dwLineBytes*sizeof(BYTE));
     if(!temp)
     {
      return -1;
     }

     if(wBitCount!=8)
     {
      free(temp);
      temp=NULL;
      return -1;
     }

     for(i=0;i<dwHeight;i++)
     {
      for(j=0;j<dwWidth;j++)
      {
       g=*(image+dwLineBytes*i+j);
       if(g<=120)
       {
        *(image+dwLineBytes*i+j)=(BYTE)0;
       }
       else
       {
        *(image+dwLineBytes*i+j)=(BYTE)255;
       }
      }
     }

     memcpy(temp,image,dwLineBytes*dwHeight*sizeof(BYTE));

     for(i=1;i<dwHeight-1;i++)
     {
      for(j=1;j<dwWidth-1;j++)
      {
       g=*(image+dwLineBytes*i+j);
       if(g==0)
       {
        z=*(image+dwLineBytes*i+j-1);
        y=*(image+dwLineBytes*i+j+1);
        if(z==255 || y==255)
        {
         zs=*(image+dwLineBytes*(i+1)+j-1);
         s=*(image+dwLineBytes*(i+1)+j);
         ys=*(image+dwLineBytes*(i+1)+j+1);
         zx=*(image+dwLineBytes*(i-1)+j-1);
         x=*(image+dwLineBytes*(i-1)+j);
         yx=*(image+dwLineBytes*(i-1)+j+1);
         num=zs/255+s/255*2+ys/255*4+z/255*8+y/255*16+zx/255*32+x/255*64+yx/255*128;
         if(erasetable[num]==1)
         {
          *(temp+dwLineBytes*i+j)=(BYTE)255;
          *(image+dwLineBytes*i+j)=(BYTE)255;
         }
        }
       }
      }
     }

     for(i=1;i<dwHeight-1;i++)
     {
      for(j=1;j<dwWidth-1;j++)
      {
       g=*(image+dwLineBytes*i+j);
       if(g==0)
       {
        s=*(image+dwLineBytes*(i+1)+j);
        x=*(image+dwLineBytes*(i-1)+j);
        if(s==255 || x==255)
        {
         zs=*(image+dwLineBytes*(i+1)+j-1);
         z=*(image+dwLineBytes*i+j-1);
         y=*(image+dwLineBytes*i+j+1);
         ys=*(image+dwLineBytes*(i+1)+j+1);
         zx=*(image+dwLineBytes*(i-1)+j-1);
         yx=*(image+dwLineBytes*(i-1)+j+1);
         num=zs/255+s/255*2+ys/255*4+z/255*8+y/255*16+zx/255*32+x/255*64+yx/255*128;
         if(erasetable[num]==1)
         {
          *(temp+dwLineBytes*i+j)=(BYTE)255;
          *(image+dwLineBytes*i+j)=(BYTE)255;
         }
        }
       }
      }
     }

     memcpy(image,temp,dwHeight*dwLineBytes*sizeof(BYTE));
     free(temp);
     temp=NULL;
     return 0;
    }

    //图像膨胀
    int Dilation(BYTE* image,DWORD dwWidth,DWORD dwHeight,WORD wBitCount,
         int type,int num)
    {
     DWORD dwLineBytes=(dwWidth*wBitCount+31)/32*4;
     DWORD i=0;
     DWORD j=0;
     DWORD n=0;
     BYTE b=0;
     BYTE g=0;
     BYTE r=0;
     double avg=0;
     BYTE *temp=NULL;
     int k=0;

     if(image==NULL)
     {
      return -1;
     }
     if(num!=3 && num!=5 &&num!=7)
     {
      return -1;
     }

     temp=(BYTE*)malloc(dwHeight*dwLineBytes*sizeof(BYTE));
     if(!temp)
     {
      return -1;
     }
     memset(temp,255,dwLineBytes*dwHeight*sizeof(BYTE));

     if(wBitCount==8)
     {
      //如果为非二值图像,则转化为二值图像
      for(i=0;i<dwHeight;i++)
      {
       for(j=0;j<dwWidth;j++)
       {
        g=*(image+dwLineBytes*i+j);
        if(g>=120)
        {
         *(image+dwLineBytes*i+j)=255;
        }
        else
        {
         *(image+dwLineBytes*i+j)=0;
        }

       }
      }

      if(type==0)
      {
       //水平方向
       for(i=0;i<dwHeight;i++)
       {
        for(j=(num-1)/2;j<dwWidth-(num-1)/2;j++)
        {
         for(k=-(num-1)/2;k<=(num-1)/2;k++)
         {
          g=*(image+dwLineBytes*i+j+k);
          if(g==0)
          {
           *(temp+dwLineBytes*i+j)=0;
           break;
          }
         }
        }
       }
      }
      else
      {
       //垂直方向
       for(i=(num-1)/2;i<dwHeight-(num-1)/2;i++)
       {
        for(j=0;j<dwWidth;j++)
        {
         for(k=-(num-1)/2;k<=(num-1)/2;k++)
         {
          g=*(image+dwLineBytes*(i+k)+j);
          if(g==0)
          {
           *(temp+dwLineBytes*i+j)=0;
           break;
          }
         }
        }
       }
      }
     }
     else if(wBitCount==24)
     {
      //如果不是二值图像,需要先转换为二值图像
      for(i=0;i<dwHeight;i++)
      {
       for(j=0,n=0;j<dwWidth*3;j++,n++)
       {
        b=*(image+dwLineBytes*i+j);
        j++;
        g=*(image+dwLineBytes*i+j);
        j++;
        r=*(image+dwLineBytes*i+j);

        avg=(b+g+r)/3.0;

        if(avg>=120)
        {
         avg=255;
        }
        else
        {
         avg=0;
        }

        *(image+dwLineBytes*i+n)=(BYTE)avg;
        n++;
        *(image+dwLineBytes*i+n)=(BYTE)avg;
        n++;
        *(image+dwLineBytes*i+n)=(BYTE)avg;
       }
      }

      if(type==0)
      {
       //水平方向
       for(i=0;i<dwHeight;i++)
       {
        for(j=(num-1)/2;j<(dwWidth-(num-1)/2)*3;j++)
        {
         for(k=-(num-1)/2;k<=(num-1)/2;k++)
         {
          b=*(image+dwLineBytes*i+j+k*3);
          g=*(image+dwLineBytes*i+j+1+k*3);
          r=*(image+dwLineBytes*i+j+2+k*3);
          if(b==0 && g==0 && r==0)
          {
           *(temp+dwLineBytes*i+j)=0;
           j++;
           *(temp+dwLineBytes*i+j)=0;
           j++;
           *(temp+dwLineBytes*i+j)=0;
           break;
          }
         }
        }
       }
      }
      else
      {
       //垂直方向
       for(i=(num-1)/2;i<dwHeight-(num-1)/2;i++)
       {
        for(j=0;j<dwWidth*3;j++)
        {
         for(k=-(num-1)/2;k<=(num-1)/2;k++)
         {
          b=*(image+dwLineBytes*(i+k)+j);
          g=*(image+dwLineBytes*(i+k)+j+1);
          r=*(image+dwLineBytes*(i+k)+j+2);
          if(b==0 && g==0 && r==0)
          {
           *(temp+dwLineBytes*i+j)=0;
           j++;
           *(temp+dwLineBytes*i+j)=0;
           j++;
           *(temp+dwLineBytes*i+j)=0;
           break;
          }
         }
        }
       }
      }
     }
     else
     {
      free(temp);
      temp=NULL;
      return -1;
     }

     memcpy(image,temp,dwLineBytes*dwHeight*sizeof(BYTE));
     free(temp);
     temp=NULL;
     return 0;
    }

    //图像腐蚀
    int Erosion(BYTE* image,DWORD dwWidth,DWORD dwHeight,WORD wBitCount,
        int type,int num)
    {
     DWORD dwLineBytes=(dwWidth*wBitCount+31)/32*4;
     DWORD i=0;
     DWORD j=0;
     DWORD n=0;
     BYTE b=0;
     BYTE g=0;
     BYTE r=0;
     double avg=0;
     BYTE *temp=NULL;
     int k=0;

     if(image==NULL)
     {
      return -1;
     }
     if(num!=3 && num!=5 && num!=7)
     {
      return -1;
     }

     temp=(BYTE*)malloc(dwHeight*dwLineBytes*sizeof(BYTE));
     if(!temp)
     {
      return -1;
     }
     memset(temp,0,dwLineBytes*dwHeight*sizeof(BYTE));

     if(wBitCount==8)
     {
      //如果为非二值图像,则转化为二值图像
      for(i=0;i<dwHeight;i++)
      {
       for(j=0;j<dwWidth;j++)
       {
        g=*(image+dwLineBytes*i+j);
        if(g>=120)
        {
         *(image+dwLineBytes*i+j)=255;
        }
        else
        {
         *(image+dwLineBytes*i+j)=0;
        }

       }
      }

      if(type==0)
      {
       //水平方向
       for(i=0;i<dwHeight;i++)
       {
        for(j=(num-1)/2;j<dwWidth-(num-1)/2;j++)
        {
         for(k=-(num-1)/2;k<=(num-1)/2;k++)
         {
          g=*(image+dwLineBytes*i+j+k);
          if(g==255)
          {
           *(temp+dwLineBytes*i+j)=255;
           break;
          }
         }
        }
       }
      }
      else
      {
       //垂直方向
       for(i=(num-1)/2;i<dwHeight-(num-1)/2;i++)
       {
        for(j=0;j<dwWidth;j++)
        {
         for(k=-(num-1)/2;k<=(num-1)/2;k++)
         {
          g=*(image+dwLineBytes*(i+k)+j);
          if(g==255)
          {
           *(temp+dwLineBytes*i+j)=255;
           break;
          }
         }
        }
       }
      }
     }
     else if(wBitCount==24)
     {
      //如果不是二值图像,需要先转换为二值图像
      for(i=0;i<dwHeight;i++)
      {
       for(j=0,n=0;j<dwWidth*3;j++,n++)
       {
        b=*(image+dwLineBytes*i+j);
        j++;
        g=*(image+dwLineBytes*i+j);
        j++;
        r=*(image+dwLineBytes*i+j);

        avg=(b+g+r)/3.0;

        if(avg>=120)
        {
         avg=255;
        }
        else
        {
         avg=0;
        }

        *(image+dwLineBytes*i+n)=(BYTE)avg;
        n++;
        *(image+dwLineBytes*i+n)=(BYTE)avg;
        n++;
        *(image+dwLineBytes*i+n)=(BYTE)avg;
       }
      }

      if(type==0)
      {
       //水平方向
       for(i=0;i<dwHeight;i++)
       {
        for(j=(num-1)/2;j<(dwWidth-(num-1)/2)*3;j++)
        {
         for(k=-(num-1)/2;k<=(num-1)/2;k++)
         {
          b=*(image+dwLineBytes*i+j+k*3);
          g=*(image+dwLineBytes*i+j+1+k*3);
          r=*(image+dwLineBytes*i+j+2+k*3);
          if(b==255 && g==255 && r==255)
          {
           *(temp+dwLineBytes*i+j)=255;
           j++;
           *(temp+dwLineBytes*i+j)=255;
           j++;
           *(temp+dwLineBytes*i+j)=255;
           break;
          }
         }
        }
       }
      }
      else
      {
       //垂直方向
       for(i=(num-1)/2;i<dwHeight-(num-1)/2;i++)
       {
        for(j=0;j<dwWidth*3;j++)
        {
         for(k=-(num-1)/2;k<=(num-1)/2;k++)
         {
          b=*(image+dwLineBytes*(i+k)+j);
          g=*(image+dwLineBytes*(i+k)+j+1);
          r=*(image+dwLineBytes*(i+k)+j+2);
          if(b==255 && g==255 && r==255)
          {
           *(temp+dwLineBytes*i+j)=255;
           j++;
           *(temp+dwLineBytes*i+j)=255;
           j++;
           *(temp+dwLineBytes*i+j)=255;
           break;
          }
         }
        }
       }
      }
     }
     else
     {
      free(temp);
      temp=NULL;
      return -1;
     }

     memcpy(image,temp,dwLineBytes*dwHeight*sizeof(BYTE));
     free(temp);
     temp=NULL;
     return 0;
    }

    //图像开闭运算
    int OpenClose(BYTE *image,DWORD dwWidth,DWORD dwHeight,WORD wBitCout,
          int type,int direction,int num)
     
     if(num!=3 && num!=5 && num!=7)
     {
      return -1;
     }
     
     if(type==0)
     {//开运算
      Erosion(image,dwWidth,dwHeight,wBitCout,direction,num);
      Dilation(image,dwWidth,dwHeight,wBitCout,direction,num);
      return 0;
     }
     else
     {//闭运算
      Dilation(image,dwWidth,dwHeight,wBitCout,direction,num);
      Erosion(image,dwWidth,dwHeight,wBitCout,direction,num);
      return 0;
     }
    }

    //图像窗口变换
    int WindowTranslation(BYTE *image,DWORD dwWidth,DWORD dwHeight,WORD wBitCount,
           int down,int up)
    {
     DWORD height=dwHeight;
     DWORD width=dwWidth;
     WORD bitCount=wBitCount;
     DWORD lineBytes=(width*bitCount+31)/32*4;
     BYTE *temp=image;
     DWORD i=0;
     DWORD j=0;
     DWORD n=0;
     BYTE g=0;
     BYTE b=0;
     BYTE r=0;
     double avg=0;
     
     if(bitCount==8)
     {
      for(i=0;i<height;i++)
      {
       for(j=0;j<width;j++)
       {
        g=*(temp+lineBytes*(height-1-i)+j);
        if(g<down)
        {
         *(temp+lineBytes*(height-1-i)+j)=0;
        }
        if(g>up)
        {
         *(temp+lineBytes*(height-1-i)+j)=255;
        }
       }
      }
     }
     else if(bitCount==24)
     {
      for(i=0;i<height;i++)
      {
       for(j=0,n=0;j<width*3;j++,n++)
       {
        b=*(temp+lineBytes*i+j);
        j++;
        g=*(temp+lineBytes*i+j);
        j++;
        r=*(temp+lineBytes*i+j);
        
        avg=(b+g+r)/3.0;
        if(avg<down) avg=0;
        if(avg>up) avg=255;
        
        *(temp+lineBytes*i+n)=(BYTE)avg;
        n++;
        *(temp+lineBytes*i+n)=(BYTE)avg;
        n++;
        *(temp+lineBytes*i+n)=(BYTE)avg;
       }
      }
     }
     else
     {
      return -1;
     }

     return 0;
    }

    //图像对数变换
    int LogTranslation(BYTE *image,DWORD dwWidth,DWORD dwHeight,WORD wBitCount,
           int k)
    {
     DWORD height=dwHeight;
     DWORD width=dwWidth;
     WORD bitCount=wBitCount;
     DWORD lineBytes=(width*bitCount+31)/32*4;
     BYTE *temp=image;
     DWORD i=0;
     DWORD j=0;
     DWORD n=0;
     BYTE b=0;
     BYTE g=0;
     BYTE r=0;

     if(temp==NULL)
     {
      return -1;
     }
     
     if(bitCount==8)
     {
      for(i=0;i<height;i++)
      {
       for(j=0;j<width;j++)
       {
        g=*(temp+lineBytes*i+j);
        *(temp+lineBytes*i+j)=(BYTE)(k*log(g+1));
       }
      }
     }
     else if(bitCount==24)
     {
      for(i=0;i<height;i++)
      {
       for(j=0,n=0;j<width*3;j++,n++)
       {
        b=*(temp+lineBytes*i+j);
        j++;
        g=*(temp+lineBytes*i+j);
        j++;
        r=*(temp+lineBytes*i+j);
        
        *(temp+lineBytes*i+n)=(BYTE)(k*log(b+1));
        n++;
        *(temp+lineBytes*i+n)=(BYTE)(k*log(g+1));
        n++;
        *(temp+lineBytes*i+n)=(BYTE)(k*log(r+1));
       }
      }
     }
     else
     {
      return -1;
     }

     return 0;
    }

  • 相关阅读:
    vue-loader介绍和单页组件介绍
    webpack的插件 http-webpack-plugin。 webpack-dev-server
    webpack的介绍
    Axios 的基本使用
    如何使用 re模块的, spilt.
    为 JS 的字符串,添加一个 format 的功能。
    另一种分页器 不依赖Paginator模块的方法
    Socket初识
    网络协议
    双下方法补充以及异常处理
  • 原文地址:https://www.cnblogs.com/djcsch2001/p/1960192.html
Copyright © 2011-2022 走看看