чтение и запись изображения одновременно - PullRequest
0 голосов
/ 04 октября 2011

Я создаю таблицы вероятностей для одного цвета, появляющегося справа от другого. Я выполнил все это. Я храню таблицы в объектах, которые создаются для каждого значения цвета. Моя проблема в том, что когда я генерирую новое изображение, я хотел бы создать пиксель 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 голосов
/ 05 октября 2011

Почему бы не прочитать все ваши пиксели во втором изображении, записать в него, а затем записать обратно в исходное?что-то вроде этой работы?(не проверено)

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;
}
...