FreeImage图形2值化

这几天使用freeimage感觉很不错

以前大致使用了点devil

 

这个freeimage就是一个头文件一个静态库,一个动态库感觉很方便的

其使用大致如下(以后要时间),再写点代码

 

使用 FreeImage_Initialise();来初始化库
使用 FreeImage_DeInitialise();来卸载库

通过以下代码来载入文件
fif = FreeImage_GetFileType(filename, 0);
if(fif == FIF_UNKNOWN)
 fif = FreeImage_GetFIFFromFilename(filename);
if(fif == FIF_UNKNOWN)
 return false;
if(FreeImage_FIFSupportsReading(fif))
 dib = FreeImage_Load(fif, filename);
if(!dib)
 return false;
 

获取位图数据
bits = FreeImage_GetBits(dib);
高和宽
width = FreeImage_GetWidth(dib);
height = FreeImage_GetHeight(dib); 

在数据处理完之后别忘了  FreeImage_Unload(dib);

另外可以通过FreeImage_GetVersion来获取当前版本
通过FreeImage_Allocate来分配一个新的空间,其bpp一般设置为24
FreeImage_Save为文件保存
FreeImage_GetBits为获取数据指针
FreeImage_SetPixelColor为设置指定点的颜色
FreeImage_GetBPP为获取位深
FreeImage_Threshold为设置阈值
FreeImage_Dither为彩色图片灰度处理,其需要一个涉及抖动算法的参数
FreeImage_RotateClassic为图型旋转,可选角度为0,90,180,270
FreeImage_FlipHorizontal,FreeImage_FlipVertical这二个为图形翻转  逆时针的
FreeImage_Rescale为图形缩放 第二个参数为滤波算法
主要涉及的就这么多了

 

在逐个处理像素的情况下,感觉直接取一行像素再处理的话比较好。


另外,对于256色变为0-1黑白图
采用网上的大律法 (OTUS)做出来的效果感觉很不错
如下:

int otsu (unsigned char *image, int rows, int cols, int x0, int y0, int dx, int dy)
{

  unsigned char *np;      // 图像指针
  int thresholdValue=1; // 阈值
  int ihist[256];             // 图像直方图,256个点

  int i, j, k;          // various counters
  int n, n1, n2, gmin, gmax;
  double m1, m2, sum, csum, fmax, sb;

  // 对直方图置零...
  memset(ihist, 0, sizeof(ihist));

  gmin=255; gmax=0;
  // 生成直方图
  for (i = y0 + 1; i < y0 + dy - 1; i++) {
    np = ?[i*cols+x0+1];
    for (j = x0 + 1; j < x0 + dx - 1; j++) {
      ihist[*np]++;
      if(*np > gmax) gmax=*np;
      if(*np < gmin) gmin=*np;
      np++; /* next pixel */
    }
  }

  // set up everything
  sum = csum = 0.0;
  n = 0;

  for (k = 0; k <= 255; k++) {
    sum += (double) k * (double) ihist[k];    /* x*f(x) 质量矩*/
    n   += ihist[k];                          /*  f(x)    质量    */
  }

  if (!n) {
    // if n has no value, there is problems...
    fprintf (stderr, "NOT NORMAL thresholdValue = 160/n");
    return (160);
  }

  // do the otsu global thresholding method
  fmax = -1.0;
  n1 = 0;
  for (k = 0; k < 255; k++) {
    n1 += ihist[k];
    if (!n1) { continue; }
    n2 = n - n1;
    if (n2 == 0) { break; }
    csum += (double) k *ihist[k];
    m1 = csum / n1;
    m2 = (sum - csum) / n2;
    sb = (double) n1 *(double) n2 *(m1 - m2) * (m1 - m2);
    /* bbg: note: can be optimized. */
    if (sb > fmax) {
      fmax = sb;
      thresholdValue = k;
    }
  }
 
   return(thresholdValue);
}

你可能感兴趣的:(算法,image,UP,图形,n2)