ジメジメする梅雨のお悩み、一挙解決! >>

今、java言語で、JPEG形式の画像を白黒の二値画像に変換させるプログラムを考えているのですが、ピクセルの色の取得法がよく分からず、変換できません。
どのようにしたら、白黒の二値画像になるのか、簡単なプログラムを教えてもらえませんか?

このQ&Aに関連する最新のQ&A

A 回答 (3件)

要するに、あるイメージを白黒2階調に変換したイメージを作りたい、ということと考えればいいんでしょうか?



方法はいろいろ考えられますが、まぁフィルターを使うのが一番手っ取り早いでしょう。
イメージをBufferedImageとして用意し、ByteLookupTableを作成、それをもとにLookupOpを作ってフィルター処理します。
あらかじめ、0~255の各輝度の階調ごとに変換する値を指定したbyte配列を用意しておきます。これを使って、BufferedImageの輝度をフィルター処理します。

// import java.awt.Image.*;

BufferedImage img1;
BufferedImage img2;
ing w = 500; // イメージのwidth
int h = 300; // イメージのheight

img = Toolkit.getDafaultToolkit.getImage("hoge.jpg");
try {
img1 = new BufferedImage(w,h,BUfferedImage.TYPE_INT_ARGB);
img2 = new BufferedImage(w,h,BUfferedImage.TYPE_INT_RGB);
Graphics2D g = img1.createGraphics();
g.drawImage(img,0,0,this); // とりあえずthisで
g.dispose();
byte[] arr = new byte[256]; // これが変換用のテーブル
for(int i = 0;i < 256;i++)
arr[i] = (byte)(i < 128 ? 0 : 255); // テーブル準備
ByteLookupTable lt = new ByteLookupTable(0,arr);
LookupOp lo = new LookupOp(lt,null);
lo.filter(img1,img2); // フィルター処理
} catch ・・・以下略・・・

例えば、こんな感じで2階調のイメージにフィルター処理されたimg2ができあがります。階調の感じは、byte配列の値をいろいろと調整すればいいでしょう。

BufferedImage,ByteLookupTable,LookupOpについて調べてみるとよいでしょう。
    • good
    • 0

 今晩は。



 あまり詳しくはないですが、
java.awt.image.SampleModel、
java.awt.image.Raster、
java.awt.image.WritableRaster、
java.awt.image.BufferedImage

等を使うのではないでしょうか。java.awt.image.SampleModel
の解説に、色について少し書いてあります。
    • good
    • 0

「Java2 グラフィックプログラミング入門」


中山茂
技報堂出版
ISBN4-7655-3320-4

が値段もお手ごろですし、サンプルも多く、比較的よくまとまっていたと思います。これあたりから手をつけてみてはいかかでしょうか?
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qjavaのpixelの色の指定に関して

javaの色に関して質問します。

現在PixelGrabberで取得したpixelの中である条件を満たすpixelを指定の色に変換するプログラムを書いているのですが、自分が指定している色と実際に出力される色との違いに悩んでいます。

私が調べた範囲の理解だと
pixelはint形式で上の桁から1バイトずつα値(透明度),R,G,Bと表現していると考えています。そこで黒と白を

白=0x00ffffff
黒=0x00000000

と指定しているのですが、真っ黒になってしまいます。指定した色で塗るために知恵を貸してください。お願いします。

----------------実際のアルゴリズムとデータ----------------
ある閾値よりも濃い色→黒
そうでなければ   →白
この値をintの配列にいれ直す
配列からMemoryImageSorceを作る。
bufferedImageに変換して
ImageIOのwriteメソッドで書き込む。
---------------------------結果---------------------------
添付の画像

グレースケールっぽい画像を二値化

javaの色に関して質問します。

現在PixelGrabberで取得したpixelの中である条件を満たすpixelを指定の色に変換するプログラムを書いているのですが、自分が指定している色と実際に出力される色との違いに悩んでいます。

私が調べた範囲の理解だと
pixelはint形式で上の桁から1バイトずつα値(透明度),R,G,Bと表現していると考えています。そこで黒と白を

