在位图的特定位置使用 Renderscript 卷积
Using Renderscript convolution on a specific location of bitmap
在 matlab 中有一个用于进行 2D 卷积的选项,您可以使用它来获得发生卷积的每个区域。例如,如果你做了一个 3x3 卷积,你可以说保存每个 3x3 window 的结果并使用它。命令是这样的:
X = conv2(A,B,'same');
'same' 关键字将 return 与 A 大小相同的卷积的中心部分。
我想知道我是否可以在 android 中用 renderscript 做这样的事情?我将从 matlab 文档中放一张图片,这样您就可以更好地理解我的意思。图片再次来自 来自 matlab 文档,它是免费的。
您可以使用 Script.LaunchOptions
class.
使用这个class你可以设置内核的执行限制。
示例:您想要 运行 数据 "rectangle" 上的内核(因此,在二维中),从 x-index(从 0 开始,包括)3
并以 x-index(不包括)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);
编辑:我专门为这个case创建了一个example,里面可以看到如下过程:
- 在数据集上执行有限卷积。
- 将卷积输出复制到新分配。
参考:RenderScript: parallel computing on Android, the easy way
在 matlab 中有一个用于进行 2D 卷积的选项,您可以使用它来获得发生卷积的每个区域。例如,如果你做了一个 3x3 卷积,你可以说保存每个 3x3 window 的结果并使用它。命令是这样的:
X = conv2(A,B,'same');
'same' 关键字将 return 与 A 大小相同的卷积的中心部分。 我想知道我是否可以在 android 中用 renderscript 做这样的事情?我将从 matlab 文档中放一张图片,这样您就可以更好地理解我的意思。图片再次来自 来自 matlab 文档,它是免费的。
您可以使用 Script.LaunchOptions
class.
使用这个class你可以设置内核的执行限制。
示例:您想要 运行 数据 "rectangle" 上的内核(因此,在二维中),从 x-index(从 0 开始,包括)3
并以 x-index(不包括)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);
编辑:我专门为这个case创建了一个example,里面可以看到如下过程:
- 在数据集上执行有限卷积。
- 将卷积输出复制到新分配。
参考:RenderScript: parallel computing on Android, the easy way