私は8ビットイメージを持っています。各ピクセルについて、私は現在の行の順序位置を計算する必要があります。たとえば、行がある場合:32は、行の第1の最高値であるこのコードをベクトル化するのに役立つ
1 3 0 2,
ので、128が最高3であり、16は最高64 0番目である:
32 128 16 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
は簡単なコンパレータ機能です。
私は上記のコードをベクトル化することを試みた。この得た:私はOpenCVのが行われないので、1つの16ビットのチャネルに8ビットの値と、8ビットの順序をパックしなければならなかった
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)));
をマルチチャンネル画像のソート。これは私が必要とするものですが、そうではありません。例えば、入力のために、それは私与える:最低値が2列目にあるので
2 0 3 1
を、次の最低は私がすることなく、必要な結果にこれを変換して行くにはどうすればよいなど0列目、です個別に各ピクセルにアクセスしますか?
基本的に、私は何とかこれをベクトル化する必要があります:x
は私の現在のベクトル化コードが私を与え、y
中間結果である
uint8_t x[] = {2, 0, 3, 1};
uint8_t y[4];
for (uint8_t i = 0; i < 4; ++i)
y[x[i]] = i;
は私が望む結果です。
できますか?
明確にするために(私はまだ回答がありません) - 同じ値のピクセルが複数ある場合はどうしますか?彼らはすべて同じ順序であるべきですか? –
トピック:私がgithubでミラー化した[ffmpegチュートリアル](https://github.com/mpenkov/ffmpeg-tutorial)ソースコードを読んでいた偶然の偶然です。あなたが名前を変更した場合にあなたのプロフィールに行ったので、あなたが削除したと思いますが、今はあなたのアバターを偶然に認識しました。 –
このフォームでは不可能です。どのような制約がありますか?例えばx []は常に4要素幅ですか?代わりにuint8_tする必要がありますか? –