在matlab中有一个2D卷积选项,您可以使用它,这样您就可以在每个区域进行卷积。例如,如果您已完成3x3卷积,则可以说保存每个3x3窗口的结果并使用它。命令是这样的:
<input type="number" name="quantity" min="1" max="5">
'same'关键字将返回与A相同大小的卷积的中心部分。 我想要知道,无论如何,我可以用android中的renderscript做这样的事情吗?我将从matlab文档中提取一张图片,以便您可以更好地理解我的意思。再次,图片是来自matlab文档,这是免费的。
答案 0 :(得分:3)
您可以使用Script.LaunchOptions
类。
使用此类可以设置内核的执行限制。
示例:您希望在数据的“矩形”上运行内核(因此,在2维中),从 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);
修改:我为此案例专门创建了example,您可以在其中看到以下过程:
参考:RenderScript: parallel computing on Android, the easy way