코딩 연습장/JSP

JSP 개인 프로젝트 - 4 (Java 컬러 이미지 영상 처리)

Do아 2021. 7. 2. 16:28
728x90

2021/05/03(월)

 

 

 

 

 

 

JSP 개인프로젝트 이미지 파일 등록 알고리즘 참고

https://cordingdoah.tistory.com/113

 

JSP 개인 프로젝트 - 3 (이미지 파일 등록 화면)

2021/05/03(월) JSP 개인프로젝트 회원가입 알고리즘 참고 https://cordingdoah.tistory.com/110 JSP 개인 프로젝트 - 2 ( 회원 가입 ) 2021/05/03(월) JSP 개인프로젝트 로그인 참고 https://cordingdoah.tistory..

cordingdoah.tistory.com

 

 

 

 

이미지 파일을 선택하고 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++;

 

 

 

다음 영상처리는 다른 게시물에서 다루 도록 하겠다!!!

 

 

 

 

 

 

 

728x90