当前位置: 首页 > 知识库问答 >
问题:

使用图像可视化处理:像素颜色阈值

子车征
2023-03-14

图像被操纵,希望用计数器识别每张图片上的每个白点

PImage blk; 
void setup() {
  size(640, 480);   
  blk=loadImage("img.png");
}  

void draw () {
  loadPixels();
  blk.loadPixels();
  int i = 0;
  for (int x = 0; x < width; x++) {
    for (int y = 0; y < height; y++) {
      int loc = x+y*width; 
      pixels [loc] = blk.pixels[loc];
      if (blk.pixels[loc] == 0) {
        if (blk.pixels [loc]+1 != 0) {
          i++;
        }
      }

      float r = red(blk.pixels[loc]);
      float g = green(blk.pixels[loc]);
      float b = blue(blk.pixels[loc]); 

      pixels [loc] = color(r, g, b);
    }
  }
  System.out.println (i);
  updatePixels();
}

主要问题在我的if语句中,不确定是否合乎逻辑。

共有1个答案

施振海
2023-03-14

我不确定这到底是怎么回事,但我可以帮你找到白色像素。在这里,我刚刚数了7457个“白色”像素(然后我把它们变成红色,这样你就可以看到它们在哪里,如果你想得到更多或更少的像素,可以调整阈值):

当然,这只是一个概念证明,你应该能够适应你的需求。

PImage blk; 
void setup() {
  size(640, 480);   
  blk=loadImage("img.png");
  blk.loadPixels();

  int whitePixelsCount = 0;

  // I'm doing this in the 'setup()' method because I don't need to do it 60 times per second
  // Once it's done once I can just use the image as modified unless you want several
  // different versions (which you can calculate once anyway then store in different PImages)
  for (int i = 0; i < blk.width * blk.height; i++) {
    float r = red(blk.pixels[i]);
    float g = green(blk.pixels[i]);
    float b = blue(blk.pixels[i]);

    // In RGB, the brightness of each color is represented by it's intensity
    // So here I'm checking the "average intensity" of the color to see how bright it is
    // And I compare it to 100 since 255 is the max and I wanted this simple, but you can 
    // play with this threshold as much as you like
    if ((r+g+b)/3 > 100) {
      whitePixelsCount++;
      // Here I'm making those pixels red so you can see where they are.
      // It's easier to adjust the threshold if you can see what you're doing
      blk.pixels[i] = color(255, 0, 0);
    }
  }

  println(whitePixelsCount);
  updatePixels();
}  

void draw () {
  image(blk, 0, 0);
}

简而言之(你也会在评论中读到这一点),我们根据我们可以调整的阈值计算像素。为了让你更明显,我把“白色”像素涂成红色。你可以根据你看到的这种方式降低或提高阈值,一旦你知道你想要什么,你就可以摆脱颜色。

这里有一个困难,那就是图像不是“黑白的”,而是更灰度的——这是完全正常的,但对于你似乎要做的事情来说,这让事情变得更难。你可能需要做很多修改才能得到你感兴趣的确切比例。如果你在GiMP或其他可以调整对比度和亮度的图像软件中编辑原始图像,可能会有很大帮助。这有点作弊,但它不会马上奏效。这种策略可以帮你省下一些工作。

玩得高兴

 类似资料:
  • 主要内容:颜色命名,getrgb()方法,getcolor()Pillow 提供了颜色处理模块 ImageColor,该模块支持不同格式的颜色,比如 RGB 格式的颜色三元组、十六进制的颜色名称(#ff0000)以及颜色英文单词("red")。同时,它还可以将 CSS(层叠样式表,用来修饰网页)风格的颜色转换为 RGB 格式。 注意,在 ImageColor 模块对颜色的大小并不敏感,比如 "Red" 也可以写为 " red"。 颜色命名 ImageColo

  • 现在,我们知道如何访问图像数据,包括图像或视频的每一个像素的RGBA,下一步我们探索一下处理像素的可能性。本节,通过反转每个像素的颜色,来实现图像的反色处理。 图3-7 图像反色 警告:由于getImageData()方法的安全限制,本节的例子必须在Web服务器上运行。 绘制步骤 按照以下步骤,实现图像的反色处理: 1. 定义画布上下文: window.onload = function(){

  • 我试图从眼动跟踪结果创建一个热图(显示用户在屏幕上最频繁查看的位置)。 对于用户经常查看的像素,我想设置不透明的红色,对于不太频繁的橙色,等等...我使用红色到绿色的色阶。但是对于频率最低的像素,我希望它们不仅显示绿色,而且是透明的。 问题是,当我尝试改变颜色时,例如使用它实际上并没有根据新旧颜色将像素作为平均值着色,它只是显示一些新的、看起来奇怪的颜色。 图像与alpha RGBA值设置为50:

  • 嘿,我正在尝试做一个程序,它加载一个彩色图像作为灰度画布,然后返回颜色点击像素。当setrgb()方法没有做它应该做的事情时,我就被困在这里了。我已经通过getRGB()从原始图像中复制了颜色,并使用setRGB()将其分配给新图像。我试图输出两个像素颜色值,但他们不一样。请帮我解决这个问题。以下是到目前为止的代码:

  • 我正在研究图像加密和解密算法。我想使图像像素失真。我想要得到每一个像素值,然后按我想要的方式排序这些像素值,这样图像的像素被扭曲,图像被改变。我是在朝仪式的方向走吗?有什么提示吗?或者可以帮助我的示例算法。 我有一个像素的图像。表示图像由像素组成。如果我选择图像的第一个像素行,它是像素,我将这些像素转换为二进制,然后转换为十进制。现在我得到10个像素的十进制值。我按我想要的方式对这些值进行排序。现

  • 什么是快速可靠的方法来阈值图像可能模糊和不均匀的亮度? 示例(模糊但亮度一致): 因为不能保证图像具有均匀的亮度,所以使用固定阈值是不可行的。自适应阈值工作正常,但由于模糊,它会在特征中造成中断和扭曲(这里,重要的特征是数独数字): 我也尝试过使用直方图均衡化(使用OpenCV的均衡器函数)。它在不减少亮度差异的情况下增加对比度。 我找到的最佳解决方案是将图像按其形态闭合(归功于这篇文章)进行分割