Разница в преобразовании RGB -> L*a*b в OpenCV и ImageJ

Мне нужно было преобразовать мое изображение (RGB, хранящееся в .jpg), чтобы выделить его конкретную область. Используя ImageJ, я обнаружил, что извлечение L-канала изображения в цветовом пространстве LAB — это именно то, что мне нужно для дальнейшего изучения. При реализации на C++/OpenCV результат полностью отличается от результата ImageJ (см. фото ImageJ L-channel и L-канал OpenCV):

#include "opencv2/opencv.hpp"
#include "opencv2/core/core.hpp"        
#include "opencv2/highgui/highgui.hpp"  
#include "opencv2/imgproc/imgproc.hpp"

using namespace cv;
using namespace std;

int main(){

     vector <Mat> lab_planes;
     Mat src, lab;

     src = imread("Pic.jpg", CV_LOAD_IMAGE_COLOR);
     cvtColot(src, lab, CV_BGR2Lab);
     split(lab, lab_planes);

     imshow("L", lab_planes[0]);
     imshow("a", lab_planes[1]);
     imshow("b", lab_planes[2]);

     waitKey(0);
     return 0;
 }

Попробовал погуглить и выяснил, что может быть проблема в различии запоминания диапазонов каналов (0 - 255 вместо "правильных" 0 - 100) или RGB-представления, но как получить такое же не пойму результат как с ImageJ.

Спасибо!


person lysukhin    schedule 29.10.2016    source источник


Ответы (1)


Может быть:

cv::normalize(L,L,0,255,cv::NORM_MINMAX); 

Или (может быть, правильнее) просто умножить на 2,55 (сначала преобразовать в CV_32F, затем умножить и преобразовать обратно).

person Andrey Smorodov    schedule 29.10.2016
comment
легкий! спасибо, Андрей. "расширение" диапазона до 0-255 дало результат. - person lysukhin; 29.10.2016