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で囲んだ画像を切り取るプログラムを書く予定。