본문 바로가기

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

화소점처리

동일영상

원본 사진 -->결과 사진

public void equalImage(){
	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]=inImage[rgb][i][k];
		}
	}
	}
}

반전영상

 

원본 사진 -->결과 사진

public void reverseImage(){
	//반전영상
	//중요! 출력영상의 크기 결정 알고리즘에 의존
	outH = inH;
	outW = inW;
	outImage = new int[3][outH][outW];
	//**Image Processing Algorithm**
	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];
			}
		}
	}
}

밝게/어둡게

원본 사진 -->결과 사진(밝게)
원본 사진 -->결과 사진(어둡게)

public void addImage(){
	//Add Image 영상
	//중요! 출력 영상의 크기 결정(알고리즘에 의존)
	outH=inH;
	outW=inW;
	outImage=new int[3][outH][outW];
	//**Image Processing Algorithm **
	int value = Integer.parseInt(para1);
	for(int rgb=0;rgb<3;rgb++){
		for(int i=0;i<inH;i++){
			for(int k=0;k<inW;k++){
				if(inImage[rgb][i][k]+value>255)
					outImage[rgb][i][k]=255;
				else if(inImage[rgb][i][k]+value<0)
					outImage[rgb][i][k]=0;
				else
					outImage[rgb][i][k]=inImage[rgb][i][k]+value;
			}
		}
	}
	
}

영상 곱하기

원본 사진 -->결과 사진

public void gopImage(){
	//gop Image 영상
	//중요! 출력 영상의 크기 결정(알고리즘에 의존)
	outH=inH;
	outW=inW;
	outImage=new int[3][outH][outW];
	//**Image Processing Algorithm **
	int value = Integer.parseInt(para1);
	for(int rgb=0;rgb<3;rgb++){
		for(int i=0;i<inH;i++){
			for(int k=0;k<inW;k++){
				if(inImage[rgb][i][k]*value>255)
					outImage[rgb][i][k]=255;
				else if(inImage[rgb][i][k]*value<0)
					outImage[rgb][i][k]=0;
				else
					outImage[rgb][i][k]=inImage[rgb][i][k]*value;
			}
		}
	}
}

영상 나누기

원본 사진 -->결과 사진

public void divImage(){
	//gop Image 영상
	//중요! 출력 영상의 크기 결정(알고리즘에 의존)
	outH=inH;
	outW=inW;
	outImage=new int[3][outH][outW];
	//**Image Processing Algorithm **
	int value = Integer.parseInt(para1);
	for(int rgb=0;rgb<3;rgb++){
		for(int i=0;i<inH;i++){
			for(int k=0;k<inW;k++){
				if(inImage[rgb][i][k]/value>255)
					outImage[rgb][i][k]=255;
				else if(inImage[rgb][i][k]/value<0)
					outImage[rgb][i][k]=0;
				else
					outImage[rgb][i][k]=inImage[rgb][i][k]/value;
			}
		}
	}
}

흑백 127

원본 사진 -->결과 사진

public void image127(){
	//흑백 127기준변환
	outH = inH;
	outW = inW;
	outImage = new int[3][outH][outW];

	//** Image Processing Algorithm **
	for(int i=0;i<inH;i++){
		for(int k=0;k<inW;k++){
			int sumValue = inImage[0][i][k]+inImage[1][i][k]+inImage[2][i][k];
			int avgValue = sumValue/3;
			
			if(avgValue>127){
				outImage[0][i][k]=255;
				outImage[1][i][k]=255;
				outImage[2][i][k]=255;
			}
			else{
				outImage[0][i][k]=0;
				outImage[1][i][k]=0;
				outImage[2][i][k]=0;
			}
		}
	}
}

흑백평균

원본 사진 -->결과 사진

public void avgImage(){
	//흑백 평균기준변환
	outH = inH;
	outW = inW;
	outImage = new int[3][outH][outW];

	int hap=0,avg,cnt=0;
	
	for(int rgb=0;rgb<3;rgb++){
		for(int i=0;i<inH;i++){
			for(int k=0;k<inW;k++){
				hap+=inImage[rgb][i][k];
				cnt++;
			}
		}
	}
	
	avg = hap/cnt;

	//** Image Processing Algorithm **
	for(int i=0;i<inH;i++){
		for(int k=0;k<inW;k++){
			int sumValue = inImage[0][i][k]+inImage[1][i][k]+inImage[2][i][k];
			int avgValue = sumValue/3;
			
			if(avgValue>avg){
				outImage[0][i][k]=255;
				outImage[1][i][k]=255;
				outImage[2][i][k]=255;
			}
				
			else{
				outImage[0][i][k]=0;
				outImage[1][i][k]=0;
				outImage[2][i][k]=0;
			}
		}
	}
}

파라볼라 컵

원본 사진 -->결과 사진

public void paraCupImage(){
	outH=inH;
	outW=inW;

	outImage = new int[3][outH][outW];
	for(int rgb=0;rgb<3;rgb++){
		for(int i=0;i<outH;i++){
			for(int k=0;k<outW;k++){
				outImage[rgb][i][k]=(int)(Math.pow((double)(inImage[rgb][i][k]/128-1),(double)2)*255);
			}
		}
	}
}

파라볼라 캡

원본 사진 -->결과 사진

