1. 程式人生 > >影象運算(七)——邏輯或(OR)

影象運算(七)——邏輯或(OR)

描述:

As OR

input1input2output

0              0              0

0              1              1

1              0               1

1              1                1

As NOR

input1input2output

0               0              1

0               1              0

1                0             0

1                1              1

Code:

Such as :

  /**
   *Applies the image OR 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 NOR Boolean to indicate wether we should NOR rather than OR
   *@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
   *@return A pixel array containing the (N)OR of the two input images
   */

  public int [] doOr(int [] src1_1d, int [] src2_1d, boolean NOR, 
		     int width, int height, float oset, float scale){
    
    int place1 = -1;
    int place2 = -1;
    int src1rgb = 0;
    int src2rgb = 0;
    int result = 0;
   
    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 (NOR) {
	  result = (int) ((scale * (float)(~(src1rgb | src2rgb) & 0xff))+oset);
	} else {
	  result = (int) ((scale * (float) ( src1rgb | 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 {
     
      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 (NOR) {
	result = (int) ((scale * (float) (~(src1rgb | src2rgb) & 0xff))+ oset);
      } else {
	result = (int) ((scale * (float) ( src1rgb | 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:


總結:一句話概括之“取其共性,去其糟粕”