Android中的Sobel边缘检测
edge-detection
image-processing
5
0

作为我为Android开发的应用程序的一部分,我想向用户展示他们拍摄的图像的边缘检测版本(类似于下面的示例)。

替代文字

为了实现这一点,我一直在研究Sobel运算符以及如何在Java中实现它。但是,我发现的许多示例都使用了AWT中提供的对象和方法( 例如本示例 ),而这些对象和方法不是Android的一部分。

我的问题是,Android是否提供了以上示例中使用的AWT功能的替代方案?如果仅使用Android内置的库重写该示例,我们将如何处理?

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

问题和答案已有3年历史了……@reflog的解决方案可用于诸如边缘检测之类的简单任务,但是速度很慢。

我在iOS上使用GPUImage进行边缘检测任务。 Android上有一个等效的库: https : //github.com/CyberAgent/android-gpuimage/tree/master

它是硬件加速的,因此应该很快。这是sobel边缘检测过滤器: https : //github.com/CyberAgent/android-gpuimage/blob/master/library/src/jp/co/cyberagent/android/gpuimage/GPUImageSobelEdgeDetection.java

根据文档,您可以简单地执行以下操作:

Uri imageUri = ...;
mGPUImage = new GPUImage(this);
mGPUImage.setGLSurfaceView((GLSurfaceView) findViewById(R.id.surfaceView));
mGPUImage.setImage(imageUri); // this loads image on the current thread, should be run in a thread
mGPUImage.setFilter(new GPUImageSobelEdgeDetection());

// Later when image should be saved saved:
mGPUImage.saveToPictures("GPUImage", "ImageWithFilter.jpg", null);

另一个选择是使用RenderScript,您可以并行访问每个像素并使用它进行任何操作。我还没有看到任何用它构建的图像处理库。

收藏
评论

由于您在Android中没有BufferedImage,因此您可以自己执行所有基本操作:

Bitmap b = ...
width = b.getWidth();
height = b.getHeight();
stride = b.getRowBytes();
for(int x=0;x<b.getWidth();x++)
  for(int y=0;y<b.getHeight();y++)
    {
       int pixel = b.getPixel(x, y);
       // you have the source pixel, now transform it and write to destination 
    }

如您所见,这几乎涵盖了移植该AWT示例所需的所有内容。 (只需更改“ convolvePixel”功能)

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号