одновременная обработка чтения и записи изображения

#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 amp; 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. Если ваша цель — создать таблицу вероятностей, почему вы «создаете новое изображение»? Что вы на самом деле пытаетесь сделать? Ваш фактический вопрос неясен. Вы также можете попробовать переформатировать свой код, его немного сложно читать таким, какой он есть.

2. Я хотел бы сгенерировать новое изображение на основе таблиц вероятностей. Проблема в том, что, когда я пишу это новое изображение, я также считываю его, просматриваю таблицы вероятностей, а затем записываю еще один пиксель. Вероятность — это не моя проблема, это одновременное чтение и запись изображения.

3. Почему вы одновременно читаете и записываете изображение? Это не обязательно для проблемы, которую вы решаете. Сгенерированный образ может быть доступен только для записи.

Ответ №1:

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

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