Mam obraz 8-bitowy. Dla każdego piksela muszę ustalić jego pozycję porządkową w bieżącym wierszu. Na przykład, jeżeli rząd jest:Potrzebujesz pomocy wektoryzacji tego kodu
32 128 16 64,
następnie trzeba Rezultatem
1 3 0 2,
od 32 jest 1. Najwyższa wartość rzędu 128 jest 3 pod najwyżej 16 jest 0TH najwyższym i 64 jest 2. najwyżej.
Muszę powtórzyć powyższą procedurę dla wszystkich wierszy obrazu. Oto kod non-wektorowy:
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
jest obraz 8-bitowy Czytam od i ma new_height
wiersze i 4 kolumny. signature
to podpisany obraz tego samego rozmiaru (zignoruj różnicę w znaku na razie, ponieważ nie jest to istotne) - tam przechowuję wynik. cmpfun
to trywialna funkcja komparatora.
Próbowałem wektorować powyższy kod i dostał to:
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)));
musiałem spakować wartość 8-bitowego i 8-bitowa liczba porządkowa w pojedynczym kanale 16-bitowej, ponieważ nie wykonuje OpenCV sortowanie dla obrazów wielokanałowych. To jest prawie to, czego potrzebuję, ale nie całkiem. Dla przykładu wejście, to daje mi:
2 0 3 1
ponieważ najniższa wartość jest w 2 kolumnie, obok najniższy jest w kolumnie 0th itp Jak mogę iść o przekształcenie tego do wyniku muszę bez dostęp do każdego piksela indywidualnie?
Zasadniczo, muszę jakoś wektorować to:
uint8_t x[] = {2, 0, 3, 1};
uint8_t y[4];
for (uint8_t i = 0; i < 4; ++i)
y[x[i]] = i;
gdzie x
jest wynikiem pośredniego mój aktualny kod vectorized daje mi i y
jest wynikiem chcę.
Czy można to zrobić?
Tylko dla wyjaśnienia (nie mam jeszcze odpowiedzi) - Co chcesz zrobić, jeśli masz wiele pikseli o tej samej wartości? Czy wszystkie powinny być takie same porządkowe? –
Nie na temat: Co za zbieg okoliczności, właśnie w dniu, w którym czytałem samouczek [ffmpeg tutorial] (https://github.com/mpenkov/ffmpeg-tutorial) kod źródłowy dublowany na github. Url przestał działać, więc poszedłem do twojego profilu, na wypadek, gdybyś zmienił nazwę, ale domyślam się, że go usunąłeś, i od razu rozpoznałem twojego awatara przez przypadek. –
W tej formie jest prawie niemożliwe. Jakie są ograniczenia? na przykład czy x [] ma zawsze szerokość 4 elementów? czy powinien to być uint8_t? –