- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个 8 位图像。对于每个像素,我需要计算出它在当前行中的顺序位置。例如,如果该行是:
32 128 16 64,
然后我需要结果:
1 3 0 2,
由于 32 是该行中的第 1 个最高值,因此 128 是第 3 个最高值,16 个是第 0 个最高值,64 个是第 2 个最高值。
我需要对图像的所有行重复上述过程。这是非矢量化代码:
for (int curr = 0; curr < new_height; ++curr)
{
vector<pair<unsigned char, char> > ordered;
for (char i = 0; i < 4; ++i)
{
unsigned char val = luma24.at<unsigned char>(curr, i);
ordered.push_back(pair<unsigned char, char>(val, i));
}
sort(ordered.begin(), ordered.end(), cmpfun);
for (int i = 0; i < 4; ++i)
signature.at<char>(curr, ordered[i].second) = i;
}
luma24
是我正在读取的 8 位图像,它有 new_height
行和 4 列。 signature
是一个相同大小的签名图像(现在忽略符号的差异,因为它不相关)——这是我存储结果的地方。 cmpfun
是一个简单的比较函数。
我尝试对上面的代码进行矢量化并得到了这个:
Mat ordinal;
luma24.convertTo(ordinal, CV_16UC1, 256, 0);
Mat sorted = ordinal.clone();
for (int i = 0; i < 4; ++i)
ordinal(Range::all(), Range(i, i+1)) += i;
cv::sort(ordinal, sorted, CV_SORT_EVERY_ROW | CV_SORT_ASCENDING);
bitwise_and(sorted, Scalar(0x00ff), ordinal);
Mat ordinal8;
ordinal.convertTo(ordinal8, CV_8SC1, 1, 0);
ordinal8.copyTo(signature(Range::all(), Range(0, 4)));
我必须将 8 位值和 8 位序数打包到一个 16 位 channel 中,因为 OpenCV 不对多 channel 图像执行排序。这几乎是我所需要的,但不完全是。对于示例输入,它给了我:
2 0 3 1
因为最低值在第 2 列,次低值在第 0 列,依此类推。如何在不单独访问每个像素的情况下将其转换为我需要的结果?
本质上,我需要以某种方式对其进行矢量化:
uint8_t x[] = {2, 0, 3, 1};
uint8_t y[4];
for (uint8_t i = 0; i < 4; ++i)
y[x[i]] = i;
其中 x
是我当前矢量化代码给我的中间结果,y
是我想要的结果。
可以吗?
最佳答案
我相信这会为您解决问题。它不需要分配或堆栈或排序,但确实假设您的范围是 0-255(例如 uint8)。更大的假设:只有当你有宽行时它才会有性能。如果它们真的是 4 像素宽,那么 i<256 就有点丑陋了。有办法让它消失,但我假设 4 个像素只是一个“例如”。为简单起见。
void processRow (int* rowpos, uint8_t* pixelsForRow, int w) {
uint32_t i, pv, v=0, hist[256]={0};
for (i=0; i<w; i++) hist[pixelsForRow[i]]++;
for (i=0; i<256; i++) {pv=hist[i]; hist[i]=v; v+=pv;}
for (i=0; i<w; i++) rowpos[i] = hist[pixelsForRow[i]]++;
}
好的 - 它是如何工作的?
此函数中的第 1 行声明并清空直方图表。
第 2 行计算直方图。
第 3 行将其转换为计数排序 - 这就是 hist 使用比 uint8 更大的元素大小的原因
第 4 行应用排序后的位置。
有2个技巧;首先,在第 3 行中,直方图“移动了 1 个索引”,这样第一个值始终为“0”,而不是它本来应该是的值,第二个值是第一个计数的值,依此类推。第二个技巧是第 4 行中的“++”——始终确保序数值是唯一的。
让我们根据您的输入试一试:
[32 128 16 64]
第 2 行:[0...1....1....1...1...0] 分别位于索引 [0、16、32、64、128、255]
第 3 行:[0...0....1....2...3...0] 分别位于索引 [0、16、32、64、128、255]
第 4 行:[1, 3, 0, 2] ... 看起来正确
让我们在稍微不同的输入上尝试一下:
[32 128 16 32]
第 2 行:[0...1....2....0...1...0] 分别位于索引 [0、16、32、64、128、255]
第 3 行:[0...0....1....3...3...0] 分别位于索引 [0、16、32、64、128、255]
第 4 行:[1, 3, 0, 2] ... 完美
但我不太确定它是否满足您对矢量化的需求 -- :)
关于c++ - 需要帮助矢量化此代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15360396/
我是 python 的新手。我试图找到我的文本的频率分布。这是代码, import nltk nltk.download() import os os.getcwd() text_file=open(
我对安卓 fragment 感到困惑。我知道内存 fragment 但无法理解什么是 android fragment 问题。虽然我发现很多定义,比如 Android fragmentation re
尝试对 WordPress 进行 dockerise 我发现了这个场景: 2个数据卷容器,一个用于数据库(bbdd),另一个用于wordpress文件(wordpress): sudo docker
这个问题已经有答案了: From the server is there a way to know that my page is being loaded in an Iframe (1 个回答)
我正在玩小型服务器,试图对运行在其上的服务进行docker化。为简化起见,假设我必须主要处理:Wordpress和另一项服务。 在Docker集线器上有许多用于Wordpress的图像,但是它们似乎都
我想要发生的是,当帐户成功创建后,提交的表单应该消失,并且应该出现一条消息(取决于注册的状态)。 如果成功,他们应该会看到一个简单的“谢谢。请检查您的电子邮件。” 如果不是,那么他们应该会看到一条适当
就是这样,我需要为客户添加一个唯一标识符。通过 strip 元数据。这就是我现在完全构建它的方式,但是我只有最后一部分告诉我用户购买了哪个包。 我试着看这里: Plans to stripe 代码在这
我有一个类将执行一些复杂的操作,涉及像这样的一些计算: public class ComplexAction { public void someAction(String parameter
这个问题已经有答案了: maven add a local classes directory to module's classpath (1 个回答) 已关闭10 年前。 我有一些不应更改的旧 E
我使用 fragment 已经有一段时间了,但我经常遇到一个让我烦恼的问题。 fragment 有时会相互吸引。现在,我设法为此隔离了一个用例,它是这样的: Add fragment A(也使用 ad
我的 html 中有一个 ol 列表,上面有行条纹。看起来行条纹是从数字后面开始的。有没有办法让行条纹从数字开始? 我已经包含了正在发生的事情的片段 h4:nth-child(even) {
如何仅使用 css 将附加图像 html 化? 如果用纯 css 做不到,那我怎么能至少用一个图像来做 最佳答案 这不是真正的问题,而是您希望我们为您编写代码。我建议您搜索“css breadcrum
以下是 Joshua 的 Effective Java 的摘录: If you do synchronize your class internally, you can use various te
在这里工作时,我们有一个框向业务合作伙伴提供 XML 提要。对我们的提要的请求是通过指定查询字符串参数和值来定制的。其中一些参数是必需的,但很多不是。 例如,我们要求所有请求都指定一个 GUID 来标
我有 3 个缓冲区,其中包含在 32 位处理器上运行的 R、G、B 位数据。 我需要按以下方式组合三个字节: R[0] = 0b r1r2r3r4r5r6r7r8 G[0] = 0b g1g2g3g4
我最近发现了关于如何使用 History.js、jQuery 和 ScrollTo 通过 HTML5 History API 对网站进行 Ajax 化的要点:https://github.com/br
我们有一个 Spring Boot 应用程序,由于集成需要,它变得越来越复杂——比如在你这样做之后发送一封电子邮件,或者在你之后广播一条 jms 消息等等。在寻找一些更高级别的抽象时,我遇到了 apa
我正在尝试首次实施Google Pay。我面临如何指定gateway和gatewayMarchantId的挑战。 我所拥有的是google console帐户,不知道在哪里可以找到此信息。 priva
昨天下午 3 点左右,我为两个想要从一个 Azure 帐户转移到另一个帐户的网站设置了 awverify 记录。到当天结束时,Azure 仍然不允许我添加域,所以我赌了一把,将域和 www 子域重新指
我正在使用terms facet在elasticsearch服务器中获取顶级terms。现在,我的标签"indian-government"不被视为一个标签。将其视为"indian" "governm
我是一名优秀的程序员,十分优秀!