Я пытаюсь реализовать функцию Matlab, которая выполняется с помощью opencv. Какую функцию порога opencv я должен использовать для реализации функции Matlab multithresh? Как только было установлено пороговое значение, как я назову пиксели в соответствии с порогом? Это правильный способ реализации imquantize? Есть ли какая-нибудь другая функция, которую я должен включить в код?Выполнение функции «imquantize» в opencv
1
A
ответ
0
Существует реализация на основе OpenCV here, где вы должны, вероятно, получить идею:
cv::Mat
imquantize(const cv::Mat& in, const arma::fvec& thresholds) {
BOOST_ASSERT_MSG(cv::DataType<float>::type == in.type(), "input is not of type float");
cv::Mat index(in.size(), in.type(), cv::Scalar::all(1));
for (int i = 0; i < thresholds.size() ; i++) {
cv::Mat temp = (in > thresholds(i))/255;
temp.convertTo(temp, cv::DataType<float>::type);
index += temp;
}
return index;
}
Изменено: thresholds
является вектором порогового поплавка значений (равномерным распределены # of levels
, что вы хотите для квантования в пределах [0, 1]
). Проверить the code snippet как он используется:
const float step = 1./levels[i];
arma::fvec thresh = arma::linspace<arma::fvec>(step, 1.-step, levels[i]-1);
channels[i] = imquantize(channels[i], thresh);
0
Я полагаю, вы ищете что-то вроде этого
/*function imquantize
* 'inputImage' is the input image.
* 'levels' is an array of threholds
* 'quantizedImage' is the reurned image
* with quantized levels.
*/
Mat imquantize(Mat inputImage, vector<vector<int> > levels)
{
//initialise output label matrix
Mat quantizedImage(inputImage.size(), inputImage.type(), Scalar::all(1));
//Apply labels to the pixels according to the thresholds
for (int i = 0; i < inputImage.cols; i++)
{
for (int j = 0; j < inputImage.rows; j++)
{
// Check if image is grayscale or BGR
if(levels.size() == 1)
{
for (int k = 0; k < levels[0].size(); k++)
{
// if pixel < lowest threshold , then assign 0
if(inputImage.at<uchar>(j,i) <= levels[0][0])
{
quantizedImage.at<uchar>(j,i) = 0;
}
// if pixel > highest threshold , then assign 255
else if(inputImage.at<uchar>(j,i) >= levels[0][levels[0].size()-1])
{
quantizedImage.at<uchar>(j,i) = 255;
}
// Check the level borders for pixel and assign the corresponding
// upper bound quanta to the pixel
else
{
if(levels[0][k] < inputImage.at<uchar>(j,i) && inputImage.at<uchar>(j,i) <= levels[0][k+1])
{
quantizedImage.at<uchar>(j,i) = (k+1)*255/(levels[0].size());
}
}
}
}
else
{
Vec3b pair = inputImage.at<Vec3b>(j,i);
// Processing the Blue Channel
for (int k = 0; k < levels[0].size(); k++)
{
if(pair.val[0] <= levels[0][0])
{
quantizedImage.at<Vec3b>(j,i)[0] = 0;
}
else if(pair.val[0] >= levels[0][levels.size()-1])
{
quantizedImage.at<Vec3b>(j,i)[0] = 255;
}
else
{
if(levels[0][k] < pair.val[0] && pair.val[0] <= levels[0][k+1])
{
quantizedImage.at<Vec3b>(j,i)[0] = (k+1)*255/(levels[0].size());
}
}
}
// Processing the Green Channel
for (int k = 0; k < levels[1].size(); k++)
{
if(pair.val[1] <= levels[1][0])
{
quantizedImage.at<Vec3b>(j,i)[1] = 0;
}
else if(pair.val[1] >= levels[1][levels.size()-1])
{
quantizedImage.at<Vec3b>(j,i)[1] = 255;
}
else
{
if(levels[1][k] < pair.val[1] && pair.val[1] <= levels[1][k+1])
{
quantizedImage.at<Vec3b>(j,i)[1] = (k+1)*255/(levels[1].size());
}
}
}
// Processing the Red Channel
for (int k = 0; k < levels[2].size(); k++)
{
if(pair.val[2] <= levels[2][0])
{
quantizedImage.at<Vec3b>(j,i)[2] = 0;
}
else if(pair.val[2] >= levels[2][levels.size()-1])
{
quantizedImage.at<Vec3b>(j,i)[2] = 255;
}
else
{
if(levels[2][k] < pair.val[2] && pair.val[2] <= levels[2][k+1])
{
quantizedImage.at<Vec3b>(j,i)[2] = (k+1)*255/(levels[2].size());
}
}
}
}
}
}
return quantizedImage;
}
В этой функции вход должен был быть Mat :: Изображение и 2D вектор, могут иметь разные уровни для разных каналов.
Смежные вопросы
- 1. Функция imquantize в matlab
- 2. Неопределенные функции в opencv
- 3. Функции в OpenCV
- 4. Выполнение Matlab извлечения функции Haar
- 5. Выполнение функции функции python
- 6. Выполнение функции
- 7. Выполнение функции в Python
- 8. Выполнение функции в R
- 9. Выполнение SQL В функции
- 10. Выполнение функции в appdomain
- 11. Выполнение функции в SQL
- 12. Выполнение HSV в OpenCV порогов для Java
- 13. Выполнение функции
- 14. Сбой функции OpenCV с маской, созданной из пороговой функции OpenCV?
- 15. сбой функции cvtColor в opencv
- 16. Функции переноса из OpenCV
- 17. функции OpenCV программирования
- 18. OpenCV Dense признак функции
- 19. Результат функции «cvtColor» OpenCV
- 20. OpenCV - изменение функции filter2D
- 21. Понимание неискаженной функции OpenCV
- 22. Использование функции cvGet2D - opencv
- 23. filter2D openCV ошибка функции
- 24. MATLAB для ++/OpenCV функции
- 25. Выполнение функции встроенной функции Google/пользовательской функции
- 26. Выполнение бесшумной функции в vim
- 27. Выполнение функции остановлено в середине
- 28. Выполнение рекурсивной функции в OCaml
- 29. Выполнение функции изменения в Eigen
- 30. Выполнение пользовательской функции в R
Извините, что задал вопрос. Откуда я получу этот «порог»? – user3440725
«пороговые значения» являются матрицей n на 1. Это правильно? Как я могу сделать эту матрицу? – user3440725
@ user3440725 Я обновил ответ, чтобы он дал понять. – herohuyongtao