1
A
回答
3
如果它是一個UCHAR墊
/**
* @param : input image
* @hist : histogram
* @nmin : total minimum pixels number
* @nmax : total maximum pixels number
* @channel : channel number
*
* ex : images with 1000 pixels, 50 equal to 5% of it
*/
std::pair<size_t, size_t> get_quantile_uchar(cv::Mat &input, cv::MatND &hist, size_t nmin, size_t nmax, int channel)
{
int const hist_size = std::numeric_limits<uchar>::max() + 1;
float const hranges[2] = {0, 255};
float const *ranges[] = {hranges};
//compute and cumulate the histogram
cv::calcHist(&input, 1, &channel, cv::Mat(), hist, 1, &hist_size, ranges);
auto *hist_ptr = hist.ptr<float>(0);
for(size_t i = 1; i != hist_size; ++i){
hist_ptr[i] += hist_ptr[i - 1];
}
// get the new min/max
std::pair<size_t, size_t> min_max(0, hist_size - 1);
while(min_max.first != (hist_size - 1) && hist_ptr[min_max.first] <= nmin){
++min_max.first; // the corresponding histogram value is the current cell position
}
while(min_max.second > 0 && hist_ptr[min_max.second] > nmax){
--min_max.second; // the corresponding histogram value is the current cell position
}
if (min_max.second < hist_size - 2)
++min_max.second;
return min_max;
}
實施例中,如果有一個墊(100 * 100)在0〜255的值,就可以測量頂部 5%百分位數,最低爲3%百分位數這樣
auto const result = get_quantile(input, hist, input.total * 0.03, input.total * 0.95, 0);
,如果它不是一個UCHAR墊,然後就可以進行排序要測量第一通道
/**
* @brief generic algorithm for other channel types except of uchar
* @param input the input image
* @param output the output image
* @param smin total number of minimum pixels
* @param smax total number maximum pixels
* @param channel the channel used to compute the histogram
*
* This algorithm only support uchar channel and float channel by now
*/
template<typename T>
std::pair<T, T> get_quantile(cv::Mat &input, size_t smin, size_t smax, int channel)
{
std::vector<float> temp_input = copy_to_one_dim_array_ch<float>(input, channel);
std::sort(std::begin(temp_input), std::end(temp_input));
return std::pair<T, T>(temp_input[smin], temp_input[temp_input.size() - 1 - smax]);
}
接下來的問題是如何實現功能copy_to_one_dim_array_ch
/*
* experimental version for cv::Mat, try to alleviate the problem
* of code bloat.User should make sure the space of begin point to
* have enough of spaces.
*/
template<typename T, typename InputIter>
void copy_to_one_dim_array_ch(cv::Mat const &src, InputIter begin, int channel)
{
int const channel_number = src.channels();
if(channel_number <= channel || channel < 0){
throw std::out_of_range("channel value is invalid\n" + std::string(__FUNCTION__) +
"\n" + std::string(__FILE__));
}
for(int row = 0; row != src.rows; ++row){
auto ptr = src.ptr<T>(row) + channel;
for(int col = 0; col != src.cols; ++col){
*begin = *ptr;
++begin;
ptr += channel_number;
}
}
}
template<typename T>
std::vector<T> const copy_to_one_dim_array_ch(cv::Mat const &src, int channel)
{
std::vector<T> result(src.total());
copy_to_one_dim_array_ch<T>(src, std::begin(result), channel);
return result;
}
某些功能需要C++ 11的支持,以及功能copy_to_one_dim_array_ch 不支持非字節的圖像
如果你想讓它變得更容易使用,你可以 1:將這些函數包裝在一個類中。
2:在uchar上應用完全專業化Mat Mat 3:將函數包裝在函數中
相關問題
- 1. 從OpenCV直方圖獲取值
- 2. 從不同陣列中獲取價值
- 3. 如何使用按鍵從陣列中獲取價值陣列
- 4. R從直方圖獲取中斷值
- 5. 從HSV直方圖獲取主色值
- 6. 獲取價值我們的陣列 - PHP
- 7. 獲取價值,添加到陣列
- 8. 獲取場陣列的獨特價值
- 9. Laravel從陣列中獲得價值
- 10. 直方圖opencv
- 11. 從PHP陣列獲取值
- 12. 獲得價值陣列
- 13. 直方圖值的平均值OpenCV
- 14. 使從陣列非圖形直方圖值
- 15. 從地圖獲取地圖的價值
- 16. Java直方圖陣列
- 17. C#級陣列直方圖
- 18. OpenCV - 從圖像中獲取灰度值
- 19. 從openCV獲取圖像的特徵值
- 20. 使用OpenCV從圖像序列中獲取中值圖片
- 21. 無法從GET方法獲取價值
- 22. 從驗證方法中獲取價值
- 23. 如何從直方圖中獲取閾值?
- 24. 無法在OpenCV中獲取直方圖圖像
- 25. 從對象列表中獲取價值
- 26. Dropmenu從列表中獲取價值
- 27. 從熊貓列表中獲取價值
- 28. 從數據庫列獲取價值Laravel
- 29. 一維直方圖opencv與雙值
- 30. OpenCV弓 - 太高的直方圖值