Хотите перевести этот код Matlab в код OpenCV - PullRequest
0 голосов
/ 22 апреля 2019

Я хочу перевести некоторый код Matlab в код C ++ с помощью OpenCV.Какие функции мне нужно использовать?

Для поэлементного умножения я не знаю, какую функцию использовать.Например,

cv::Mat A; cv::Mat B; cv::Mat C;
C = A + B;
//or
cv::add(A, B, C);

Это код MATLAB:

% G and b are constant 
% Rb, CRb and Rb_final are the images

Rb = G(CRb+b);
min3 = min(min(Rb)); % minimum in the Rb image
max3 = max(max(Rb)); % maximum in the Rb image

Rb_final = uint8(255*(Rb-min3)/(max3-min3)); % This function is to scale the image into 0 ~ 255 using maximum and minimum value in the image. And then convert the image into 8-bit unsigned image.

Это код OpenCV, который я пробовал:

Rb_final = uint8(255*(Rb-min3)/(max3-min3));

Я нашел максимуми min следующим кодом:

double max3, min3; 
minMaxLoc(Rb, &min3, &max3); 
Rb = Rb - min3; 
Rb = 255 * Rb; 
Rb = Rb / (max3 - min3); 

Я нахожу это для всех каналов B, G, R.Но результат не так хорош, как с cv::convertScaleAbs(Rb, R, 255, 0);

Ответы [ 2 ]

0 голосов
/ 23 апреля 2019

просто сделайте это:

Rb.convertTo(Rb,CV_32F);
Rb *= C;
Rb += b;
Rb *= G;

double max3, min3;
minMaxLoc(Rb, &min3, &max3);
Rb = 255 * (Rb - min3)/(max3 - min3);

Rb.convertTo(Rb,CV_8U);
0 голосов
/ 22 апреля 2019

Одна проблема с вашим кодом C ++ состоит в том, что изображение имеет тип uint8, что означает, что многие операции будут переполнены (или насыщены). Например, умножение изображения на 255 гарантирует его переполнение. Вместо этого упорядочите операции, чтобы избежать переполнения:

double max3, min3;
minMaxLoc(Rb, &min3, &max3);
Rb = Rb - min3;
Rb = Rb * (255 / (max3 - min3));

В качестве альтернативы используйте cv::convertScaleAbs:

cv::convertScaleAbs(Rb, Rb, 255 / (max3 - min3), -min3);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...