我有一個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