在位图的特定位置使用Renderscript卷积

问题描述 投票:0回答:1

在 MATLAB 中,有一个用于进行 2D 卷积的选项,您可以使用它来获得发生卷积的每个区域。例如,如果您完成了 3x3 卷积,您可以说保存每个 3x3 窗口的结果并使用它。命令是这样的:

X = conv2(A,B,'same');

“same”关键字将返回与 A 大小相同的卷积的中心部分。

我想知道我是否可以在 Android 中使用 renderscript 做这样的事情?我将放一张 MATLAB 文档中的图片,以便您可以更好地理解我的意思。同样,图片是来自 MATLAB 文档,它是免费的。

The same keyword for a 2D convolution of matlab

android matlab bitmap renderscript
1个回答
4
投票

您可以使用

Script.LaunchOptions
类。

使用此类,您可以设置内核的执行限制。

示例:您想要在数据的“矩形”(即二维)上运行内核,从 x-索引(从 0 开始,包含)

3
开始,到 x- 结束索引(不包括)
8
,并且在 y 一侧,限制为
11
22

Script.LaunchOptions launchOptions;
launchOptions = new Script.LaunchOptions();
launchOptions.setX(3, 8);
launchOptions.setY(11, 22);

// Kernel run
myScript.forEach_myKernelName(inAlloc, outAlloc, launchOptions);

示例:您想要在图像上应用内核,并具有 3 像素宽的边框(示例直接取自 FASTExample 示例项目):

Script.LaunchOptions fastLaunchOptions;
fastLaunchOptions = new Script.LaunchOptions();
fastLaunchOptions.setX(3, inputImageSize.width - 3);
fastLaunchOptions.setY(3, inputImageSize.height - 3);

// ...

scriptCFast.forEach_fastOptimized(
      grayAllocation, fastKpAllocation, fastLaunchOptions);

示例:您想要在受限范围内应用

ScriptIntrinsicConvolve3x3
内核:

// Define the convolution
ScriptIntrinsicConvolve3x3 convolve3x3 =
    ScriptIntrinsicConvolve3x3.create(mRS, Element.RGBA_8888(mRS));

// Some coefficients
float[] coefficients = {
        0.7f, 0, 0.5f,
        0, 1.0f, 0,
        0.5f, 0, 1.0f
};
convolve3x3.setCoefficients(coefficients);

// Execute the allocation with limits
Script.LaunchOptions launchOptions;
launchOptions = new Script.LaunchOptions();
launchOptions.setX(3, 8);
launchOptions.setY(11, 22);

convolve3x3.setInput(inputAllocation);
convolve3x3.forEach(convolvedAllocation, launchOptions);

注意:这个进程只是在一定范围内执行内核,但它不会创建一个新的、更小的分配。因此,在执行内核超过一定限制后,您应该使用复制内核来复制其结果,如下所示:

// Store the input allocation
rs_allocation inputAllocation;

// Offset indices, which define the start point for 
// the copy in the input allocation.
int inputOffsetX;
int inputOffsetY;

uchar4 __attribute__((kernel)) copyAllocation(int x, int y) {

    return rsGetElementAt_uchar4(
         inputAllocation, x + inputOffsetX, y + inputOffsetY);

}

调用方式:

scriptC_main.set_inputAllocation(convolvedAllocation);
scriptC_main.set_inputOffsetX(offsetX);
scriptC_main.set_inputOffsetY(offsetY);
scriptC_main.forEach_copyAllocation(outputAllocation);

编辑:我专门为此案例创建了一个示例,您可以在其中看到以下过程:

  • 在数据集上执行有限卷积。
  • 将卷积输出复制到新的分配。

参考:RenderScript:Android 上的并行计算,最简单的方法

© www.soinside.com 2019 - 2024. All rights reserved.