list5.txt FeatureWidthRatio.java import java.awt.image.BufferedImage; import java.awt.Graphics; import java.awt.Color; // // 文字画像の上部と下部の幅の比率を特徴量として計算するクラス // class FeatureWidthRatio implements FeatureEvaluater { // 上部の幅と下部の幅 float upper_width; float lower_width; // 各行の幅(画像の各行の両端にあるドットのX座標の差、行にひとつもドットがなければ 0) protected int line_width[]; // 上部・中央部・下部の行番号 protected int upper_line; protected int middle_line; protected int lower_line; // 最後に特徴量計算を行った画像(描画用) protected BufferedImage last_image; // 特徴量の名前を返す public String getFeatureName() { return "上下の幅の比(上部の幅 / 下部の幅)"; } // 文字画像から1次元の特徴量を計算する public float evaluate( BufferedImage image ) { int height = image.getHeight(); int width = image.getWidth(); // 画像を記録(描画用) last_image = image; line_width = new int[ height ]; // 各行の幅を計算(各行の両端のドットのX座標を調べる) // 要実装 // 中央部(幅が最小になる行)を探索 // 要実装 // 上部(幅が最大になる行)を探索 // 要実装 // 下部(幅が最大になる行)を探索 // 要実装 // 上部・下部の幅を取得 // 要実装 // 描画テスト用に適当な値を計算 middle_line = height / 2; upper_line = middle_line - middle_line / 2; lower_line = middle_line + height / 2; upper_width = width; lower_width = width; // 特徴量(上部の幅 / 下部の幅)を計算 return upper_width / lower_width; } // 最後に行った特徴量計算の結果を描画する public void paintImageFeature( Graphics g ) { if ( last_image == null ) return; // 文字画像を描画 int ox = 0, oy = 0; g.drawImage( last_image, ox, oy, null ); // 上部・中央部・下部にラインを描画 g.setColor( Color.RED ); g.drawLine( ox, oy + upper_line, ox + last_image.getWidth(), oy + upper_line ); g.setColor( Color.BLUE ); g.drawLine( ox, oy + middle_line, ox + last_image.getWidth(), oy + middle_line ); g.setColor( Color.RED ); g.drawLine( ox, oy + lower_line, ox + last_image.getWidth(), oy + lower_line ); // 特徴量を表示 String message; g.setColor( Color.RED ); message = "上部の幅: " + upper_width; g.drawString( message, ox, oy + 16 ); message = "下部の幅: " + lower_width; g.drawString( message, ox, oy + 32 ); message = "特徴量(上部の幅 / 下部の幅): " + upper_width / lower_width; g.drawString( message, ox, oy + 48 ); } }