如何获取CIELAB图像a轴和b轴的像素值

How to get the pixel value on the a-axis and b-axis of CIELAB image

我将一张BGR图像转换为LAB颜色系统,我想知道LAB图像中一个像素在a轴和b轴上的准确值。 如下代码所示,当我使用 dst.get(0, 3)[0] 显示 LAB 图像中某个像素的像素值时,我收到一个标量值,而我想要获得的是 LAB 图像中的像素值a 轴和 b 轴。

我需要它来计算天居距离。 请让我知道怎么做

*代码**:

    Mat dst = new Mat();
    Imgproc.cvtColor(bgrMat, dst, Imgproc.COLOR_BGR2Lab);
    ImageUtils.showMat(dst, "");

    Log.D(TAG, "main", "dst.dump() \n" + dst.dump());
    Log.D(TAG, "main", "dst.get(0, 3): " + dst.get(0, 3)[0]);

outPut:

    1: Debug: MainClass -> main: dst.dump() 
    [1, 128, 128, 7, 128, 128, 19, 128, 128, 47, 128, 128, 58, 128, 128, 28, 128, 128, 8, 128, 128, 16, 128, 128, 17, 128, 128, 18, 128, 128;
    2, 128, 128, 2, 128, 128, 15, 128, 128, 46, 128, 128, 55, 128, 128, 40, 128, 128, 27, 128, 128, 27, 128, 128, 25, 128, 128, 24, 128, 128;
    1, 128, 128, 3, 128, 128, 18, 128, 128, 34, 128, 128, 34, 128, 128, 41, 128, 128, 47, 128, 128, 39, 128, 128, 30, 128, 128, 23, 128, 128;
    9, 128, 128, 10, 128, 128, 19, 128, 128, 25, 128, 128, 17, 128, 128, 23, 128, 128, 41, 128, 128, 51, 128, 128, 24, 128, 128, 9, 128, 128;
    11, 128, 128, 9, 128, 128, 27, 128, 128, 58, 128, 128, 63, 128, 128, 43, 128, 128, 36, 128, 128, 48, 128, 128, 23, 128, 128, 5, 128, 128;
    5, 128, 128, 9, 128, 128, 36, 128, 128, 78, 128, 128, 103, 128, 128, 93, 128, 128, 71, 128, 128, 61, 128, 128, 19, 128, 128, 1, 128, 128;
    5, 128, 128, 10, 128, 128, 39, 128, 128, 68, 128, 128, 82, 128, 128, 87, 128, 128, 83, 128, 128, 73, 128, 128, 16, 128, 128, 1, 128, 128;
    1, 128, 128, 1, 128, 128, 41, 128, 128, 77, 128, 128, 57, 128, 128, 34, 128, 128, 38, 128, 128, 40, 128, 128, 27, 128, 128, 9, 128, 128;
    5, 128, 128, 5, 128, 128, 47, 128, 128, 87, 128, 128, 57, 128, 128, 27, 128, 128, 16, 128, 128, 9, 128, 128, 19, 128, 128, 39, 128, 128;
    11, 128, 128, 12, 128, 128, 58, 128, 128, 94, 128, 128, 67, 128, 128, 47, 128, 128, 35, 128, 128, 18, 128, 128, 24, 128, 128, 42, 128, 128]
    2: Debug: MainClass -> main: dst.get(0, 3): 47.0

您误解了 3 通道 OpenCV Mat 的结构和 dump 的输出。

如果您查看 here,您会发现下图显示了 3 通道垫的内部结构。

table 颜色为蓝色、绿色和红色,但它与任何 3 通道垫的结构相同,包括 CIELAB。

您会注意到每一列都由 3 个值组成。在 BGR 图像中,这些将是像素的蓝色、绿色和红色分量。在您的例子中,它们是 Lab 组件。

现在看看你的垫子的转储。它有 10 行,但有 30 列。我敢打赌你的 Mat 的大小是 10x10,有 3 个通道。如图所示,转储有 30 列而不是 10 列的原因是每个像素的 3 个分量是连续列出的。这是转储的第一行:

[1, 128, 128, 7, 128, 128, 19, 128, 128, 47, 128, 128, 58, 128, 128, 28, 128, 128, 8, 128, 128, 16, 128, 128, 17, 128, 128, 18, 128, 128; ..

(0,0) 处的第一个像素具有 1, 128, 128Lab 个分量。
(0,1) 处的第二个像素具有 7, 128, 128.
Lab 个分量 第三个像素是19, 128, 128。这些 3 个像素 占据了转储中的前 9 个值
(0,3) 处的第四个像素(从第 10 个值开始)是 47, 128, 128

这就是为什么 dst.get(0,3)[0] = 47,
dst.get(0,3)[1]=128
dst.get(0,3)[2] = 128.

通常,要单独访问这些像素,您会 get 将它们放入与图像类型相同的数组中。例如,如果您有一个 CV_8UC3,您可以将像素放入 byte[]:

byte[] interestingPixel = dst.get(0, 3);

现在,对于像素 (0, 3)

interestingPixel[0] = L
interestingPixel[1] = a
interestingPixel[2] = b