阈值方法将每个像素变黑

Threshold method is turning every pixel black

我正在尝试在处理中实现我自己的阈值方法,但是当我尝试 运行 图像上的方法时,我得到了一个全黑的图像。有帮助吗?

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. 不要硬编码图像尺寸 (300,300),使用 img 的 .width.height 属性:重复使用您的代码会更容易
  2. 如果您循环遍历每个像素,则无需使用嵌套循环和 imgP 函数从 x,y 位置计算像素索引。只需通过 img.pixels 循环一次(从 0 到 img.pixels.length

在阈值条件失败方面,catch是条件,主要是比较值: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();
}

这是来自 Processing > Examples > Image > 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();
}

我怀疑这是学习 reading/writing/processing 图像的练习。 PImage 有一个 filter() 方法,你可以用它来设定阈值:

img.filter(THRESHOLD, yourThresholdAmountHere);