- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
//编辑...
我正在稍微编辑我的问题,以解决专门处理非二次幂图像的问题。我有一个基本结构,适用于大小为 256x256 或 1024x1024 的方形灰度图像,但看不到如何推广到任意大小的图像。 fft 函数似乎希望您包括宽度和高度的 log2,但不清楚如何解压缩结果数据,或者数据是否只是被扰乱。我想最明显的做法是将 npot 图像置于更大的全黑图像的中心,然后在查看数据时忽略这些位置的任何值。但想知道是否有更简单的方法来处理 npot 数据。
//...结束编辑
我在使用 Accelerate Framework 文档时遇到了一些问题。我通常会使用 FFTW3,但我无法在实际的 IOS 设备上进行编译(参见 question)。谁能给我指出一个使用 Accelerate 的 super 简单的实现,它执行如下操作:
1) 将图像数据转换为可传递给 Accelerate 的 FFT 方法的适当数据结构。
在 FFTW3 中,在最简单的情况下,使用灰度图像,这涉及将无符号字节放入“fftw_complex”数组中,该数组只是两个 float 的结构,一个保存实值,另一个保存虚数(虚数在哪里)每个像素初始化为零)。
2) 获取此数据结构并对其执行 FFT。
3) 打印出幅度和相位。
4) 对其执行 IFFT。
5) 根据 IFFT 产生的数据重新创建原始图像。
尽管这是一个非常基本的示例,但我在使用 Apple 网站上的文档时遇到了问题。所以 answer by Pi here非常有帮助,但我仍然对如何使用 Accelerate 使用灰度(或彩色)2D 图像执行此基本功能感到困惑。
无论如何,任何指针或特别是一些处理 2D 图像的简单工作代码都会非常有帮助!
\\\编辑\\\
好的,在花一些时间深入研究 SO 以及 pkmital's github repo 上的文档和一些非常有用的代码之后,我有一些我认为我会发布的工作代码,因为 1) 我花了一段时间才弄明白,2) 因为我还有几个问题...
初始化 FFT“计划”。假设一个二次方的图像:
#include <Accelerate/Accelerate.h>
...
UInt32 N = log2(length*length);
UInt32 log2nr = N / 2;
UInt32 log2nc = N / 2;
UInt32 numElements = 1 << ( log2nr + log2nc );
float SCALE = 1.0/numElements;
SInt32 rowStride = 1;
SInt32 columnStride = 0;
FFTSetup setup = create_fftsetup(MAX(log2nr, log2nc), FFT_RADIX2);
为二次方灰度图像传入一个字节数组,并将其转换为 COMPLEX_SPLIT:
COMPLEX_SPLIT in_fft;
in_fft.realp = ( float* ) malloc ( numElements * sizeof ( float ) );
in_fft.imagp = ( float* ) malloc ( numElements * sizeof ( float ) );
for ( UInt32 i = 0; i < numElements; i++ ) {
if (i < t->width * t->height) {
in_fft.realp[i] = t->data[i] / 255.0;
in_fft.imagp[i] = 0.0;
}
}
对转换后的图像数据运行 FFT,然后获取幅度和相位:
COMPLEX_SPLIT out_fft;
out_fft.realp = ( float* ) malloc ( numElements * sizeof ( float ) );
out_fft.imagp = ( float* ) malloc ( numElements * sizeof ( float ) );
fft2d_zop ( setup, &in_fft, rowStride, columnStride, &out_fft, rowStride, columnStride, log2nc, log2nr, FFT_FORWARD );
magnitude = (float *) malloc(numElements * sizeof(float));
phase = (float *) malloc(numElements * sizeof(float));
for (int i = 0; i < numElements; i++) {
magnitude[i] = sqrt(out_fft.realp[i] * out_fft.realp[i] + out_fft.imagp[i] * out_fft.imagp[i]) ;
phase[i] = atan2(out_fft.imagp[i],out_fft.realp[i]);
}
现在您可以对 out_fft 数据运行 IFFT 以获得原始图像...
COMPLEX_SPLIT out_ifft;
out_ifft.realp = ( float* ) malloc ( numElements * sizeof ( float ) );
out_ifft.imagp = ( float* ) malloc ( numElements * sizeof ( float ) );
fft2d_zop (setup, &out_fft, rowStride, columnStride, &out_ifft, rowStride, columnStride, log2nc, log2nr, FFT_INVERSE);
vsmul( out_ifft.realp, 1, SCALE, out_ifft.realp, 1, numElements );
vsmul( out_ifft.imagp, 1, SCALE, out_ifft.imagp, 1, numElements );
或者您可以对幅度运行 IFFT 以获得自相关...
COMPLEX_SPLIT in_ifft;
in_ifft.realp = ( float* ) malloc ( numElements * sizeof ( float ) );
in_ifft.imagp = ( float* ) malloc ( numElements * sizeof ( float ) );
for (int i = 0; i < numElements; i++) {
in_ifft.realp[i] = (magnitude[i]);
in_ifft.imagp[i] = 0.0;
}
fft2d_zop ( setup, &in_fft, rowStride, columnStride, &out_ifft, rowStride, columnStride, log2nc, log2nr, FFT_INVERSE );
vsmul( out_ifft.realp, 1, SCALE, out_ifft.realp, 1, numElements );
vsmul( out_ifft.imagp, 1, SCALE, out_ifft.imagp, 1, numElements );
最后,您可以将 ifft 结果放回图像数组中:
for ( UInt32 i = 0; i < numElements; i++ ) {
t->data[i] = (int) (out_ifft.realp[i] * 255.0);
}
我还没有想出如何使用 Accelerate 框架来处理非二次方图像。如果我在设置中分配了足够的内存,那么我可以进行 FFT,然后进行 IFFT 以获得原始图像。但是,如果尝试进行自相关(使用 FFT 的幅度),那么我的图像会得到不稳定的结果。我不确定适当填充图像的最佳方法,所以希望有人知道如何做到这一点。 (或分享 vDSP_conv 方法的工作版本!)
最佳答案
我想说的是,为了对任意大小的图像执行操作,您所要做的就是将输入值数组的大小适本地调整为 2 的下一次幂。
困难的部分是将原始图像数据放在哪里以及填充什么。您真正想对图像做什么或从图像中挖掘数据是至关重要的。
在下面链接的 PDF 中,请特别注意 12.4.2 上面的段落 http://www.mathcs.org/java/programs/FFT/FFTInfo/c12-4.pdf
虽然上面谈到了沿 2 个轴的操作,但我们可以在第二维度之前执行类似的想法,然后进入第二维度。如果我是正确的,那么这个例子可以应用(这绝不是一个精确的算法):
假设我们有一张 900 x 900 的图像:首先,我们可以将图像拆分为 512、256、128 和 4 的垂直 strip 。然后我们将为每一行处理 4 个 1D FFT,一个用于前 512 个像素,下一个用于接下来的 256 个像素,下一个用于接下来的 128 个,然后最后一个用于剩余的 4 个。由于 FFT 的输出本质上是流行的的频率,然后可以简单地添加这些(仅从频率的角度来看,而不是角度偏移)。然后我们可以将同样的技术推向二维。在这一点上,我们会考虑到每个输入像素,而无需实际填充。
这真的只是深思熟虑,我自己没有尝试过,确实应该自己研究一下。如果你现在真的在做这种工作,那么此时你可能有比我更多的时间。
关于ios - 使用 IOS Accelerate Framework 对非二次幂图像进行二维信号处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10708667/
我正在尝试学习 Knockout 并尝试创建一个照片 uploader 。我已成功将一些图像存储在数组中。现在我想回帖。在我的 knockout 码(Javascript)中,我这样做: 我在 Jav
我正在使用 php 编写脚本。我的典型问题是如何在 mysql 中添加一个有很多替代文本和图像的问题。想象一下有机化学中具有苯结构的描述。 最有效的方法是什么?据我所知,如果我有一个图像,我可以在数据
我在两个图像之间有一个按钮,我想将按钮居中到图像高度。有人可以帮帮我吗? Entrar
下面的代码示例可以在这里查看 - http://dev.touch-akl.com/celebtrations/ 我一直在尝试做的是在 Canvas 上绘制 2 个图像(发光,然后耀斑。这些图像的链接
请检查此https://jsfiddle.net/rhbwpn19/4/ 图像预览对于第一篇帖子工作正常,但对于其他帖子则不然。 我应该在这里改变什么? function readURL(input)
我对 Canvas 有疑问。我可以用单个图像绘制 Canvas ,但我不能用单独的图像绘制每个 Canvas 。- 如果数据只有一个图像,它工作正常,但数据有多个图像,它不工作你能帮帮我吗? va
我的问题很简单。如何获取 UIImage 的扩展类型?我只能将图像作为 UIImage 而不是它的名称。图像可以是静态的,也可以从手机图库甚至文件路径中获取。如果有人可以为此提供一点帮助,将不胜感激。
我有一个包含 67 个独立路径的 SVG 图像。 是否有任何库/教程可以为每个路径创建单独的光栅图像(例如 PNG),并可能根据路径 ID 命名它们? 最佳答案 谢谢大家。我最终使用了两个答案的组合。
我想将鼠标悬停在一张图片(音乐专辑)上,然后播放一张唱片,所以我希望它向右移动并旋转一点,当它悬停时我希望它恢复正常动画片。它已经可以向右移动,但我无法让它随之旋转。我喜欢让它尽可能简单,因为我不是编
Retina iOS 设备不显示@2X 图像,它显示 1X 图像。 我正在使用 Xcode 4.2.1 Build 4D502,该应用程序的目标是 iOS 5。 我创建了一个测试应用(主/细节)并添加
我正在尝试从头开始以 Angular 实现图像 slider ,并尝试复制 w3school基于图像 slider 。 下面我尝试用 Angular 实现,谁能指导我如何使用 Angular 实现?
我正在尝试获取图像的图像数据,其中 w= 图像宽度,h = 图像高度 for (int i = x; i imageData[pos]>0) //Taking data (here is the pr
我的网页最初通过在 javascript 中动态创建图像填充了大约 1000 个缩略图。由于权限问题,我迁移到 suPHP。现在不用标准 标签本身 我正在通过这个 php 脚本进行检索 $file
我正在尝试将 python opencv 图像转换为 QPixmap。 我按照指示显示Page Link我的代码附在下面 img = cv2.imread('test.png')[:,:,::1]/2
我试图在这个 Repository 中找出语义分割数据集的 NYU-v2 . 我很难理解图像标签是如何存储的。 例如,给定以下图像: 对应的标签图片为: 现在,如果我在 OpenCV 中打开标签图像,
import java.util.Random; class svg{ public static void main(String[] args){ String f="\"
我有一张 8x8 的图片。 (位图 - 可以更改) 我想做的是能够绘制一个形状,给定一个 Path 和 Paint 对象到我的 SurfaceView 上。 目前我所能做的就是用纯色填充形状。我怎样才
要在页面上显示图像,你需要使用源属性(src)。src 指 source 。源属性的值是图像的 URL 地址。 定义图像的语法是: 在浏览器无法载入图像时,替换文本属性告诉读者她们失去的信息。此
**MMEditing是基于PyTorch的图像&视频编辑开源工具箱,支持图像和视频超分辨率(super-resolution)、图像修复(inpainting)、图像抠图(matting)、
我正在尝试通过资源文件将图像插入到我的程序中,如下所示: green.png other files 当我尝试使用 QImage 或 QPixm
我是一名优秀的程序员,十分优秀!