import java.awt.*;
import java.awt.event.*;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.io.*;
import java.awt.image.*;
public class JavaColorImageProject extends JFrame implements ActionListener{
//화소점처리에 대한 목록리스트(문자열 배열)
private String[] algo1 = {"화소점처리","동일영상","반전영상","영상더하기/빼기", "영상곱하기","영상나누기",
"흑백 127기준","흑백평균기준","파라볼라컵","파라볼라캡","감마","그레이스케일"};
//기하학처리에 대한 목록리스트(문자열 배열)
private String[] algo2 = {"기하학처리","상하미러링","좌우미러링","영상이동"};
//화소영역처리에 대한 목록리스트(문자열 배열)
private String[] algo3 = {"화소영역처리","엠보싱","블러링","샤프닝","가우시안","고주파샤프닝","이동과차분","유사연산자",
"로버츠알고리즘","소벨알고리즘","프리윗알고리즘","라플라시안알고리즘","로그알고리즘","도그알고리즘"};
//히스토그램처리에 대한 목록리스트(문자열 배열)
private String[] algo4 = {"히스토그램처리","스트레칭","엔드-인","평활화"};
//색상모델을 RGB->HSV모델로 바꾼 처리에 대한 목록리스트(문자열 배열)
private String[] algo5 = {"HSV모델처리","채도변환","명도변환","오렌지이미지추출"};
//화소점처리에 대한 목록리스트(algo1)로 패널에 추가할 JComboBox(algo11)를 만든다.
private JComboBox<String> algo11 = new JComboBox<String>(algo1);
//기하학처리에 대한 목록리스트(algo2)로 패널에 추가할 JComboBox(algo22)를 만든다.
private JComboBox<String> algo22 = new JComboBox<String>(algo2);
//화소영역처리에 대한 목록리스트(algo3)로 패널에 추가할 JComboBox(algo33)를 만든다.
private JComboBox<String> algo33 = new JComboBox<String>(algo3);
//히스토그램처리에 대한 목록리스트(algo4)로 패널에 추가할 JComboBox(algo44)를 만든다.
private JComboBox<String> algo44 = new JComboBox<String>(algo4);
//HSV모델처리에 대한 목록리스트(algo5)로 패널에 추가할 JComboBox(algo55)를 만든다.
private JComboBox<String> algo55 = new JComboBox<String>(algo5);
//값을 입력 받을 곳의 명칭..안내문
private JLabel la1 = new JLabel("para1:");
private JLabel la2 = new JLabel("para2:");
//영상처리를 위해 받아와야하는 값을 입력할 JTextField
private JTextField tf1 = new JTextField(10);
//영상이동처리 시에는 값이 2개 필요하므로
private JTextField tf2 = new JTextField(10);
//p1에는 JComboBox들이 들어가고
private JPanel p1 = new JPanel();
//p2에는 JLabel과 JTextField가 들어간다.
private JPanel p2 = new JPanel();
//파일을 불러오고 저장하기를 할 버튼 만들기
//메뉴를 넣을 바(틀)생성
private JMenuBar mb = new JMenuBar();
//File이라는 이름의 메뉴버튼생성
private JMenu file = new JMenu("File");
//File메뉴버튼 안에 들어갈 JMenuItem생성
//OPEN은 파일 열기가 될것이고
//SAVE는 파일 저장하기가 될 것이다.
private JMenuItem fopen = new JMenuItem("OPEN");
private JMenuItem fsave = new JMenuItem("SAVE");
//파일다이얼로그!!파일을 저장하고 열기를 실행할 파일 탐색창을 연다.
//FileDialog에서 열기는 창의 이름부분에 뜨는 메시지이다. FileDialog.LOAD는 파일을 열게할 FileDialog의 유형이다.
private FileDialog fdlg1 = new FileDialog(this,"열기",FileDialog.LOAD);
//FileDialog.SAVE는 당연히 파일을 저장할 유형
private FileDialog fdlg2 = new FileDialog(this,"저장",FileDialog.SAVE);
// pm은 그림이 들어갈 패널
private MyPanel pm = new MyPanel();
public JavaColorImageProject() {
setTitle("JavaColorImageProject");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
init();
start();
setSize(800,700);
setVisible(true);
}
public void init() {
setContentPane(pm);
setLayout(new FlowLayout());
p1.setLayout(new FlowLayout());
p1.add(algo11);p1.add(algo22);p1.add(algo33);p1.add(algo44);p1.add(algo55);
p2.add(la1);p2.add(tf1);p2.add(la2);p2.add(tf2);
file.add(fopen);file.add(fsave);
mb.add(file);
setJMenuBar(mb);
add(p1);add(p2);
}
public void start() {
fopen.addActionListener(this);
fsave.addActionListener(this);
algo11.addActionListener(this);
algo22.addActionListener(this);
algo33.addActionListener(this);
algo44.addActionListener(this);
algo55.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent e) {
//내 코드에서는 모든 이벤트가 ActionListener로 돌아가므로
//함수 안에서 어떤 변수에서 이벤트가 발생했는지를 알아내는 if문이 필요하다.
if(e.getSource()==fopen) {
fdlg1.setVisible(true);
inputImage();
}
else if(e.getSource()==fsave) {
fdlg2.setVisible(true);
outputImage();
}
else if(e.getSource()==algo11) {
//JComboBox에서 어떤 부분을 클릭했는지 정보를 가져오기위함
JComboBox<String> cb = (JComboBox<String>)e.getSource();
//선택된 아이템의 인덱스를 가져온다.
int index = cb.getSelectedIndex();
//문자열로 처리하면 값을 합할 수 없고 이어야하기때문에 10이라는 숫자에 인덱스만 붙이면 된다는 꼼수는
//값이 10을 넘어가게 되면 1011같이 1000을 넘어간 숫자로 변하기 때문에 경우를 나누어서 함수를 호출해주었다.
if(index>=10) {
//algoFunction을 통해 switch문으로 처리할 함수로 옮겨간다.
algoFunction(""+"1"+index);
}else {
algoFunction(""+"10"+index);
}
}
else if(e.getSource()==algo22) {
JComboBox<String> cb = (JComboBox<String>)e.getSource();
int index = cb.getSelectedIndex();
algoFunction(""+"20"+index);
}
else if(e.getSource()==algo33) {
JComboBox<String> cb = (JComboBox<String>)e.getSource();
int index = cb.getSelectedIndex();
if(index>=10) {
algoFunction(""+"3"+index);
}else {
algoFunction(""+"30"+index);
}
}
else if(e.getSource()==algo44) {
JComboBox<String> cb = (JComboBox<String>)e.getSource();
int index = cb.getSelectedIndex();
algoFunction(""+"40"+index);
}
else if(e.getSource()==algo55) {
JComboBox<String> cb = (JComboBox<String>)e.getSource();
int index = cb.getSelectedIndex();
algoFunction(""+"50"+index);
}
}
public void algoFunction(String index) {
//index로 실행할 함수를 찾아간다.
//java는 switch문에서 문자열을 비교할 수 있다.
switch(index) {
case "101"://동일영상
equalImage();break;
case "102"://반전영상
reverseImage();break;
case "103"://영상 더하기/빼기
addImage();break;
case "104"://영상 곱하기
gopImage();break;
case "105"://영상 나누기
divImage();break;
case "106"://흑백127기준
image127();break;
case "107"://흑백 평균 기준
avgImage();break;
case "108"://파라볼라 컵
paraCupImage();break;
case "109"://파라볼라 캡
paraCapImage();break;
case "110"://감마
gammaImage();break;
case "111"://그레이스케일
grayImage();break;
case "201"://상하미러링
udImage();break;
case "202"://좌우미러링
lrImage();break;
case "203"://영상이동
swapImage();break;
case "301"://엠보싱
embossingImage();break;
case "302"://블러링
blurrImage();break;
case "303"://샤프닝
sharpenImage();break;
case "304"://가우시안
gaussianImage();break;
case "305"://고주파 샤프닝
hpfSharpImage();break;
case "306"://이동과 차분
sadImage();break;
case "307"://유사연산자
opImage();break;
case "308"://로버츠 알고리즘
robertsImage();break;
case "309"://소벨 알고리즘
sobelImage();break;
case "310"://프리윗 알고리즘
prewittImage();break;
case "311"://라플라시안 알고리즘
laplacianImage();break;
case "312"://로그 알고리즘
logImage();break;
case "313"://도그 알고리즘
dogImage();break;
case "401"://스트레칭
strechImage();break;
case "402"://엔드-인
endInImage();break;
case "403"://평활화
equalizeImage();break;
case "501"://채도변환
saturImage();break;
case "502"://명도변환
intensityImage();break;
case "503"://오렌지이미지추출
orangeImage();break;
}
}
public void equalImage() {
tf1.setText("하이");
}
public void reverseImage() {
}
public void addImage() {
}
public void gopImage() {
}
public void divImage() {
}
public void image127() {
}
public void avgImage() {
}
public void paraCupImage() {
}
public void paraCapImage() {
}
public void gammaImage() {
}
/////////////////////////////////////////////
/////기하학처리////////////////////////////////
public void udImage() {
}
public void lrImage() {
}
public void swapImage() {
}
public void rotateImage() {
}
public void spinImage() {
}
public void zoomOutImage() {
}
public void zoomInImage2() {
}
///////////////////////////////////////////////
////화소영역처리//////////////////////////////////
public void embossingImage() {
}
public void blurrImage() {
}
public void sharpenImage() {
}
public void gaussianImage() {
}
public void hpfSharpImage() {
}
public void sadImage() {
}
public void opImage() {
}
public void robertsImage() {
}
public void sobelImage() {
}
public void prewittImage() {
}
public void laplacianImage() {
}
public void logImage() {
}
public void dogImage() {
}
/////////////////////////////////////////////
////히스토그램처리//////////////////////////////
public void strechImage() {
}
public void endInImage() {
}
public void equalizeImage() {
}
////////////////////////////////////////////
////HSV변환 처리//////////////////////////////
public void saturImage() {
}
public void grayImage() {
}
public void intensityImage() {
}
public void orangeImage() {
}
public static void main(String[] ar) {
new JavaColorImageProject();
}
}
'JAVA환경에서 OpenCV없는 컬러영상처리' 카테고리의 다른 글
Java 영상처리 전체 코드 (0) | 2022.10.19 |
---|---|
Java에서 FileDialog를 이용한 파일 입출력 함수 (0) | 2022.10.19 |