3

我正在研究一种 Java 方法来进行一些简单的边缘检测。我想获取两种颜色强度的差异,一种在一个像素上,另一种在其正下方的像素上。无论我为该方法设置什么阈值,我正在使用的图片都是黑色的。我不确定我当前的方法是否只是没有计算我需要的东西,但我不知道我应该追踪什么来找到问题。

到目前为止,这是我的方法:

public void edgeDetection(double threshold)
{

  Color white = new Color(1,1,1);
  Color black = new Color(0,0,0);

  Pixel topPixel = null;
  Pixel lowerPixel = null;

  double topIntensity;
  double lowerIntensity;

  for(int y = 0; y < this.getHeight()-1; y++){
    for(int x = 0; x < this.getWidth(); x++){

      topPixel = this.getPixel(x,y);
      lowerPixel = this.getPixel(x,y+1);

      topIntensity =  (topPixel.getRed() + topPixel.getGreen() + topPixel.getBlue()) / 3;
      lowerIntensity =  (lowerPixel.getRed() + lowerPixel.getGreen() + lowerPixel.getBlue()) / 3;

      if(Math.abs(topIntensity - lowerIntensity) < threshold)
        topPixel.setColor(white);
      else
        topPixel.setColor(black);
    }
  }
}
4

2 回答 2

5

new Color(1,1,1)调用它的Color(int,int,int)构造函数,Color其取值介于 0 和 255 之间。所以你Color white仍然基本上是黑色的(嗯,很深的灰色,但不足以引起注意)。

如果要使用Color(float,float,float)构造函数,则需要浮点文字:

Color white = new Color(1.0f,1.0f,1.0f);
于 2013-02-08T04:10:48.213 回答
0
public void edgeDetection(int edgeDist)
  {
Pixel leftPixel = null;
Pixel rightPixel = null;
Pixel bottomPixel=null;
Pixel[][] pixels = this.getPixels2D();
Color rightColor = null;
boolean black;
for (int row = 0; row < pixels.length; row++)
{
  for (int col = 0; 
       col < pixels[0].length; col++)
  {
    black=false;
    leftPixel = pixels[row][col];
    if (col<pixels[0].length-1)
    {
      rightPixel = pixels[row][col+1];
      rightColor = rightPixel.getColor();
      if (leftPixel.colorDistance(rightColor) > 
          edgeDist)
        black=true;
    }
    if (row<pixels.length-1)
    {
      bottomPixel =pixels[row+1][col];
      if (leftPixel.colorDistance(bottomPixel.getColor())>edgeDist)
        black=true;

    }
    if (black)
      leftPixel.setColor(Color.BLACK);
    else
      leftPixel.setColor(Color.WHITE);
  }
}

}

于 2015-05-12T03:13:34.597 回答