본문 바로가기

JAVA환경에서 OpenCV없는 컬러영상처리

JFrame을 이용한 실행 기본틀 작성

 

결과화면(아래코드와 같이 쓰면 사진은 못불러옴 이 다음다음까지 해야함)

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();
	}
	
}