유튜브시연영상:https://youtu.be/xbaaB-DpQWs
//전역변수부
int[][][] inImage;
int inH,inW;
int[][][] outImage;
static int outH,outW;
File inFp,outFp;
float[] rgb = new float[3];
float[] hsv = new float[3];
float[] abc = new float[3];
float[] def = new float[3];
//Parameter Variable
String algo, para1, para2;
String inFname, outFname;
BufferedImage bImage;
public void inputImage() {//선택한 이미지를 입력배열에 입력 받아 출력하는 함수
try {
//FileDialoge에서 열고자 하는 파일의 경로를 가져와 File클래스에 저장하는코드이다.
//getDirectory()는 파일의 디렉터리 경로를 가져온다.
//getFile()은 선택한 파일명을 가져온다.
inFp =new File(fdlg1.getDirectory()+fdlg1.getFile());
//File클래스에 저장한 경로에 따른 파일을 BufferedImage클래스에 저장한다.
bImage = ImageIO.read(inFp);
//BufferedImage에 저장된 그림은 가로 세로가 반대로 되어있다.
//이렇게 반대로 하지않으면 배열 범위 초과 오류가 난다.
inH = bImage.getWidth();
inW = bImage.getHeight();
inImage = new int[3][inH][inW];
for(int i=0;i<inH;i++) {
for(int k=0;k<inW;k++) {
//BufferedImage에 저장된 이미지의 한 픽셀의 RGB값을 가져온다.
//이 값은 0xf0ed77이런식으로 구성되어있다.
int rgb=bImage.getRGB(i,k);
//RGB값을 R값과 G값과 B값으로 나누어 변수에 값을 입력 받는다.
int r =(rgb>>16)&0xFF;
int g =(rgb>>8)&0xFF;
int b=(rgb>>0)&0xFF;
//RGB값을 입력 배열에 입력
inImage[0][i][k]=r;
inImage[1][i][k]=g;
inImage[2][i][k]=b;
//사진 출력을 위해 다시 버퍼에 입력한다.
//이 번거로운 과정을 거치는 이유는 drawImage가 배열을 받아 그리지 못하고
//버퍼에 입력된 이미지를 그릴 수 있기 때문이다.
bImage.setRGB(i, k, rgb);
}
}
//repaint()를 통해 버퍼에 입력된 이미지를 출력한다.
repaint();
}catch(Exception e){
System.out.println("BBBBB255줄"+e);
}
}
class MyPanel extends JPanel{//패널을 상속받은 클래스를 만들어 paintComponent()함수를 추가한다.
//repaint()하면 이 함수가 호출되는 것이다.
public void paintComponent(Graphics g) {
super.paintComponent(g);
//버퍼에 있는 이미지를 출력함
g.drawImage(bImage,50,100, this);
}
}
public void displayImage() {//영상처리한 이미지를 출력하는 함수
try {
for(int i=0;i<outH;i++) {
for(int k=0;k<outW;k++) {
//outImage에 들어있는 픽셀값을 잘 R,G,B를 나눠서 넣는다.
int r = outImage[0][i][k];
int g = outImage[1][i][k];
int b = outImage[2][i][k];
//RGB픽셀값들을 합쳐서 하나로 만든 값을 저장할 변수
int px=0;
px=px|(r<<16);
px=px|(g<<8);
px=px|(b<<0);
//다시 0xff08e6같은 수로 변하고 이미지를 저장할 버퍼에 넣는다.
bImage.setRGB(i, k, px);
}
}
//다시 그림
repaint();
}catch(Exception e){
System.out.println("kkkkkkk321줄"+e);
}
}
public void outputImage() {//영상처리한 이미지를 원하는 위치에 저장하는 함수
try {
//이미지를 위치에 저장한다. 그냥 저장하면 확장자없는 파일로 나오기 때문에 저장시의 확장자를 임의로 jpg로 맞춰준다.
outFp=new File(fdlg2.getDirectory()+fdlg2.getFile()+".jpg");
//RGB값을 입력받을 버퍼라는 의미(BufferedImage.TYPE_INT_RGB)
BufferedImage oImage = new BufferedImage(outH,outW,BufferedImage.TYPE_INT_RGB);
for(int i=0;i<outH;i++) {
for(int k=0;k<outW;k++) {
//저장하고 싶은 이미지의 배열을 rgb에 저장한다.
int r = outImage[0][i][k];
int g = outImage[1][i][k];
int b = outImage[2][i][k];
//픽셀을 하나로 합친다.
int px=0;
px=px|(r<<16);
px=px|(g<<8);
px=px|(b<<0);
//출력할 버퍼에 픽셀값 하나를 넣는다.
oImage.setRGB(i, k, px);
}
}
//버퍼에 담긴 이미지를 jpg형식으로 선택한 파일 위치에 저장한다.
ImageIO.write(oImage,"jpg",outFp);
}catch(Exception e) {
System.out.println("CCCCCC245"+e);
}
}
'JAVA환경에서 OpenCV없는 컬러영상처리' 카테고리의 다른 글
Java 영상처리 전체 코드 (0) | 2022.10.19 |
---|---|
JFrame을 이용한 실행 기본틀 작성 (0) | 2022.10.10 |