Android中的Sobel边缘检测

Android中的Sobel边缘检测,android,image-processing,edge-detection,Android,Image Processing,Edge Detection,作为我为Android开发的应用程序的一部分,我想向用户展示他们拍摄的图像的边缘检测版本(类似于下面的示例) 为了实现这一点,我一直在研究Sobel操作符以及如何在Java中实现它。然而,我发现的许多示例都使用了AWT()中的对象和方法,而AWT()不是Android的一部分 我的问题是,安卓是否提供了上述示例中使用的AWT功能的替代品?如果我们仅仅使用Android内置的库重写该示例,我们将如何进行呢?由于Android中没有BuffereImage,您可以自己完成所有基本操作: Bitma

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

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


我的问题是,安卓是否提供了上述示例中使用的AWT功能的替代品?如果我们仅仅使用Android内置的库重写该示例,我们将如何进行呢?

由于Android中没有BuffereImage,您可以自己完成所有基本操作:

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 
    }
位图b=。。。 宽度=b.getWidth(); 高度=b.getHeight(); stride=b.getRowBytes();
对于(intx=0;x请在此处检查java实现:

它不依赖于Swing/AWT或任何其他库。它直接对图像像素进行操作,速度很快

可以在此处看到结果(向下滚动):


问题和答案已经有3年历史了…@reflog的解决方案适用于像边缘检测这样的简单任务,但速度很慢

我在iOS上使用GPUImage执行边缘检测任务。Android上有一个等效的库:

它是硬件加速的,所以应该非常快。这是sobel边缘检测过滤器:

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

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,您可以并行访问每个像素并对其执行任何操作。我还没有看到任何使用该工具构建的图像处理库。

另一个选项是使用OpenCV,它在Android上有很好的实现

Imgproc.Sobel()。

Mat src=Highgui.imread(getClass().getResource(
“/SomeGrayScaleImage.jpg”).getPath();

然后在其上运行sobel边缘检测器,将结果保存在新的垫子中。如果您希望保持相同的图像深度,则此操作将完成。。。

Mat-dst;
int-ddepth=-1;//目标深度。-1维护源的现有深度
int dx=1;
int-dy=1;
Imgproc.Sobel(src、dst、ddepth、dx、dy);

以下是一些参考文件:

对于Android Studio中的gradle构建,您可以从不同的地方引入为Java构建的opencv库,但我也主持了一个最新的构建。在build.gradle文件中,您可以像这样添加依赖项……否则,这有点棘手。

依赖关系{
编译'com.iparse.android:opencv:2.4.8'
}

如果您使用的是Eclipse,您可以查看Opencv网站,了解在Android上使用Opencv的详细信息:

您链接到的源代码实际上与AWT无关:-/BuffereImage不是AWT中的一个类吗?这很好,但是Bitmap.getPixel()和Bitmap.setPixel()当我逐像素进行操作时,似乎速度非常慢。我认为最好在开始时使用Bitmap.getPixels()将位图的值作为整数复制到int[]。如何在RGB int值数组而不是位图上执行卷积?您是正确的,获取整个数组更快。要在数组上执行卷积,您只需使用相同类型的for循环进行迭代,并通过使用分离的R、G和B通道或使用
Color.rg从RGB数组合成像素来获取像素值b(r1、g1、b1)
功能。