【发布时间】:2021-10-14 16:23:10
【问题描述】:
我有一个没有颜色配置文件的16-bit tiff 图像(嵌入了相机配置文件),我正在尝试在OpenCV 中读取它的RGB 值。但是,例如,将输出值与GIMP 打开图像时给出的值进行比较会给出完全不同的值(GIMP 在打开时保留图像的配置文件选项;没有配置文件转换)。我还尝试了另一个图像工作室软件,如CaptureOne,结果与GIMP 一致,与OpenCV 输出不同。
不确定在OpenCV 中读取和打开图像是否有问题,尽管使用了IMREAD_UNCHANGED 标志。
我也尝试使用 FreeImage 库读取图像,但结果仍然相同。
这是读取OpenCV中像素值的代码的sn-p
const float Conv16_8 = 255.f / 65535.f;
cv::Vec3d curVal;
// upperLeft/lowerRight are just some pre-defined corners for the ROI
for (int row = upperLeft.y; row <= lowerRight.y; row++) {
unsigned char* dataUCPtr = img.data + row * img.step[0];
unsigned short* dataUSPtr = (unsigned short*)dataUCPtr;
dataUCPtr += 3 * upperLeft.x;
dataUSPtr += 3 * upperLeft.x;
for (int col = upperLeft.x; col <= lowerRight.x; col++) {
if (/* some check if the pixel is valid */) {
if (img.depth() == CV_8U) {
for (int chan = 0; chan < 3; chan++) {
curVal[chan] = *dataUCPtr++;
}
}
else if (img.depth() == CV_16U) {
for (int chan = 0; chan < 3; chan++) {
curVal[chan] = (*dataUSPtr++)*Conv16_8;
}
}
avgX += curVal;
}
else {
dataUCPtr += 3;
dataUSPtr += 3;
}
}
}
这是我正在阅读的图像 (download the image),其中包含 RGB 读数
CaptureOne StudioAdobeRGB:
vs OpenCV RGB(A1=白色 --> F1=黑色):
PS1:我也尝试将 GIMP/CaptureOne 中的输出色彩空间更改为 sRGB,但差异仍然几乎相同,而不是更接近 OpenCV
PS2:在从图像COLOR_RGB2BGR 提取 RGB 值之前,我正在反转 OpenCV imread 通道的顺序。
【问题讨论】:
-
您说您有一个 TIF,但共享了一个 PNG?请分享您的实际 TIF,可能使用 Dropbox 或 Google Drive。你说你的图像是 16 位的,但你的白色显示为 8 位的 255,而你的 OpenCV 值是浮点数,通常是 32 位而不是 16 位?
-
已将链接添加到源图像(tiff 16 位)。是的,这就是软件输出如何将 16 位转换为 8 位范围 [0-255] 的方式。对于我的
OpenCV输出,有一个conv16_8因子,使用该因子将值转换为8 位范围[0-255]。如有必要,我可以提供实际的 16 位读数,但我认为这不是问题 -
您分享的 TIFF 文件是 24 位的,即 RGB888。
-
哦,对不起...我似乎弄错了图像。请现在再次检查链接我已经更新了它
-
好的,您现在共享的图像是每通道 16 位,所以实际上每像素 48 位 - 不错的相机和镜头????
标签: c opencv rgb color-space imread