• ベストアンサー

JAVAを用いた画像処理

JAVAを用いて、画像を入力しその画像を2値化し出力を行うプログラムを作成したいのですが、どうやらJAVAには、画像を格納するクラス(構造体?)がBufferedImageやImage、Colorなどがあり、その違いがよくわからず困惑しております。 どのような流れで2値化処理を行うのが最も一般的なのでしょうか? また、JAVAを用いた画像処理について勉強できるわかりやすいサイトや本などがあったら教えてほしいです。 回答よろしくお願いします。

  • Java
  • 回答数1
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
noname#212058
noname#212058
回答No.1

こんなんですか? http://kyle-in-jp.blogspot.com/2008/08/java2d_13.html # google などで 『Java 2値化』検索すれば、いくらでも # 参考サイトが出てきます。もう少し検索エンジンの # 使い方を研究されることをお勧めします。 # http://www.google.co.jp/search?sclient=psy&hl=ja&site=webhp&source=hp&q=%EF%BC%AA%EF%BC%A1%EF%BC%B6%EF%BC%A1+2%E5%80%A4%E5%8C%96&btnG=%E6%A4%9C%E7%B4%A2

関連するQ&A

  • 任意の文字列をJAVAで画像化

    表題にある通り任意の文字列をJAVAで画像化したいと思い 下記サンプルを検索して見つけたのですが作成される画像は 真っ白な画像で文字列は表示されませんでした。 任意の文字列を画像として出力するにはどうすればよいでしょうか。 import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; public class Test5 { public static void main(String[] args) { String str = "abc123"; new Test5().Create(str); System.out.println(str); } public void Create(String str) { int w=60; int h=17; try { //受け取った文字列を画像化 BufferedImage image=new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB); Graphics2D g2d=image.createGraphics(); g2d.setBackground(Color.WHITE); g2d.clearRect(0,0,w,h); g2d.setColor(Color.BLACK); g2d.drawString(str,0,0); ImageIO.write(image, "JPEG", new File("c:\\test.jpg")); } catch(Exception e) { e.printStackTrace(); } } }

    • ベストアンサー
    • Java
  • JAVAにおける画像の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はかかります。 他の処理と比べてこの保存処理のコストが非常に高く、全体のパフォーマンスを低下させています。 このような処理を高速化できる方法はありませんでしょうか?

    • ベストアンサー
    • Java
  • javaで画像を表示したのですが、変です。

    画像をのせたのですが、表示した画像の透明部分のところに予期しない形で画像が重なってしまいます。 また、ウィンドウのサイズを何回かスクロールしていじると元に戻ります。 文字数の関係ですべてのソースを乗せられないのですが、自作画像クラスだけ記載します。 import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JPanel; public class Layer extends JPanel { BufferedImage image; int x=0,y=0; //表示サイズ int lx=0,ly=0; //表示場所 int originalX,originalY; int startX,startY; Layer(){ } public void p(String imgpath,int lX,int lY,int X,int Y){ x=X;y=Y;lx=lX;ly=lY; image=Imagedraw(imgpath); } public void p(String imgpath,int lX,int lY){ lx=lX;ly=lY; image=Imagedraw(imgpath); x=originalX; y=originalY; setSize(x,y); } public void p(String imgpath){ image=Imagedraw(imgpath); x=originalX; y=originalY; setSize(x,y); } public BufferedImage Imagedraw(String imgpath){ BufferedImage img=null; try{ img = readImage(imgpath); }catch(Exception e){ e.printStackTrace(); } setLocation(lx,ly); setSize(x,y); return img; } public void setLocation(int lX, int lY){ lx=lX;ly=lY; super.setLocation(lx,ly); } public void paint(Graphics g){ //イメージを描画 g.drawImage(image,0,0,x,y,startX,startY,x+startX,y+startY,this); } public BufferedImage readImage(String path) throws IOException{ BufferedImage img; img = ImageIO.read(new File(path)); originalX=img.getWidth(); originalY=img.getHeight(); return img; } } どなたか原因に心当たりのある方、よろしくお願いいたします。 なお、画像はインターネット上での拾いものです。書かれた方には感謝いたします。

  • VBAで画像処理

    以下のプログラムは、C言語で記載されたプラグラムで、画像に鏡映変換を施すプログラムです。 これを、ExcelVBAでやりたいとおもうのですが、 特に、一度Excelのセルに読みだして、そこで数字を処理してトしたいと考えています。 (単に画像Excelの機能だけをつかってを反転するだけならば、たいしたことではないので 自分で判るのですが、一度配列なりセルに画素情報を読み込む方法は、見当もつかないので 知りたいと思っています。) ということで、特に以下の(1)、(2)に注意して、ExcelVBAで下記のプログラムを変換する方法を教えてください。よろしくお願いします。 (1)特に、以下の部分の記述がどう変化するか、教えてください。 void main(void) { char input[100], output[100]; printf("入力画像ファイル名(input.bmp):"); scanf("%s", input); printf("出力画像ファイル名(output.bmp):"); scanf("%s", output); /* 画像の入力 */ readBmp(input, image_in); /* RGB24ビットカラーBMP画像を配列に格納 */ /* 画像処理 */ mirror(image_in, image_out); /* 鏡像を作る */ /* 画像の出力 */ writeBmp(image_out, output); /* RGB24ビット画像をファイルに出力 */ } (2)特に、一度BMPの画素情報を、Excelのセルに読み込めるようにしていただけると助かります。 ========= #include <stdio.h> #include <stdlib.h> /* 最大画像サイズ */ #define Y_SIZE 1280 #define X_SIZE 1280 /* BMPファイル用 */ typedef short INT2; typedef long INT4; INT2 bfType; INT4 bfSize; INT2 bfReserved1, bfReserved2; INT4 bfOffBits; INT4 biSize, biWidth, biHeight; INT2 biPlanes, biBitCount; INT4 biCompression, biSizeImage, biXPelsPerMeter, biYPelsPerMeter, biClrUsed, biClrImportant; #define HIGH 255 /* 2値画像の白 */ #define LOW 0 /* 2値画像の黒 */ #define LEVEL 256 /* 濃度レベル数 */ unsigned char image_in[Y_SIZE][X_SIZE][3]; /* 入力カラー画像配列 */ unsigned char image_out[Y_SIZE][X_SIZE][3]; /* 出力カラー画像配列 */ /* 鏡像を作る(左右逆) */ void mirror( unsigned char in[Y_SIZE][X_SIZE][3], unsigned char out[Y_SIZE][X_SIZE][3]) { int i,j,k; for (i=0; i<biHeight; i++) for (j=0; j<biWidth; j++) for (k=0; k<3; k++) out[i][j][k] = in[i][biWidth-1-j][k]; } void main(void) { char input[100], output[100]; printf("入力画像ファイル名(input.bmp):"); scanf("%s", input); printf("出力画像ファイル名(output.bmp):"); scanf("%s", output); /* 画像の入力 */ readBmp(input, image_in); /* RGB24ビットカラーBMP画像を配列に格納 */ /* 画像処理 */ mirror(image_in, image_out); /* 鏡像を作る */ /* 画像の出力 */ writeBmp(image_out, output); /* RGB24ビット画像をファイルに出力 */ }

  • 画像処理

    CCDカメラにおける画像処理の流れがわからないので、教えてください!入力信号・出力信号がどのような信号になるのでしょうか??

  • 一次元配列から画像を生成するとき。。。

    お世話になります。 カラー画像をjavaプログラムで読み込み、グレースケース化して画像を生成したいのですが、最後の画像生成の部分がうまくいきません。具体的には、 Image img_gray = createImage(new MemoryImageSource(w idth,height,rgb_gray,0,width)); として、img_grayという画像ファイルに変換しようとしています。しかし、コマンドプロンプトでコンパイルしようとすると、 C:\QR>javac Sample.java Sample.java:78: static でない メソッド createImage(java.awt.image.ImageProducer) を static コンテキストから参照することはできません。 Image img_gray = createImage(new MemoryImageSource(width,height, rgb_gray,0,width)); というエラーが出てしまいます。原因が分かりません。どなたか解決策を教えていただける方おられましたらよろしくお願いします。 以下にソースを貼っておきます。 import java.io.*; import java.lang.*; import java.awt.*; import java.awt.Color; import java.awt.color.ColorSpace; import java.awt.event.*; import javax.swing.*; import javax.imageio.ImageIO; import javax.media.*; import javax.media.control.*; import javax.media.format.*; import javax.media.util.*; import java.awt.image.*; import java.applet.*; import java.awt.image.BufferedImage; import javax.imageio.ImageIO; import java.io.File; import java.io.IOException; import java.util.*; import java.text.*; public class Sample extends JPanel{ static BufferedImage image; //static BufferedImage change_image; public static void main(String[] args) { //************************************************************************************************ try { //画像ファイルのデータを読み込む image = ImageIO.read(new File("C:\\QR\\imagefile\\sa.bmp")); } catch (Exception e) { e.printStackTrace(); image = null; } // *********************************************************************************************** //グレースケール int i,j,r,g,b,d; Color color; int width = image.getWidth(); int height = image.getHeight(); int size = width * height; int[] rgb_src=new int[size]; int[] rgb_gray=new int[size]; PixelGrabber grabber= new PixelGrabber(image,0,0,width,height,rgb_src,0,width); try{ grabber.grabPixels(); //画像imageを配列rgb_src[]に読み込む }catch(InterruptedException e){} //カラー画像をグレイ化する for(i=0;i<size;i++){ color=new Color(rgb_src[i]); r=color.getRed(); //赤の成分を取り出す g=color.getGreen(); //緑の成分を取り出す b=color.getBlue(); //青の成分を取り出す d=(int)(r*0.299+g*0.587+b*0.114); //グレイの成分を作る(NTSC方式準拠) color=new Color(d,d,d); rgb_gray[i]=color.getRGB(); } Image img_gray = createImage(new MemoryImageSource(width,height,rgb_gray,0,width)); } }

    • ベストアンサー
    • Java
  • 画像処理

    ビットマップ形式の画像を読み取って,出力するプログラムを 作りたいのですが、どう作っていいのかわかりません. どのように作っていけばいいのか、アドバイスをお願いします. 一応ネットとか、本で調べましたが・・・

  • OpenCVでの画像処理について

    OpenCVを用いて連続して画像処理を行おうとしています。 単にcvLoadImageを用いて画像処理を行うことはできるのですが、 if(k=1)IplImage *img = cvLoadImage( "gazou1.jpg", -1); if(k=2)IplImage *img = cvLoadImage( "gazou2.jpg", -1); とif文を用いて画像を取り込んで処理して破棄して、新しい画像を取り込んで…と連続して異なる画像を同じ処理をするプログラムを作ると error C2065: 'img' : 定義されていない識別子です。 error C2227: '->height' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。型は ''unknown-type'' です。 error C2227: '->width' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。型は ''unknown-type'' です … とたくさんのエラーがでてしまいます。 if文を使わずに同じ画像を何度も処理することはできるのですが… この解消法をわかる方は教えてください。 ぜひ、よろしくお願いします。

  • 画像処理

    大学レポートがどうしても出来ないので皆さんに教えていただきたいのですが、その課題というのが、画像処理のプログラムの問題であります。 私、もう就職が決まっておりまして、この単位を取れないとヤバイのでしてこうして皆さんに泣きついたしだいであります。 課題 カメラからのカラー画像中に写っている、オレンジの玉を抜き出すプログラムを作成しなさい。 です。なにとぞお願いします。

  • JavaでBitmapを圧縮しないでファイル保存

    javaで、android端末で実行する画像処理のアプリを作成しています。BitmapのデータをそのままBitmap形式でファイルに保存したいのですが、良い方法はありませんか。BitmapクラスをImageクラスまたはBufferedImageクラスに変換できれば、ImageIOを使って、ファイル書き込みや読み出しが簡単にできるのですが変換のやり方が分かりません。 Bitmapデータを圧縮して、Byte列に変換してからファイル書き込みを行う方法(bmp2dataなど)は、Webにいろいろ載っていますが、実行してみると時間がかかります。Bitmapを圧縮しないでそのままByte列に変換する方法があればよいのですが、探してみましたが見つかりません。どなたか良い方法をご存知でしたらお願いします。