我有一个8位图像。对于每个像素,我需要计算出当前行中的序号位置。例如,如果行是:需要帮助向量化此代码
32 128 16 64,
然后我需要的结果:
1 3 0 2,
因为32是该行中的第一最高值,128是第三最高,16是第0最高和64是第二高的。
我需要重复上述过程的图像的所有行。这是非量化代码:
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位信道,因为OpenCV中不执行排序多通道图像。这几乎是我需要的,但并不完全。对于例如输入,它给了我:
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
是我想要的结果。
可以这样做吗?
只是澄清(我还没有答案) - 如果你有多个像素具有相同的值,你想要做什么?他们都应该是相同的序数? – 2013-03-12 12:11:31
偏题:偶然的一天,我正在阅读你在github上镜像的[ffmpeg教程](https://github.com/mpenkov/ffmpeg-tutorial)源代码。该网址停止工作,所以我去你的个人资料,以防你重命名,但我想你删除了它,现在我偶然认出你的头像。 – 2013-03-12 12:12:18
在这种形式下它是不可能的。有什么限制?例如是x []总是4元素宽?应该是uint8_t吗? – 2013-03-12 12:25:05