그림 연산 (4) - 나눗셈 (Division)

3164 단어 #ImageProcessing-Base
앞의 3 개 와 마찬가지 로 나 누 기 공식: O (i, j) = I1 (i, j) * I2 (i, j)
OR   O(i,j) = I(i,j) / C   (C is a constant)
 Code :
  /**
   *Applies the image Div operator on the specified image arrays, with the
   *specified offset and scale value
   *@param src1_1d The first source image as a pixel array
   *@param src2_1d The second source image as a pixel array
   *@param width width of the destination image in pixels
   *@param height height of the destination image in pixels
   *@param oset The offset value
   *@param scale The scale value
   *@param reverse Reverse the order of the division
   *@return A pixel array containing one image divided by the other
   */
public int [] doDiv(int [] src1_1d, int [] src2_1d, int width, int height, 
		      float oset, float scale, boolean reverse) {
    
    int place1 = -1;
    int place2 = -1;
    int src1rgb = 0;
    int src2rgb = 0;
    int result = 0;
    //Get size of image and make 1d_arrays
    d_w = width;
    d_h = height;
    
    
    dest_1d = new int[d_w*d_h];
    
    boolean firstwider = false;
    boolean secondwider = false;
    int wrap;
    
    if (i1_w > d_w){
      wrap =   ((i1_w + 1) - d_w);
      firstwider = true;
    } else if (i2_w > d_w){
      wrap =    ((i2_w + 1) - d_w);
      secondwider = true;
      
    } else {
      wrap = 0;
    }
    
    //if you know there is no wrap around, you can save yourself some time
    
    if (wrap == 0) {
      for (int i=0; i< dest_1d. length ; i++){
	src2rgb = src2_1d[i] & 0x000000ff;
	src1rgb = src1_1d[i] & 0x000000ff;
	if( !reverse ) {
	  result = (int) ((scale * ((float) src2rgb / (float) src1rgb ))+oset);
	} else {
	  result = (int) ((scale * ((float) src1rgb / (float) src2rgb ))+oset);
	}
	if (result < 0){
	  result = 0;
	} else if  (result > 255){
	  result = 255;
	}
	
	//create an int value for dest_1d
	dest_1d[i ] =  0xff000000 | (result + (result << 16) + (result << 8));
	
      }
      
      return dest_1d;
      
    } else { // wrap != 0
      
      for (int i=0; i< dest_1d. length ; i++){
	
	//we might need to skip out some pixels which aren't in the overlap area
	
	if ((i %d_w  ) == 0 ) {
	  if ( i == 0 ){
	    place1 = 0;
	    place2 = 0;
	  } else if (secondwider) {
	    place2 = place2 + wrap;
	    place1 ++;
	  } else {
	    place1 = place1 + wrap;
	    place2 ++;
	  }
	} else{
	  place2 ++;
	  place1 ++;
	}
	
	src2rgb = src2_1d[place2] & 0x000000ff;
	src1rgb = src1_1d[place1] & 0x000000ff;
	
	if( !reverse ) {
	  if (src1rgb == 0) src1rgb = 1;
	  result = (int) ((scale * ((float) src2rgb / (float) src1rgb ))+oset);
	} else {
	  if (src2rgb == 0) src2rgb = 1;
	  result = (int) ((scale * ((float) src1rgb / (float) src2rgb ))+oset);
	}
	
	if (result < 0){
	  result = 0;
	} else if  (result > 255){
	  result = 255;
	}
	
	//create an int value for dest_1d
	dest_1d[i ] =  0xff000000 | (result + (result << 16) + (result << 8));
      }
      return dest_1d;
    }
  }

Input Image :
Output Image:
요약: 나눗셈 연산 은 두 그림 간 의 대비 로 이해 할 수 있 고 두 그림 간 의 대비 도 라 고 할 수 있다.

좋은 웹페이지 즐겨찾기