OpenCV 和 ImageJ 中 RGB -> L*a*b 转换的差异
Difference in RGB -> L*a*b transformation in OpenCV and ImageJ
我需要转换我的图像(RGB 存储在 .jpg 中)以突出显示它的特定区域。使用 ImageJ,我发现以 LAB 颜色 space 提取图像的 L 通道正是我进一步检查所需要的。
在 C++ / OpenCV 中实现时,结果与 ImageJ 完全不同(参见图片 ImageJ L-channel and OpenCV L-channel):
#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 而不是 'correct' 0 - 100)或 RGB 表示可能存在差异,但我不知道如何获得与 ImageJ 相同的结果。
谢谢!
可能是:
cv::normalize(L,L,0,255,cv::NORM_MINMAX);
或者(可能更正确)乘以 2.55(先转换为 CV_32F,然后相乘,再转换回来)。
我需要转换我的图像(RGB 存储在 .jpg 中)以突出显示它的特定区域。使用 ImageJ,我发现以 LAB 颜色 space 提取图像的 L 通道正是我进一步检查所需要的。 在 C++ / OpenCV 中实现时,结果与 ImageJ 完全不同(参见图片 ImageJ L-channel and OpenCV L-channel):
#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 而不是 'correct' 0 - 100)或 RGB 表示可能存在差异,但我不知道如何获得与 ImageJ 相同的结果。
谢谢!
可能是:
cv::normalize(L,L,0,255,cv::NORM_MINMAX);
或者(可能更正确)乘以 2.55(先转换为 CV_32F,然后相乘,再转换回来)。