Make Oneself More Strong

mcs51a( 高兴就写点:-),不高兴就不写 )

图像的自动剪切 (Auto crop)

      图像在处理过程中,有时需要去除一些无用的背景,限制处理范围,以提高图像下一步处理的速度。
     下面这个函数主要实现了对二值化后的8位DIB查找范围的功能。其中参数c为背景的颜色.

  1void FindBlankBound(LPBYTE src,  RECT & bound,INT c,INT limit)
  2{
  3    int w = DIBWidth(src);
  4    int h = DIBHeight(src);
  5    int bitCount=DIBBitCount(src);
  6    int rowstride = DIBCalBytesPerRow(w,bitCount);
  7    int startY = 0, endY = 0;
  8    int startX = 0, endX = 0;
  9    int fillColor= 255-c;
 10    
 11    BYTE* srcData0 = (BYTE*)DIBGetPixelPtr(src,0,0);
 12    BYTE * srcData = srcData0;
 13    
 14    int i, j;
 15    LONG x0,y0,x1,y1;
 16    x0=bound.left;
 17    y0=bound.top;
 18    x1=bound.right;
 19    y1=bound.bottom;
 20    
 21    CLAMP(x0,0,w);
 22    CLAMP(x1,0,w);
 23    CLAMP(y0,0,h);
 24    CLAMP(y1,0,h);
 25
 26    BOOL bFind=FALSE;
 27
 28    for (i = x0; i < x1; ++i)
 29    {
 30        startY = y0;
 31        endY = y0;
 32
 33        for (j = y0; j < y1; ++j)
 34        {
 35            srcData = srcData0 + j * rowstride;    
 36            endY = j;
 37            if(srcData[i]==c) ///FIND COLOR 
 38            ///if (IsBlock(srcData0,w,h,i,j,c))

 39                break;
 40        }

 41        
 42        x0 = i; ///
 43        if (abs((endY - startY) - (y1 - y0)) > limit)
 44            break;
 45        
 46        bFind=TRUE;
 47        for (j = 0; j < h; ++j)
 48        {
 49            *( srcData0 + j * rowstride + i) = fillColor;
 50        }

 51        
 52    }

 53    
 54    
 55    
 56    for (i = (x1 - 1); i >= x0; --i)
 57    {
 58        startY = y0;
 59        endY = y0;
 60        for (j = y0; j < y1; ++j)
 61        {
 62            srcData = srcData0 + j * rowstride;
 63            endY = j;
 64            
 65            if(srcData[i]==c)
 66            ///if (IsBlock(srcData0,w,h,i,j,c))
 67                    break;
 68            
 69        }

 70        
 71        x1 = i + 1;
 72        if (abs((endY - startY) - (y1 - y0)) > limit)
 73            break;
 74        
 75        for (j = 0; j < h; ++j)
 76        {
 77          *( srcData0 + j * rowstride + i) = fillColor;
 78        }

 79        
 80    }

 81    
 82    if ((x1-x0) <= 1)
 83    {
 84        y0 = y1;
 85    }

 86    
 87    for (j = y0; j < y1; ++j)
 88    {
 89        
 90        startX = x0;
 91        endX = x0;
 92        srcData = srcData0 + j * rowstride;
 93        
 94        for (i = x0; i < x1; ++i)
 95        {
 96            endX = i;
 97            if(srcData[i]==c)
 98            ///if (IsBlock(srcData0,w,h,i,j,c))
 99                break;
100        }

101        
102        y0 = j;
103        if (abs(endX - startX - (x1 - x0)) > limit)
104            break;
105        
106        for (i = 0; i < w; ++i)
107        {
108            srcData[i] = fillColor;
109        }

110    }

111    
112    for (j = (y1 - 1); j >= y0; --j)
113    {
114        
115        startX = x0;
116        endX = x0;
117        srcData = srcData0 + j * rowstride;
118        for (i = x0; i < x1; ++i)
119        {
120            endX = i;
121            if(srcData[i]==c)
122            ///if (IsBlock(srcData0,w,h,i,j,c))
123                break;
124            
125        }

126        
127        
128        y1 = j+1;
129        if (abs(endX - startX - (x1 - x0)) > limit)
130            break;
131        
132        for (i = 0; i < w; ++i)
133        {
134            srcData[i] = fillColor;
135        }

136    }

137
138    bound.left=x0;
139    bound.top=y0;
140    bound.right=x1;
141    bound.bottom=y1;
142    
143}


 

posted on 2010-02-07 08:36 mcs51a 阅读(269) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理