白=0x00ffffff
黒=0x00000000

と指定しているのですが、真っ黒になってしまいます。指定した色で塗るために知恵を貸してください。お願いし...続きを読む

Aベストアンサー

変換結果が、こんな感じで、良いのかな??
青一色にしてみました。

QJPG画像をカラーから白黒に変換したい

履歴書などに使う写真(カラーでも問題ないのですが、提出先によっては白黒のほうがいいとこもあるようで)のために、カラーJPG画像を白黒に変換したいのですが、なにか簡単にできるソフト(フリーソフトがいいのですが)ありますでしょうか?? トリミングはマイクロソフトピクチャーマネージャーがあるので、問題はないのですが。

Aベストアンサー

> トリミングはマイクロソフトピクチャーマネージャーがあるので、問題はないのですが。

こちらを使うなら、色の調整で鮮やかさを-100に指定するとか。

jpegのフォーマット上は、モノクロってのはなかった気がします。
理論上の話だと無いですが、滲んで色が出ちゃいそうな気もするので、印刷時に白黒指定するとかで対応するのが妥当かも。

QJAVAにおける画像のJPEG保存の高速化

現在USBWebカメラを利用し、画像処理をしたのちに画像をJPEG形式で保存するというプログラムを作成しています。
入力画像ビットマップデータをINT配列化⇒画像処理⇒INT配列をBufferedImageに変換⇒JPEGで保存
という流れです。
このとき、以下のコードでBufferedImageをJPEGで保存しています。

public void saveJpgbuf(BufferedImage ssimg ,String fname ) throws IOException {
//ImageIO.setUseCache(true);//プログラムの初めで実行済み
ImageWriter writer = ImageIO.getImageWritersByFormatName("jpeg").next();
ImageOutputStream out = ImageIO.createImageOutputStream(new File("c:\\"+fname + ".jpg"));
writer.setOutput(out);
writer.write(ssimg);
out.close();

}

しかし、この処理が非常に重いようで、現状のノートPC(Corei5 2.56GHz)では一画像の保存に20msはかかってしまうようです。
保存先をramdiskに変えても17msはかかります。
他の処理と比べてこの保存処理のコストが非常に高く、全体のパフォーマンスを低下させています。
このような処理を高速化できる方法はありませんでしょうか?

現在USBWebカメラを利用し、画像処理をしたのちに画像をJPEG形式で保存するというプログラムを作成しています。
入力画像ビットマップデータをINT配列化⇒画像処理⇒INT配列をBufferedImageに変換⇒JPEGで保存
という流れです。
このとき、以下のコードでBufferedImageをJPEGで保存しています。

public void saveJpgbuf(BufferedImage ssimg ,String fname ) throws IOException {
//ImageIO.setUseCache(true);//プログラムの初めで実行済み
ImageWriter writer = ImageIO.getImageWritersByFormatName("jpe...続きを読む

Aベストアンサー

(追記)
あと、そもそもリアルタイムの画像処理はデータ量や計算量が多すぎてソフトウェアではなく専用のハードウェアに処理させるのが一般的だと思います。
つまり、ソフトウェアでやろうとしていること自体に無理があると思います。3Dゲームなどもハードウェア処理のおかげで秒30フレーム以上で処理ができるわけで、ソフトウェアでやれば秒10フレームでればいいということもあります。

ソフトウェアで処理を行う場合、入力画像の解像度を下げることや秒あたりのフレーム数を減らさざるを得ません。基本的に高性能なマシンを使用することや、CPUアーキテクチャとの相性も考慮する必要があります。
Intel の CPU は互換性に優れていると言えるが、時代遅れとも言えるかもしれない。(アーキテクチャが)と、まだまだ勉強不足ながらそんな印象を最近受けました。

あとは、画像圧縮処理を高速化することですかね。こんなのありました。
http://jpn.nec.com/press/201211/20121105_03.html
まあ、ご参考までに。


人気Q&Aランキング

おすすめ情報