OpenCV - 拆分通道时出错

OpenCV - error when splitting channels

本文关键字:出错 通道 拆分 OpenCV      更新时间:2023-10-16

我正在尝试在OpenCV中使用重映射功能。我有一个 STMap,所以x值在红色通道中,y值在绿色通道中。

在这里,我正在加载要映射的源图像和STMap:

Mat image3= imread("stmap.tif", CV_32FC1);
Mat image4= imread("source.tif", CV_LOAD_IMAGE_UNCHANGED);

然后我拆分通道以从我的 STMap 中获取红色和绿色通道:

Mat bgr[3];   //destination array
split(image3,bgr);//split source
bgr[0].convertTo(bgr[0],CV_32FC1);
bgr[1].convertTo(bgr[1],CV_32FC1);
bgr[2].convertTo(bgr[2],CV_32FC1);
Mat dst;

最后,重新映射部分:

remap(image4, dst,bgr[2],bgr[1],INTER_LINEAR,BORDER_CONSTANT,Scalar(0,0,0));

但是,当我展示dst垫时,它全是黑色的。我尝试将一些值打印到控制台,例如:

cout << bgr[2].at<float>(1000,300);

但它们都是0。我展示了bgr[1]bgr[2],它们绝对不全是黑色的 - 它们是灰度渐变,就像它们应该的那样。

那么问题可能出在哪里呢?

谢谢!

编辑:

注意到每当我使用 .jpeg 文件和命令时:

cout << bgr2[2].at<float>(1000,300);

它会给我类似的东西0.1828510

但是当我使用 32 位.tif运行相同的命令时,它会给我:

1.04984e-320

编辑2:

我应该如何使用convertMaps()功能?

这是我尝试过的,但没有奏效:

Mat image3= imread("STMap.jpg");
Mat image4= imread("image.jpg");
    Mat bgr[3];  
    split(image3,bgr);
    Mat map_x, map_y;
    map_x.create( image.size(), CV_32FC1 );
    map_y.create( image.size(), CV_32FC1 );    
    convertMaps(bgr[2], bgr[1], map_x, map_y, CV_32FC1);

另外,当我使用convertTo()

bgr[2].convertTo(red_channel, CV_32FC1, 1/255.0)

bgr[2]正确显示(映射强度的灰度图像),并且red_channel的所有值都在 0.0 和 1.0 之间

你对convertTo()的呼吁根本没有意义。另请查看remap()的文档,您会发现convertMap()的参考,这是更改矩阵类型的首选方法(如果您真的必须这样做!

remap()期望输入在特定范围内,可能还取决于输入矩阵的类型。如果它适用于 JPEG 但不适用于 32 位 TIFF,我希望您会遇到数据范围问题。