Порог метод превращает каждый пиксель в черный

Я пытаюсь реализовать свой собственный пороговый метод при обработке, но я получаю полностью черное изображение, когда пытаюсь запустить метод на изображении. Любая помощь?

void threshold(PImage img) {
  for (int i = 0; i < 300; i++) {
    for (int j = 0; j < 300; j++) {
      if (img.pixels[imgP(i, j)] >= 128)
        img.pixels[imgP(i, j)] = 255;
      else 
      img.pixels[imgP(i, j)] = 0;
    }
  }
  img.updatePixels();
}

int imgP(int i, int j) {
  return i*300 + j;
}

1 ответ

Решение

Есть несколько вещей, которые нужно улучшить:

  1. не кодируйте размеры изображения (300 300), используйте img .width а также .height свойство: вам будет проще повторно использовать ваш код
  2. если вы просматриваете каждый пиксель, нет необходимости использовать вложенный цикл и imgP Функция для вычисления индекса пикселей по оси, Y позиции. Просто перебрать один раз img.pixels (от 0 до img.pixels.length)

С точки зрения невыполнения порогового условия, улов является условием и, главным образом, значением сравнения:if (img.pixels[imgP(i, j)] >= 128)

Если вы напечатаете значение пикселя, вы заметите, что значение не от 0 до 255. Ваше изображение, вероятно, RGB, поэтому значение пикселя находится в другом диапазоне. Скажем красный, будет -65536 как целое число со знаком или 0xFFFF0000 в шестнадцатеричном виде (уведомление ARGB)). Ваше пороговое значение не должно быть 128, но -8355712 (FF808080).

Вот переработанная версия функции:

void threshold(PImage img,int value) {
  for(int i = 0 ; i < img.pixels.length; i++){
    if(img.pixels[i] >= color(value)){
      img.pixels[i] = color(255);
    }else{
      img.pixels[i] = color(0);
    }
  }
  img.updatePixels();
}

Вот измененная версия образца эскиза из Обработка> Примеры> Изображение> LoadDisplayImage:

/**
 * Load and Display 
 * 
 * Images can be loaded and displayed to the screen at their actual size
 * or any other size. 
 */

PImage img;  // Declare variable "a" of type PImage

void setup() {
  size(640, 360);
  // The image file must be in the data folder of the current sketch 
  // to load successfully
  img = loadImage("moonwalk.jpg");  // Load the image into the program

}

void draw() {
  // Displays the image at its actual size at point (0,0)
  image(img, 0, 0);
  //copy the original image and threshold it based on mouse x coordinates
  PImage thresh = img.get();
  threshold(thresh,(int)map(mouseX,0,width,0,255));

  // Displays the image at point (0, height/2) at half of its size
  image(thresh, 0, height/2, thresh.width/2, thresh.height/2);
}
void threshold(PImage img,int value) {
  for(int i = 0 ; i < img.pixels.length; i++){
    if(img.pixels[i] >= color(value)){
      img.pixels[i] = color(255);
    }else{
      img.pixels[i] = color(0);
    }
  }
  img.updatePixels();
}
Другие вопросы по тегам