2021/05/03(월)
JSP 개인프로젝트 이미지 파일 등록 알고리즘 참고
https://cordingdoah.tistory.com/113
이미지 파일을 선택하고 form으로 이동을 하면 해당 이미지 파일이 C:/Upload 안에 저장되고
이미지가 처리되고 처리된 이미지들이 번호+파일이름.jpg 형태로 C:/Out에 저장
Mini_InsertFile.jsp ---> Image_Practice.jsp로 이동
jsp에서 처리 내용
C://Upload 에 파일 이름으로 올리고 컬러사진을 처리하기 위해 3차원 배열로 메모리 할당
사진파일을 메모리로 올려줌
inImage --> 원본 사진 저장 배열
outImage --> 출력 사진 저장 배열
MultipartRequest multi = new MultipartRequest(request,"C:\\Upload",
5*1024*1024, "utf-8", new DefaultFileRenamePolicy());
String tmp;
Enumeration files = multi.getFileNames();
tmp = (String)files.nextElement();
String filename = multi.getFilesystemName(tmp);
int inW, inH,outW=0, outH=0;
int count=1;
File inFp;
FileInputStream inFs;
inFp = new File("C:/Upload/" + filename);
// 칼라 이미지 처리
BufferedImage cImage = ImageIO.read(inFp);
inW = cImage.getHeight();
inH = cImage.getWidth();
// (2) JSP에서 배열 처리
int[][][] inImage = new int[3][inH][inW]; // 메모리 할당
// 파일 --> 메모리
for (int i=0; i<inH; i++) {
for (int k=0; k<inW; k++) {
int rgb = cImage.getRGB(i,k);
inImage[0][i][k] = (rgb >> 16) & 0xFF; // Red
inImage[1][i][k] = (rgb >> 8) & 0xFF; // Green
inImage[2][i][k] = (rgb ) & 0xFF; // Blue
}
}
int[][][] outImage = null;
<반전하기>
255에서 원래 값을 빼고 출력 (색 반전)
이미지를 저장하고 C://Out에 1파일이름.jpg로 저장
// 반전하기(1)
outH = inH;
outW = inW;
// 메모리 할당
outImage = new int[3][outH][outW];
// 진짜 영상처리 알고리즘
for (int rgb=0; rgb<3; rgb++)
for(int i=0; i<inH; i++)
for (int k=0; k<inW; k++) {
outImage[rgb][i][k] = 255 - inImage[rgb][i][k];
}
// (4) 결과를 파일로 쓰기
File outFp;
FileOutputStream outFs;
String outFname = Integer.toString(count) + filename ;
outFp = new File("C:/Out/"+outFname);
// 칼라 이미지 저장
BufferedImage outCImage = new BufferedImage(outH, outW,
BufferedImage.TYPE_INT_RGB);
outFs = new FileOutputStream(outFp.getPath());
// 메모리 --> 버퍼이미지
for (int i=0; i<outH; i++) {
for (int k=0; k<outW; k++) {
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);
outCImage.setRGB(i,k,px);
}
}
ImageIO.write(outCImage,"jpg", outFp);
count++;
//outFs.close();
<밝기조절>
기존 원본 파일에 100을 더해줌 (밝기 100)
더한 값이 255이상이면 255로 지정 0보다 작으면 0으로 지정
2파일이름.jpg 로 C://Out에 저장
// 밝기조절(2)
outH = inH;
outW = inW;
// 메모리 할당
outImage = new int[3][outH][outW];
// 진짜 영상처리 알고리즘
for (int rgb=0; rgb<3; rgb++)
for(int i=0; i<inH; i++)
for (int k=0; k<inW; k++) {
int value = inImage[rgb][i][k] + 100;
if (value > 255)
value = 255;
if (value < 0)
value = 0;
outImage[rgb][i][k] = value;
}
// (4) 결과를 파일로 쓰기
outFname =Integer.toString(count) + filename ;
outFp = new File("C:/Out/"+outFname);
// 칼라 이미지 저장
outCImage = new BufferedImage(outH, outW,
BufferedImage.TYPE_INT_RGB);
outFs = new FileOutputStream(outFp.getPath());
// 메모리 --> 버퍼이미지
for (int i=0; i<outH; i++) {
for (int k=0; k<outW; k++) {
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);
outCImage.setRGB(i,k,px);
}
}
ImageIO.write(outCImage,"jpg", outFp);
count++;
//outFs.close();
<명암대비>
원본 파일 값에서 127보다 크면 값을 곱해주고 아니라면 나눠주면 명암대비 효과 적용
// 명암대비(3)
outH = inH;
outW = inW;
// 메모리 할당
outImage = new int[3][outH][outW];
int value = 100;
if(value>0){
value = (value+10)/10;
// 진짜 영상처리 알고리즘
for (int rgb=0; rgb<3; rgb++)
for(int i=0; i<inH; i++){
for (int k=0; k<inW; k++) {
int pixel = inImage[rgb][i][k];
if (pixel > 127){
if(pixel * value > 255 )
pixel = 255;
pixel *= value;
}
else
pixel /= value;
outImage[rgb][i][k] = pixel;
}
}
}
else{
value = -(value - 10) / 10;
// 진짜 영상처리 알고리즘
for (int rgb=0; rgb<3; rgb++)
for(int i=0; i<inH; i++){
for (int k=0; k<inW; k++) {
int pixel = inImage[rgb][i][k];
if (pixel > 127){
if(pixel / value < 127 )
pixel = 127;
pixel /= value;
}
else{
if(pixel * value > 127);
pixel /= value;
}
outImage[rgb][i][k] = pixel;
}
}
}
// (4) 결과를 파일로 쓰기
outFname = Integer.toString(count) + filename ;
outFp = new File("C:/Out/"+outFname);
// 칼라 이미지 저장
outCImage = new BufferedImage(outH, outW,
BufferedImage.TYPE_INT_RGB);
outFs = new FileOutputStream(outFp.getPath());
// 메모리 --> 버퍼이미지
for (int i=0; i<outH; i++) {
for (int k=0; k<outW; k++) {
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);
outCImage.setRGB(i,k,px);
}
}
ImageIO.write(outCImage,"jpg", outFp);
count++;
<흑백처리>
RGB값이 127보다 크면 모두 RGB를 255값으로 127보다 작으면 RGB값을 0으로 처리하여 흑백처리
// 흑백처리(4)
outH = inH;
outW = inW;
// 메모리 할당
outImage = new int[3][outH][outW];
// 진짜 영상처리 알고리즘
int R,G,B;
for(int i=0; i<inH; i++){
for(int k=0; k<inW; k++){
R = inImage[0][i][k];
G = inImage[1][i][k];
B = inImage[2][i][k];
int RGB = (int)((R+G+B)/3);
if(RGB > 127)
RGB = 255;
else
RGB=0;
outImage[0][i][k] = RGB;
outImage[1][i][k] = RGB;
outImage[2][i][k] = RGB;
}
}
// (4) 결과를 파일로 쓰기
outFname = Integer.toString(count) + filename ;
outFp = new File("C:/Out/"+outFname);
// 칼라 이미지 저장
outCImage = new BufferedImage(outH, outW,
BufferedImage.TYPE_INT_RGB);
outFs = new FileOutputStream(outFp.getPath());
// 메모리 --> 버퍼이미지
for (int i=0; i<outH; i++) {
for (int k=0; k<outW; k++) {
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);
outCImage.setRGB(i,k,px);
}
}
ImageIO.write(outCImage,"jpg", outFp);
count++;
<엔드인>
이미지 파일에서 최대, 최소 값을 찾아냄
최소에는 50을 더하고 최대 값에는 50을 뺀다
엔드인 공식은 (원본 값 - 최소값) / (최대값 - 최소값) * 255
그대로 적용해서 값 대입하여 출력
// 엔드인(5)
outH = inH;
outW = inW;
int low;
int high;
// 메모리 할당
outImage = new int[3][outH][outW];
low = inImage[0][0][0];
high = inImage[0][0][0];
// 진짜 영상처리 알고리즘
for (int rgb=0; rgb<3; rgb++)
for(int i=0; i<inH; i++){
for(int k=0; k<inW; k++){
int pixel = inImage[rgb][i][k];
if(pixel < low)
low = pixel;
else if(pixel > high)
high = pixel;
}
}
low +=50;
high -=50;
for (int rgb=0; rgb<3; rgb++)
for(int i=0; i<inH; i++){
for(int k=0; k<inW; k++){
int inValue = inImage[rgb][i][k];
int outValue = (inValue - low)/(high-low)*255;
if(outValue >255)
outValue = 255;
else if(outValue < 0)
outValue = 0;
outImage[rgb][i][k] = outValue;
}
}
// (4) 결과를 파일로 쓰기
outFname = Integer.toString(count) + filename ;
outFp = new File("C:/Out/"+outFname);
// 칼라 이미지 저장
outCImage = new BufferedImage(outH, outW,
BufferedImage.TYPE_INT_RGB);
outFs = new FileOutputStream(outFp.getPath());
// 메모리 --> 버퍼이미지
for (int i=0; i<outH; i++) {
for (int k=0; k<outW; k++) {
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);
outCImage.setRGB(i,k,px);
}
}
ImageIO.write(outCImage,"jpg", outFp);
count++;
<엠보싱>
엠보싱 마스크를 이용해서 새로운 배열을 생성하고 초기화해서 기존 값과 마스크 값을 곱하고 모두 더해서 출력 배열에 저장 후 출력
// 엠보싱(6)
outH = inH;
outW = inW;
int[][] mask1 = {{-1,0,0},{0,0,0},{0,0,1}};
int[][][] tmpImage1 = new int[3][inH+2][inW+2];
for (int rgb=0; rgb<3; rgb++)
for(int i=0; i<inH; i++){
for(int k=0; k<inW; k++){
tmpImage1[rgb][i][k] = 127;
}
}
for (int rgb=0; rgb<3; rgb++)
for(int i=0; i<inH; i++){
for(int k=0; k<inW; k++){
tmpImage1[rgb][i+1][k+1] = inImage[rgb][i][k];
}
}
// 메모리 할당
outImage = new int[3][outH][outW];
// 진짜 영상처리 알고리즘
for (int rgb=0; rgb<3; rgb++)
for(int i=0; i<inH; i++){
for(int k=0; k<inW; k++){
int x = 0;
for(int m=0; m<3; m++){
for(int n=0; n<3; n++){
x += mask1[m][n]*tmpImage1[rgb][i+m][k+n];
}
}
x += 127;
if(x > 255)
x = 255;
if(x < 0)
x = 0;
outImage[rgb][i][k] = x;
}
}
// (4) 결과를 파일로 쓰기
outFname = Integer.toString(count) + filename ;
outFp = new File("C:/Out/"+outFname);
// 칼라 이미지 저장
outCImage = new BufferedImage(outH, outW,
BufferedImage.TYPE_INT_RGB);
outFs = new FileOutputStream(outFp.getPath());
// 메모리 --> 버퍼이미지
for (int i=0; i<outH; i++) {
for (int k=0; k<outW; k++) {
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);
outCImage.setRGB(i,k,px);
}
}
ImageIO.write(outCImage,"jpg", outFp);
count++;
<블러링>
엠보싱과 마찬가지로 마스크를 적용하여 배열을 생성하고 초기화하여 원본 값과 마스크 값 모두 곱하고 더하여 출력
// 블러링(7)
outH = inH;
outW = inW;
double[][] mask2 = {{1.0/9.0,1.0/9.0,1.0/9.0},{1.0/9.0,1.0/9.0,1.0/9.0},{1.0/9.0,1.0/9.0,1.0/9.0}};
int[][][] tmpImage2 = new int[3][inH+2][inW+2];
for (int rgb=0; rgb<3; rgb++)
for(int i=0; i<inH; i++){
for(int k=0; k<inW; k++){
tmpImage2[rgb][i+1][k+1] = inImage[rgb][i][k];
}
}
// 메모리 할당
outImage = new int[3][outH][outW];
// 진짜 영상처리 알고리즘
for (int rgb=0; rgb<3; rgb++)
for(int i=0; i<inH; i++){
for(int k=0; k<inW; k++){
double x = 0.0;
for(int m=0; m<3; m++){
for(int n=0; n<3; n++){
x += mask2[m][n]*tmpImage2[rgb][i+m][k+n];
}
}
if(x > 255)
x = 255;
if(x < 0)
x = 0;
outImage[rgb][i][k] = (int)x;
}
}
// (4) 결과를 파일로 쓰기
outFname = Integer.toString(count) + filename ;
outFp = new File("C:/Out/"+outFname);
// 칼라 이미지 저장
outCImage = new BufferedImage(outH, outW,
BufferedImage.TYPE_INT_RGB);
outFs = new FileOutputStream(outFp.getPath());
// 메모리 --> 버퍼이미지
for (int i=0; i<outH; i++) {
for (int k=0; k<outW; k++) {
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);
outCImage.setRGB(i,k,px);
}
}
ImageIO.write(outCImage,"jpg", outFp);
count++;
<가우시안 필터>
마스크값 적용하여 동일하게 처리
// 가우시안 필터 처리(8)
outH = inH;
outW = inW;
double[][] mask3 = {{1.0/16.0,1.0/8.0,1.0/16.0},
{1.0/8.0,1.0/4.0,1.0/8.0},
{1.0/16.0,1.0/8.0,1.0/16.0}};
int[][][] tmpImage3 = new int[3][inH+2][inW+2];
for (int rgb=0; rgb<3; rgb++)
for(int i=0; i<inH; i++){
for(int k=0; k<inW; k++){
tmpImage3[rgb][i+1][k+1] = inImage[rgb][i][k];
}
}
// 메모리 할당
outImage = new int[3][outH][outW];
// 진짜 영상처리 알고리즘
for (int rgb=0; rgb<3; rgb++)
for(int i=0; i<inH; i++){
for(int k=0; k<inW; k++){
double x = 0.0;
for(int m=0; m<3; m++){
for(int n=0; n<3; n++){
x += mask3[m][n]*tmpImage3[rgb][i+m][k+n];
}
}
if(x > 255)
x = 255;
if(x < 0)
x = 0;
outImage[rgb][i][k] = (int)x;
}
}
// (4) 결과를 파일로 쓰기
outFname = Integer.toString(count) + filename ;
outFp = new File("C:/Out/"+outFname);
// 칼라 이미지 저장
outCImage = new BufferedImage(outH, outW,
BufferedImage.TYPE_INT_RGB);
outFs = new FileOutputStream(outFp.getPath());
// 메모리 --> 버퍼이미지
for (int i=0; i<outH; i++) {
for (int k=0; k<outW; k++) {
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);
outCImage.setRGB(i,k,px);
}
}
ImageIO.write(outCImage,"jpg", outFp);
count++;
<샤프닝>
마스크값 적용하여 동일하게 적용
// 샤프닝(9)
outH = inH;
outW = inW;
double[][] mask4 = {{0.0,-1.0,0.0},
{-1.0,5.0,-1.0},
{0.0,-1.0,0.0}};
int[][][] tmpImage4 = new int[3][inH+2][inW+2];
for (int rgb=0; rgb<3; rgb++)
for(int i=0; i<inH; i++){
for(int k=0; k<inW; k++){
tmpImage4[rgb][i+1][k+1] = inImage[rgb][i][k];
}
}
// 메모리 할당
outImage = new int[3][outH][outW];
// 진짜 영상처리 알고리즘
for (int rgb=0; rgb<3; rgb++)
for(int i=0; i<inH; i++){
for(int k=0; k<inW; k++){
double x = 0.0;
for(int m=0; m<3; m++){
for(int n=0; n<3; n++){
x += mask4[m][n]*tmpImage4[rgb][i+m][k+n];
}
}
if(x > 255)
x = 255;
if(x < 0)
x = 0;
outImage[rgb][i][k] = (int)x;
}
}
// (4) 결과를 파일로 쓰기
outFname = Integer.toString(count) + filename ;
outFp = new File("C:/Out/"+outFname);
// 칼라 이미지 저장
outCImage = new BufferedImage(outH, outW,
BufferedImage.TYPE_INT_RGB);
outFs = new FileOutputStream(outFp.getPath());
// 메모리 --> 버퍼이미지
for (int i=0; i<outH; i++) {
for (int k=0; k<outW; k++) {
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);
outCImage.setRGB(i,k,px);
}
}
ImageIO.write(outCImage,"jpg", outFp);
count++;
<경계선 검출>
마스크 값을 2개씩 생성하고 각각 배열을 새롭게 생성하고 배열끼리 곱하고 더하여 변수에 저장
각각 제곱한 값에 루트를 씌워 출력
// 경계선 검출(10)
outH = inH;
outW = inW;
double[][] maskW ={{-1.0,-1.0,-1.0},
{0.0,0.0,0.0},
{1.0,1.0,1.0}};
double[][] maskH ={{1.0,0.0,-1.0},
{1.0,0.0,-1.0},
{1.0,0.0,-1.0}};
int[][][] tmpImageW = new int[3][inH+2][inW+2];
int[][][] tmpImageH = new int[3][inH+2][inW+2];
int[][][] tmpImageW2 = new int[3][inH][inW];
int[][][] tmpImageH2 = new int[3][inH][inW];
for (int rgb=0; rgb<3; rgb++)
for(int i=0; i<inH; i++){
for(int k=0; k<inW; k++){
tmpImageW[rgb][i+1][k+1] = inImage[rgb][i][k];
tmpImageH[rgb][i+1][k+1] = inImage[rgb][i][k];
}
}
// 메모리 할당
outImage = new int[3][outH][outW];
// 진짜 영상처리 알고리즘
for (int rgb=0; rgb<3; rgb++)
for(int i=0; i<inH; i++){
for(int k=0; k<inW; k++){
double x = 0.0, y = 0.0;
for(int m=0; m<3; m++){
for(int n=0; n<3; n++){
x += maskW[m][n]*tmpImageW[rgb][i+m][k+n];
y += maskH[m][n]*tmpImageW[rgb][i+m][k+n];
}
}
int v = (int)Math.sqrt(x*x + y*y);
if(v>255)
v = 255;
else if(v<0)
v = 0;
outImage[rgb][i][k] = v;
}
}
// (4) 결과를 파일로 쓰기
outFname = Integer.toString(count) + filename ;
outFp = new File("C:/Out/"+outFname);
// 칼라 이미지 저장
outCImage = new BufferedImage(outH, outW,
BufferedImage.TYPE_INT_RGB);
outFs = new FileOutputStream(outFp.getPath());
// 메모리 --> 버퍼이미지
for (int i=0; i<outH; i++) {
for (int k=0; k<outW; k++) {
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);
outCImage.setRGB(i,k,px);
}
}
ImageIO.write(outCImage,"jpg", outFp);
count++;
<유사연산자>
유사연산자 공식을 이용하여 적용하여 출력
// 유사연산자(11)
outH = inH;
outW = inW;
int[][][] tmpImage6 = new int[3][inH+2][inW+2];
for (int rgb=0; rgb<3; rgb++)
for(int i=0; i<inH; i++){
for(int k=0; k<inW; k++){
tmpImage6[rgb][i+1][k+1] = inImage[rgb][i][k];
}
}
// 메모리 할당
outImage = new int[3][outH][outW];
// 진짜 영상처리 알고리즘
for (int rgb=0; rgb<3; rgb++)
for(int i=0; i<inH; i++){
for(int k=0; k<inW; k++){
double max = 0.0;
double x = 0.0;
for(int m=0; m<3; m++){
for(int n=0; n<3; n++){
x = Math.abs(tmpImage6[rgb][i+1][k+1] - tmpImage6[rgb][i+m][k+n]);
if(x>=max)
max = x;
}
}
if(max > 255)
max = 255;
if(max < 0)
max = 0;
outImage[rgb][i][k] = (int)max;
}
}
// (4) 결과를 파일로 쓰기
outFname = Integer.toString(count) + filename ;
outFp = new File("C:/Out/"+outFname);
// 칼라 이미지 저장
outCImage = new BufferedImage(outH, outW,
BufferedImage.TYPE_INT_RGB);
outFs = new FileOutputStream(outFp.getPath());
// 메모리 --> 버퍼이미지
for (int i=0; i<outH; i++) {
for (int k=0; k<outW; k++) {
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);
outCImage.setRGB(i,k,px);
}
}
ImageIO.write(outCImage,"jpg", outFp);
count++;
<차연산자>
차연산자의 알고리즘을 적용하여 배열에 할당하여 출력
// 차연산자(12)
outH = inH;
outW = inW;
int[][][] tmpImage7 = new int[3][inH+2][inW+2];
for (int rgb=0; rgb<3; rgb++)
for(int i=0; i<inH; i++){
for(int k=0; k<inW; k++){
tmpImage7[rgb][i+1][k+1] = inImage[rgb][i][k];
}
}
// 메모리 할당
outImage = new int[3][outH][outW];
// 진짜 영상처리 알고리즘
for (int rgb=0; rgb<3; rgb++)
for(int i=0; i<inH; i++){
for(int k=0; k<inW; k++){
double max = 0.0;
int x = 0;
x = Math.abs(tmpImage7[rgb][i][k] - tmpImage7[rgb][i+2][k+2]);
if(x>=max)
max = x;
x = Math.abs(tmpImage7[rgb][i][k+1] = tmpImage7[rgb][i+2][k+1]);
if(x>=max)
max = x;
x = Math.abs(tmpImage7[rgb][i][k+2] = tmpImage7[rgb][i+2][k]);
if(x>=max)
max = x;
x = Math.abs(tmpImage7[rgb][i+1][k+2] = tmpImage7[rgb][i+1][k]);
if(x>=max)
max = x;
if(max > 255)
max = 255;
if(max < 0)
max = 0;
outImage[rgb][i][k] = (int)max;
}
}
// (4) 결과를 파일로 쓰기
outFname = Integer.toString(count) + filename ;
outFp = new File("C:/Out/"+outFname);
// 칼라 이미지 저장
outCImage = new BufferedImage(outH, outW,
BufferedImage.TYPE_INT_RGB);
outFs = new FileOutputStream(outFp.getPath());
// 메모리 --> 버퍼이미지
for (int i=0; i<outH; i++) {
for (int k=0; k<outW; k++) {
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);
outCImage.setRGB(i,k,px);
}
}
ImageIO.write(outCImage,"jpg", outFp);
count++;
<LOG>
마스크를 5x5를 사용하여 새로운 배열을 생성
마스크값과 원본값을 곱하고 더하여 새로운 배열 생성 후 출력
// LOG(13)
outH = inH;
outW = inW;
int[][] mask8 = {{0,0,-1,0,0},
{0,-1,-2,-1,0},
{-1,-2,16,-2,-1},
{0,-1,-2,-1,0},
{0,0,-1,0,0}};
int[][][] tmpImage8 = new int[3][inH+4][inW+4];
for (int rgb=0; rgb<3; rgb++)
for(int i=0; i<inH; i++){
for(int k=0; k<inW; k++){
tmpImage8[rgb][i+2][k+2] = inImage[rgb][i][k];
}
}
// 메모리 할당
outImage = new int[3][outH][outW];
// 진짜 영상처리 알고리즘
for (int rgb=0; rgb<3; rgb++)
for(int i=0; i<inH; i++){
for(int k=0; k<inW; k++){
int x = 0;
for(int m=0; m<5; m++){
for(int n=0; n<5; n++){
x += mask8[m][n]*tmpImage8[rgb][i+m][k+n];
}
}
if(x > 255)
x = 255;
if(x < 0)
x = 0;
outImage[rgb][i][k] = x;
}
}
// (4) 결과를 파일로 쓰기
outFname = Integer.toString(count) + filename ;
outFp = new File("C:/Out/"+outFname);
// 칼라 이미지 저장
outCImage = new BufferedImage(outH, outW,
BufferedImage.TYPE_INT_RGB);
outFs = new FileOutputStream(outFp.getPath());
// 메모리 --> 버퍼이미지
for (int i=0; i<outH; i++) {
for (int k=0; k<outW; k++) {
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);
outCImage.setRGB(i,k,px);
}
}
ImageIO.write(outCImage,"jpg", outFp);
count++;
<DOG>
7x7 마스크 값을 적용하여 배열에 적용 후 출력
// DOG(14)
outH = inH;
outW = inW;
int[][] mask9 = {{0,0,-1,-1,-1,0,0},
{0,-2,-3,-3,-3,-2,0},
{-1,-3,5,5,5,-3,-1},
{-1,-3,5,16,5,-3,-1},
{-1,-3,5,5,5,-3,-1},
{0,-2,-3,-3,-3,-2,0},
{0,0,-1,-1,-1,0,0}};
int[][][] tmpImage9 = new int[3][inH+6][inW+6];
for (int rgb=0; rgb<3; rgb++)
for(int i=0; i<inH; i++){
for(int k=0; k<inW; k++){
tmpImage9[rgb][i+3][k+3] = inImage[rgb][i][k];
}
}
// 메모리 할당
outImage = new int[3][outH][outW];
// 진짜 영상처리 알고리즘
for (int rgb=0; rgb<3; rgb++)
for(int i=0; i<inH; i++){
for(int k=0; k<inW; k++){
int x = 0;
for(int m=0; m<7; m++){
for(int n=0; n<7; n++){
x += mask9[m][n]*tmpImage9[rgb][i+m][k+n];
}
}
if(x > 255)
x = 255;
if(x < 0)
x = 0;
outImage[rgb][i][k] = x;
}
}
// (4) 결과를 파일로 쓰기
outFname = Integer.toString(count) + filename ;
outFp = new File("C:/Out/"+outFname);
// 칼라 이미지 저장
outCImage = new BufferedImage(outH, outW,
BufferedImage.TYPE_INT_RGB);
outFs = new FileOutputStream(outFp.getPath());
// 메모리 --> 버퍼이미지
for (int i=0; i<outH; i++) {
for (int k=0; k<outW; k++) {
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);
outCImage.setRGB(i,k,px);
}
}
ImageIO.write(outCImage,"jpg", outFp);
count++;
다음 영상처리는 다른 게시물에서 다루 도록 하겠다!!!
'코딩 연습장 > JSP' 카테고리의 다른 글
JSP 개인 프로젝트 - 3 (이미지 파일 등록 화면) (0) | 2021.06.24 |
---|---|
JSP 개인 프로젝트 - 2 ( 회원 가입 ) (0) | 2021.06.23 |
JSP 개인 프로젝트 - 1 (JSP 로그인) (0) | 2021.06.21 |
Python/JSP/R 이용한 맛집 프로젝트 - 11 (JSP, DB 연동) (0) | 2021.06.21 |
Python/JSP/R 이용한 맛집 프로젝트 - 9 (JSP 지역별 지도화면) (0) | 2021.06.19 |