Exemplo n.º 1
0
double
Get_Skew::histogram( const Raster &raster, double angle)
{
  int    i;
  double sum;
  double mean;
  double angle_diff  = tan(angle / (180.0 / M_PI));
  int    diff_y      = -static_cast<int>( raster.width() * angle_diff);
  int    min_y       = max( 0, diff_y);
  int    max_y       = min( static_cast<int>( raster.height())
                          , raster.height() + diff_y);
  int    num_rows;
  Fixed  dx;
  int    dy;


  if (raster.height() > m_max_rows) {
    delete []m_rows;
    m_rows = new unsigned[ raster.height()];
    m_max_rows = raster.height();
  }
  num_rows = (max_y - min_y) / m_sample_skip + 1;

  if (angle < 0) {
    dy = -1;
  } else {
    dy = +1;
  }
  if ((-0.05 < angle) && (angle < 0.05)) {
    dx = static_cast<int>( raster.width());
  } else {
    dx = dy / (tan( angle / (180.0 / M_PI)));
  }

  for (i = 0; i < num_rows; ++i) {
    m_rows[ i] = cast_ray( raster, min_y + i * m_sample_skip, dx, dy);
  }

  sum = 0.0;
  for (i = 0; i < num_rows; ++i) {
    sum += m_rows[ i];
  }
  mean = sum / num_rows;

  sum = 0.0;
  for (i = 0; i < num_rows; ++i) {
    sum += sqr( m_rows[ i] - mean);
  }

  return sum / num_rows;
}
Exemplo n.º 2
0
bool
Invert::do_invert( const Raster &src, Raster &dest)
{
  try {
    if (&src != &dest) {
      dest.redimension( src.width(), src.height(), src.depth(), src.interp());
    }

    size_t        words = src.data_words();
    Raster_Word * s     = src.raster_word();
    Raster_Word * d     = src.raster_word();

    for (size_t i = 0; i < words; ++i) {
      d[ i] = ~s[ i];
    }
    return true;
  }
  catch (...) {
    return false;
  }
}
Exemplo n.º 3
0
unsigned
Get_Skew::cast_ray( const Raster &raster, int row, const Fixed &dx, int dy)
{
  unsigned  bits  = 0;
  Fixed     start = 0;
  Fixed     end   = 0;
  Fixed     width = static_cast<int>( raster.width());
  int       r     = row;

  while (start < width) {
    end = start + dx;
    if (end > width) {
      end = width;
    }
    bits += bit_count( raster[ r]
                     , static_cast<int>( start)
                     , static_cast<int>( end));
    start = end;
    r += dy;
  }
  
  return bits;
}