public void paraCapImage(){
	outH=inH;
	outW=inW;

	outImage = new int[3][outH][outW];
	for(int rgb=0;rgb<3;rgb++){
		for(int i=0;i<outH;i++){
			for(int k=0;k<outW;k++){
				outImage[rgb][i][k]=(int)(255-(255)*Math.pow((double)(inImage[rgb][i][k]/128-1),(double)2));
			}
		}
	}
}

감마

원본 사진 -->결과 사진

public void gammaImage(){
	//감마
	outH =inH;
	outW =inW;
	// 메모리 할당
	outImage = new int[3][outH][outW];
	/// ** Image Processing Algorithm **
	double value = Double.parseDouble(para1);
	if(value <0)
		value =1/(1-value);
	else
		value +=1;

	//감마 변환
	for(int rgb=0;rgb<3;rgb++){
		for(int i=0; i<inH; i++){
			for(int k=0; k<inW; k++){
				double result=(Math.pow((double)(inImage[rgb][i][k]/255.0),(double)(value))*255+0.5);
				if(result <0)
					result=0;
				else if(result >255)
					result=255;
				outImage[rgb][i][k] = (int)result;
			}
		}
	}
}

채도변환

원본 사진 -->결과 사진

public void saturImage() { // 채도 변경 알고리즘
    // (중요!) 출력 이미지의 크기가 결정 ---> 알고리즘에 의존...
    outH = inH;
    outW = inW;

    // 출력 영상의 3차원 메모리 할당
   	outImage = new int[3][inH][inW];
    
    // **** 진짜 영상처리 알고리즘 *****
	float s_value = Float.parseFloat(para1);
 

        for (int i=0; i<inH; i++) {
            for (int k=0; k<inW; k++) {
                float R = inImage[0][i][k];
                float G = inImage[1][i][k];
                float B = inImage[2][i][k];

                // RGB --> HSV
                //rgb2hsv(R,G,B);  // {h : 0~360, s : 0 ~ 1.0, v : 0 ~ 1.0}
               // int HSV[];
               		//System.out.println("R"+R);

                
                abc = rgb2hsv(R,G,B);
                
                float H = abc[0];
                float S = abc[1];
                float V = abc[2];
           	
                
                // 채도를 변경하자
                S = S + s_value;
                
                // HSV --> RGB
                
                		
                def = hsv2rgb(H,S,V);
				int R1 = (int) def[0]; 
				int G1 = (int) def[1];
				int B1 = (int) def[2];

                // 출력 영상에 넣기
                outImage[0][i][k] = R1;
                outImage[1][i][k] = G1;
                outImage[2][i][k] = B1;
            }
        }            
    // ******************************
}

그레이스케일

원본 사진 -->결과 사진

public void grayImage(){
	outH=inH;
	outW=inW;
	
	outImage = new int[3][outH][outW];
	
	for(int i=0;i<inH;i++){
		for(int k=0;k<inW;k++){
			int sumValue = inImage[0][i][k]+inImage[1][i][k]+inImage[2][i][k];
			int avgValue = sumValue/3;
			
			outImage[0][i][k]=avgValue;
			outImage[1][i][k]=avgValue;
			outImage[2][i][k]=avgValue;
		}
	}
	
}

명도변환

원본 사진 -->결과 사진

public void intensityImage() { // 명도 변경 알고리즘
    // (중요!) 출력 이미지의 크기가 결정 ---> 알고리즘에 의존...
    outH = inH;
    outW = inW;

    // 출력 영상의 3차원 메모리 할당
   	outImage = new int[3][inH][inW];
    
    // **** 진짜 영상처리 알고리즘 *****
	float v_value = Float.parseFloat(para1);
 

        for (int i=0; i<inH; i++) {
            for (int k=0; k<inW; k++) {
                float R = inImage[0][i][k];
                float G = inImage[1][i][k];
                float B = inImage[2][i][k];

                // RGB --> HSV
                //rgb2hsv(R,G,B);  // {h : 0~360, s : 0 ~ 1.0, v : 0 ~ 1.0}
               // int HSV[];
               		//System.out.println("R"+R);

                
                abc = rgb2hsv(R,G,B);
                
                float H = abc[0];
                float S = abc[1];
                float V = abc[2];
           	
                
                // 채도를 변경하자
                V = V + v_value;
                
                // HSV --> RGB
                
                		
                def = hsv2rgb(H,S,V);
				int R1 = (int) def[0]; 
				int G1 = (int) def[1];
				int B1 = (int) def[2];

                // 출력 영상에 넣기
                outImage[0][i][k] = R1;
                outImage[1][i][k] = G1;
                outImage[2][i][k] = B1;
            }
        }            
    // ******************************
}

오렌지추출

public void orangeImage(){
	outH=inH;
	outW=inW;
	
	outImage= new int[3][outH][outW];
	
	for(int i=0;i<inH;i++){
		for(int k=0;k<inW;k++){
			int R = inImage[0][i][k];
			int G = inImage[1][i][k];
			int B = inImage[2][i][k];
			
			hsv = rgb2hsv(R,G,B);
			float H = hsv[0];
			float S = hsv[1];
			float v = hsv[2];
			
			if(8<=(H*360)&&(H*360)<=30){
				outImage[0][i][k]=R;
				outImage[1][i][k]=G;
				outImage[2][i][k]=B;
				
			}
			else{
				int avg =(R+G+B)/3;
				outImage[0][i][k]=avg;
				outImage[1][i][k]=avg;
				outImage[2][i][k]=avg;
				
			}
		}
	}
}