2012年5月5日星期六

javaを独学で勉強しています。 今、文字認識について、いろいろ勉強しています。 ...

javaを独学で勉強しています。

今、文字認識について、いろいろ勉強しています。

そこで エッジ検出のプログラムを書こうと思います。でも 書けなくて、 if文とfor文だけでは、書けませんかね?







何が聞きたいのか、いまいちはっきりしませんが、一般的な画像の

エッジ検出ならば、ifとforで書けるんじゃないですか?そんなことは

アルゴリズムの書いてある教科書を読めばわかるでしょう。

もっともjava.awt.imageパッケージにある機能を使えば、簡単なエッジ

抽出くらいはすぐできますけどね。



補足

質問者さんのレベルがよくわかりませんが、質問内容から見て、Javaのみ

ならず、プログラミングの初心者ですよね。

文字認識というのは相当に難しい技術で、かなりの数学的知識も必要です。

エッジ抽出でつまづくような初心者がいきなり手を出すのはどうかなと思

います。

私も概要を知っている程度で、実際にやったことはないですけどね。

とりあえず、エッジ抽出をjava.awt.imageパッケージのクラスで処理する

簡単な方法のみ示しておきます。表示にはswingを使っています。

入力画像はグレースケールで殆どの画像フォーマットがOKです。

(カラーからの変換を入れたら、文字数が多すぎるとなったためです。)

個々のクラスの詳細はAPIリファレンスを見て下さい。

------EdgeDetect.java ----------

// 入力されたグレースケール画像のエッジ抽出を行う。

import java.io.*;

import java.awt.*;

import java.awt.image.*;

import javax.imageio.*;

import javax.swing.*;



/** エッジ抽出を行う。 */

class EdgeDetect {

/** 画面 */

private JFrame frame;

/** エッジ抽出の作用素3x3 */

private static final float[] elms34 = {

0.0f, 1.0f, 0.0f,

1.0f, -4.0f, 1.0f,

0.0f, 1.0f, 0.0f

};

/** イメージ表示用パネル */

class ImagePanel extends JPanel {

/** 表示するイメージ */

protected BufferedImage img;

/** コンストラクタ */

public ImagePanel(BufferedImage img){

this.img = img;

if (img != null){

setPreferredSize(new Dimension(img.getWidth(), img.getHeight()));

}

}

/** 描画処理 */

public void paintComponent(Graphics g){

if (img != null) { g.drawImage(img, 0, 0, this); }

}

}



/** メイン処理 */

public static void main(String[] args){

// コマンド引数チェック

if (args.length != 1){

System.err.println("Usage : java EdgeDetect file");

System.exit(1);

}

File f = new File(args[0]);

BufferedImage img = null;

// イメージデータを読み込む

try {

img = ImageIO.read(f);

}catch(IOException e){

System.err.println("File error : " + e.getMessage());

System.exit(2);

}

// 画像ファイル、タイプ等の出力

if (img != null){

System.err.println("File name : " + args[0] + " Image type : " + img.getType());

}



// エッジ抽出を行い、表示する

EdgeDetect ed = new EdgeDetect(img);

ed.show();

}



/** コンストラクタ */

public EdgeDetect(BufferedImage img){

// エッジ抽出処理を行う

BufferedImage oimg = detect(img);

// 画面フレームを作る

frame = new JFrame();

// クローズボタンの設定

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// 入力画像表示パネルを用意する

ImagePanel pnl = new ImagePanel(oimg);

//パネルを画面に設定する

frame.getContentPane().add(pnl);

// 入力画像画面のサイズを決める

int iw = oimg.getWidth() ;

int ih = oimg.getHeight();

// タイトルを表示する

frame.setTitle("EdgeDetect " + iw + "x" + ih);

// 少し余裕を持たせて、画面の大きさを指定する

frame.setBounds(0, 0, iw+20, ih+40);

}



/** 画面を表示する */

public void show(){

frame.setVisible(true);

}



/** エッジ抽出を行う */

private BufferedImage detect(BufferedImage iimg){

if (iimg == null) return null;

BufferedImage oimg;



// エッジ抽出のための畳込み操作の作用素の生成

Kernel kernel = new Kernel(3, 3, elms34);

// 操作オブジェクト作成

ConvolveOp cop = new ConvolveOp(kernel, ConvolveOp.EDGE_ZERO_FILL, null);



// エッジ抽出の実行

try {

oimg = cop.filter(iimg, null);

}catch (ImagingOpException e){

oimg = null;

System.err.println("detectEdge exception :" + e.getMessage() + "\n");

}

return oimg;

}



}








どの形式の画像を使うのかわかりませんが、BMPファイルでもファイルを取得するメソッドは最低使わないといけないのでは?

没有评论:

发表评论