阈值方法将每个像素变为黑色

时间:2017-03-18 09:38:05

标签: image processing pixel threshold

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

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 个答案:

答案 0 :(得分:0)

有几点需要改进:

  1. 不要对图片尺寸进行硬编码(300,300),使用img的.width.height属性:重新使用代码会更容易
  2. 如果您循环遍历每个像素,则无需使用嵌套循环和imgP函数来计算x,y位置的像素索引。只需循环一遍img.pixels(从0到img.pixels.length
  3. 就阈值条件失败而言,捕获是条件,主要是比较值:if (img.pixels[imgP(i, j)] >= 128)

    如果打印像素的值,您会注意到该值不是0到255。 您的图像可能是RGB,因此像素值在不同的范围内。 假设为红色,将-65536作为有符号整数或0xFFFF0000十六进制(通知ARGB))。您的阈值不应为128,而应为-8355712FF808080)。

    这是函数的重构版本:

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

    以下是处理&gt;示例草图的修改版本例子&gt;图像&gt; 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();
    }