2016-10-29 11 views
1

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

#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; 
} 

Я попытался Google, что и выяснили, что там может быть проблема в разнице хранения диапазоны каналов (0 - 255 вместо «правильного» 0 - 100) или RGB-презентации, но я не понимаю, как получить тот же результат, что и с ImageJ.

Спасибо!

ответ

1

Может быть:

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

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

+0

простой! спасибо, Андрей. Результат «расширения» до 0-255 дал результат. – melodisease