图片处理(Picture Lab)活动9:简单边缘检测

陈 欣发布

边缘检测是一个常见的图像处理问题。例如,数码相机通常都有人脸识别功能。一些机器人竞赛也需要机器人通过数字摄像头来识别球体,以算法的方式“看见”球。

在图片中查找边缘的一种方式是比较当前像素与右侧列像素的颜色值。如果颜色的差异超过了指定的量,这表明检测到边缘并将颜色设为黑色,否则则说明当前像素不是边缘,颜色应设为白色。如何计算两种颜色之间的差别呢?我们都知道解析几何里平面两点\((x_1, y_1)\)和\((x_2, y_2)\)间的距离是\(\sqrt{(x_2-x_1)^2+(y_2-y_1)^2}\)。以此类推,两种颜色\((red_1, green_1, blue_1)\)和\((red_2, green_2, blue_2)\)间的差别是\(\sqrt{(red_2-red_1)^2+(green_2-green_1)^2+(blue_2-blue_1)^2}\)。class Pixel中的colorDistance method使用这种方法来计算当前像素颜色和参数颜色间的差别。

以下method实现了这个简单的算法。注意嵌套的for循环在到结束列之前就停止了,这是因为当前像素需要和下一列的像素比较。如果循环继续到最后一列会造成数组越界错误。

public void edgeDetection(int edgeDist)
{
  Pixel leftPixel = null;
  Pixel rightPixel = null;
  Pixel topPixel = null;
  Pixel bottomPixel = null;
  
  Pixel[][] pixels = this.getPixels2D();
  for (int row = 0; row < pixels.length - 1; row++)
  {
    for (int col = 0; 
         col < pixels[0].length-1; col++)
    {
      leftPixel = pixels[row][col];
      rightPixel = pixels[row][col+1];
      topPixel = pixels[row][col];
      bottomPixel = pixels[row + 1][col];
      if (leftPixel.colorDistance(rightPixel.getColor()) > edgeDist ||
          topPixel.colorDistance(bottomPixel.getColor()) > edgeDist)
        leftPixel.setColor(Color.BLACK);
      else
        leftPixel.setColor(Color.WHITE);
    }
  }
}

可以用PictureTester中的testEdgeDetection method来测试它。

练习

  1. 可以注意到当前的边缘检测算法仅在从左到右有较大颜色变化时能够很好的工作,从上到下的颜色变化则没有考虑在内。添加另一个循环,将当前像素与下侧行像素比较,并根据颜色差别来确认边缘并设置黑白色。
  2. 分小组讨论编写一个新的边缘检测算法。

陈 欣

AADPS创始人

0 条评论

发表回复