同时读写图像处理

时间:2011-10-04 18:44:13

标签: image processing simultaneous

我正在生成一种颜色出现在另一种颜色右侧的概率表。我已经完成了所有这些。我将表存储在为每个颜色值创建的对象中。我的问题是,当我生成一个新图像时,我想创建像素0,然后对右边显示的颜色做出加权随机决策。我认为我的问题是我正在尝试从正在构建的图像中读取数据,并在同一个循环中写入它。我不确定处理是如何处理的,而且我似乎得到了奇怪的错误,通常,我的很多像素都是黑色的。我相信我的所有问题都是在我第三次遍历所有像素(第60-78行)时发生的,并尝试将像素写入新图像。

你可以在println语句的输出中看到应该写入新图像的颜色。

有什么我想念的吗? 这是我第一次使用类和对象进行编码,所以请原谅任何笨拙。 提前感谢任何人提供的任何帮助。

PImage src;
PImage dstn;
HashMap library;
int counter;
color d = (0);
color seed = (0);
color ds = (0);


void setup() {
  library = new HashMap<Integer, Object>();
  size(200, 200);
  src = loadImage("sunflower.jpg");
  dstn = createImage(src.width, src.height, RGB);
  src.loadPixels();
  int acc = 0; 
  for (int y = 0; y < height; y++) {
    for (int x = 0; x < width; x++) {
      int loc = x + y*width;
      color d = src.get(x,y); // get pixel color at desired location
      if (library.containsKey(d)) {
      // Get the AColor object and increase the count
      // We access objects from the library via its key, the String
      AColor c = (AColor) library.get(d);
      c.count(); // touch the counter everytime the a color is read
      c.the_color(d); // add the color to the object
      //c.output();   
    } else { 
      // Otherwise make a new entry in library
      AColor c = new AColor(d);
      // And add to the library
      // put() takes two arguments, "key" and "value"
      // The key for us is the String and the value is the AColor object
      library.put(d, c);
      } // all colors are in library now

      AColor c = (AColor) library.get(d);
      if (x < width - 1 ) { //If statement to ensure null pixles are not added to transition matrix
        color z = src.get(x+1,y);
        c.access_matrix_right(z);
      } else { // this is a nasty shortcut that wraps the probability of the rightmost pixel to the leftmost pixel
        color z = src.get(x,y);
        c.access_matrix_right(z);
      }     
   } 
  }  
}


void draw() {
    for (int y = 0; y < height; y++) {
    for (int x = 0; x < width; x++) {
      color d = src.get(x,y);
      AColor c = (AColor) library.get(d);
      c.sort_matrix(); // add and construct all of the ArrayLists for each object
      println("first loop");  
     }
    }

    for (int y = 0; y < height; y++) {
    for (int x = 0; x < width; x++) {
      int loc1 = ((x + y*width));
      color seed = src.get(x,y);
      dstn.pixels[0] = seed; 
      color ds = src.get(x,y); // copy pixel 0 from src to dstn image
      AColor c = (AColor) library.get(ds);
      float chance; 
      int acc = 0;
      chance = random(1);
      float probAccum = (c.probs.get(acc));

      while (chance > probAccum) {
      acc++;
      probAccum = probAccum + (c.probs.get(acc));
      int colorToTheRight = c.colors.get(acc);
      dstn.pixels[loc1] = colorToTheRight; // <-If I put this outside of the while lopp, the image is more or less normal looking.

       }
       println(acc + " " + c.colors.get(acc) + " , " + c.colors + " - " + c.probs + " Chance = " + chance +" -color should be" + (c.colors.get(acc)));
       dstn.updatePixels();   
    }
   }  
  dstn.updatePixels();
  image(dstn,0,0);  
  noLoop();
}
class AColor {
  float count;
  int theColor;
  int colorRight;
  int acc = 0; 
  int z;
  HashMap<Object, Integer> matrix = new HashMap<Object, Integer>();
  ArrayList<Float> probs;
  ArrayList<Integer> colors = new ArrayList<Integer>(); //an ArrayList is used here. Perhaps it would be better to use an Array and iterate over the hashmap to set the length



  AColor(int theColorTemp) {
    theColor = theColorTemp;
    count = 1;
  }
  void the_color(int theColorTemp) {
    theColor = theColorTemp; 

  }
  void count() {
    count++;
  }


  void access_matrix_right(int colorRightTemp) {

    colorRight = colorRightTemp;
    if (matrix.containsKey(colorRight)) { // if library has entry for current pixel
      int val = ((Integer) matrix.get(colorRight)).intValue(); //accumulator 
      matrix.put(colorRight, new Integer(val + 1));  // add 1 to
      }
      else {
       matrix.put(colorRight,1); //adds entry & a value of 1 if entry does not exist
       colors.add(colorRight);    
      }  
  }

  void sort_matrix() {

    probs = new ArrayList<Float>();

    for (int i = 0; i <= colors.size()-1; i++) { //for number elements in list
      probs.add((matrix.get(colors.get(i))) / count); // add element in array probs (number of occurrances of a color on the right/ total pixels on right )
    } 
  }
 }

1 个答案:

答案 0 :(得分:0)

为什么不将所有像素读入第二个图像写入,然后将其写回原始图像? 不会像这样的工作吗? (另)

int numPixelsX = 500;
int numPixelsY = 500; 
PImage captureImage = createImage (numPixelsX,numPixelsY, ARGB);

void setup(){
    size(500,500);
}


void draw(){

    captureImage.loadPixels();  
    captureImage = pushPixels(captureImage);
    captureImage.updatePixels();
    image(captureImage, 0, 0);
}

PImage pushPixels(PImage readImage){
    PImage writeImage = createImage(numPixelsX,numPixelsY,ARGB);
    writeImage.loadPixels();
    writeImage = readImage();
    //do your stuff here from the read image to the write image
    writeImage.updatePixels();
    return writeImage;
}