画像からヒストグラムを作りたいのですが
画像からヒストグラムを計算し、それをグラフにしてあらわしたいと思っています。プログラムは以下のようなところまでできており、TextFieldにファイル名を入力し、EnterkeyもしくはOpenを押すと左下にその画像が表示されるところまでできています。
Startを押すと、その画像のRGBヒストグラムを計算し、赤、緑、青各色のグラフを三つ右下に表示したいのですがGraphicsの使い方や、BufferedImageの使い方がわからず四苦八苦しております。ヒストグラムをしては横区間を16としてやりたいと思っております。自分なりにはヒストグラム値を16で割り、その数値をもとにGraphicsオブジェクトに与えてそれをもとに描写するという方向で作成していましたがわたくしには難しく頓挫してしまいました。どうぞよろしくお願いいたします。
/*ここからソース*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.imageio.*;
import java.io.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Main {
public static class ActionB1 implements ActionListener {
JTextField input;
JLabel pict1;
JFrame frame2;
public ActionB1(JTextField input0,JLabel pict10,JFrame A0){
input =input0;
pict1=pict10;
frame2 = A0;
}
public void actionPerformed(ActionEvent e){
if(getClass().getResource(input.getText())==null){
pict1.setText("file not found!!!");
}
else {
ImageIcon temp =new ImageIcon(getClass().getResource(input.getText()));
pict1.setIcon(temp);
}
pict1.repaint();
}
}
public static class ActionB2 implements ActionListener{
JLabel pict2;
JTextField input;
JFrame frame3;
public ActionB2(JTextField input0,JLabel pict20,JFrame A0){
input =input0;
pict2=pict20;
frame3=A0;
}
public void actionPerformed(ActionEvent e){
File filename = new File(input.getText());
BufferedImage Image = null;
try {
Image = ImageIO.read(filename);
} catch (IOException e1) {
// TODO 自動生成された catch ブロック
e1.printStackTrace();
}
//ここからわかりません
}
public static void main(String[] args){
JFrame frame =new JFrame("タイトル");
frame.setSize(600,400);
JPanel p1 = new JPanel();
JPanel p2 = new JPanel();
JButton b1 =new JButton("OPEN"),b2=new JButton("START");
JTextField t1 = new JTextField(30);
p1.add(t1);
p1.add(b1);
p1.add(b2);
b1.setBounds(350,10,100,20);
b2.setBounds(460,10,100,20);
t1.setBounds(110,10,230,20);
p1.setBounds(20,10,80,20);
frame.getContentPane().add(b1);
frame.getContentPane().add(b2);
frame.getContentPane().add(t1);
frame.getContentPane().add(p1);
p2.setLayout(new GridLayout(1,2));
JLabel pict1= new JLabel(),pict2= new JLabel();
p2.add(pict1);
p2.add(pict2);
ActionB1 actB1 = new ActionB1(t1,pict1,frame);
ActionB2 actB2 = new ActionB2(t1,pict2,frame);
b1.addActionListener(actB1);
b2.addActionListener(actB2);
t1.addActionListener(actB1);
frame.getContentPane().add(p1,BorderLayout.NORTH);
frame.getContentPane().add(p2,BorderLayout.CENTER);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
お礼
冗長になってしまいそうなので例や説明をだいぶ省いてしまっていたのですが まさに「どちらが、集中的に狭い階調域を使っていてるか、よりうまく活用しているか」 といったことで、解釈にどのような指標を使うべきかで考えていたところでした。 十分な背景・目的の説明もせずに自分に都合のいい回答を得ようとしていたのは 大変失礼な行為でしたね。反省しています。 色々考えてみましたが、やはり今回の評価を解釈するには 標準偏差が良さそうなので試してみようと思っています。 尖度の解説や、はるか昔に学習して忘れてしまっていた 半値幅といった言葉も思い出させていただきました。 大変丁寧に説明いただきありがとうございました。