生物屋さんのためのゼロからのプログラミング

―忘れないための覚書 (たま~に更新)―

Javaで画像上にROI (Rectangular)を書く

ここからはJavaでの画像処理について書く。(ImageJなしで)

今回は画像上にROIを書く。
まずはプログラムの全体を示す。

import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.event.MouseInputAdapter;

public class ROIput extends JFrame implements ActionListener {

	BufferedImage Img;
	MyPanel mypane;
	int h;
	int w;
	int x0 = 0;
	int xEnd = 0;
	int y0 = 0;
	int yEnd = 0;

	//画像を開く
	public void OpenImage () {
		try {
		File openFile = new File (開きたい画像ファイル);
		Img = ImageIO.read(openFile);
		h = Img.getHeight();  //画像の高さを取得
		w = Img.getWidth();    //画像の幅を取得
		} catch (IOException ex) {
			System.out.println("Miss");
		}

		//画像をフレームに貼る
		JFrame imgFrame = new JFrame("Open Image");
		imgFrame.setBounds (300, 100, 520, 410);
		imgFrame.setVisible(true);

		mypane = new MyPanel (520, 410);
		imgFrame.getContentPane().add(mypane, BorderLayout.CENTER);
	}

        //ROIを描く
	public void roiDraw () {
		mypane.addMouseListener(new MouseCheck());
		mypane.addMouseMotionListener(new MouseCheck());
	}

	//ROIの始点と終点を取得
	class MouseCheck extends MouseInputAdapter {

		//マウスが押された点を調べる
		public void mousePressed(MouseEvent e) {
			x0 = e.getX();  //始点のx座標
			y0 = e.getY();   // 始点のy座標
		}

		//マウスが放された点を調べる
		public void mouseReleased (MouseEvent e) {
			Graphics g = mypane.getGraphics();
			xEnd = e.getX();  //終点のx座標
			yEnd = e.getY();  //終点のy座標
			g.drawLine(x0, y0, x0, yEnd);
			g.drawLine(x0, y0, xEnd, y0);
			g.drawLine(x0, yEnd, xEnd, yEnd);
			g.drawLine(xEnd, y0, xEnd, yEnd);
		}
	}

	//画像を貼る用のツール
	public class MyPanel extends JPanel {
		public MyPanel (int width, int height) {
			setSize (width, height);
		}

		public void paintComponent (Graphics g) {
			g.drawImage(Img, 10, 10, this);
		}
	}

	public void actionPerformed (ActionEvent e) {
		String cmd = e.getActionCommand();

		if (cmd.equals("open")) {
			OpenImage();
		} else if (cmd.equals("ROI")) {
			roiDraw();
		}
	}

	ROIput (String title) {
		setTitle(title);
		setBounds(10, 10, 200, 130);
		setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

		JButton button = new JButton ("Open");
		JButton button1 = new JButton ("ROI");
		button.setBounds(50, 10, 80, 30);
		button1.setBounds(50, 50, 80, 30);
		button.addActionListener (this);
		button1.addActionListener(this);
		button.setActionCommand("open");
		button1.setActionCommand("ROI");
		JPanel pane = new JPanel ();
		pane.setLayout(null);
		pane.add(button);
		pane.add(button1);
		getContentPane().add(pane, BorderLayout.CENTER);
	}

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		ROIput frame = new ROIput("ROI put");
		frame.setVisible(true);
	}
}

ROIを作成するために、マウスが押された点(始点)とマウスが放された点(終点)を下記のプログラムで取得した

	//ROIの始点と終点を取得
	class MouseCheck extends MouseInputAdapter {

		//マウスが押された点を調べる
		public void mousePressed(MouseEvent e) {
			x0 = e.getX();  //始点のx座標
			y0 = e.getY();   // 始点のy座標
		}

		//マウスが放された点を調べる
		public void mouseReleased (MouseEvent e) {
			Graphics g = mypane.getGraphics();
			xEnd = e.getX();  //終点のx座標
			yEnd = e.getY();  //終点のy座標
			g.drawLine(x0, y0, x0, yEnd);
			g.drawLine(x0, y0, xEnd, y0);
			g.drawLine(x0, yEnd, xEnd, yEnd);
			g.drawLine(xEnd, y0, xEnd, yEnd);
		}
	}

上記プログラムの最後の"g.drawLine"の部分で長方形型のROIを描いた。
このプログラムはROIボタンが押された後に、アクティブになるため好きなだけROIを置くことができる。

次回はROIで囲んだ画像を切り取るプログラムを書く予定。