【问题标题】:Trying to change HSV color of a pixel, and getting unexpected color as a result. Why?试图改变一个像素的 HSV 颜色,结果得到了意想不到的颜色。为什么?
【发布时间】:2016-01-12 07:18:48
【问题描述】:

以下两个图像中的第一个,rgbaMat.bmp,是RGBA 格式的5px*5px .bmp 图像。这张图片是使用 Highgui.imread 从 sdcard 中读取的,然后使用 Imgproc.cvtColor(rgbaMat, hsvMat, Imgproc.COLOR_BGR2HSV); 转换为 HSV 得到 hsvMat.bmp(第二张图片):

以下是在 MS Paint 中放大到 100px*100px 的相同图像,以供查看。

然后执行下面的代码后,我得到的changedMat.bmp的图片如下,后面是放大版。

问题是我在编写代码时所期望的是交替像素应该有 white (H=0, S=0, V=255) 和 black (``)色调分别,可以检查in the HSV section on this website。但我得到的是红色和黑色。

问题是为什么?我哪里错了?

public void doProcessing(View view) {
    Mat rgbaMat = Highgui.imread("/mnt/sdcard/DCIM/rgbaMat.bmp");

    Mat hsvMat = new Mat();
    Imgproc.cvtColor(rgbaMat, hsvMat, Imgproc.COLOR_BGR2HSV);
    Highgui.imwrite("/mnt/sdcard/DCIM/hsvMat.bmp", hsvMat);//check

    int counter=1;
    for (int firstCoordinate = 0; firstCoordinate<hsvMat.rows(); firstCoordinate++) {
        for (int secondCoordinate = 0; secondCoordinate<hsvMat.cols(); secondCoordinate++) {
            Log.i(TAG, "HAPPY " + Arrays.toString(hsvMat.get(firstCoordinate, secondCoordinate)));//check

            double[] pixelChannels = hsvMat.get(firstCoordinate, secondCoordinate);

            if (counter%2 != 0) {
                pixelChannels[0]=0;
                pixelChannels[1]=0;
                pixelChannels[2]=255;
            } else {
                pixelChannels[0]=0;
                pixelChannels[1]=0;
                pixelChannels[2]=0;
            }

            hsvMat.put(firstCoordinate, secondCoordinate, pixelChannels);

            counter++;
            Log.i(TAG, "HAPPY PAPPY" + Arrays.toString(hsvMat.get(firstCoordinate, secondCoordinate)));//check
        }
    }
    Highgui.imwrite("/mnt/sdcard/DCIM/matChanged.bmp", hsvMat);//check
}

.................................................. ..................................................... ..................................................... ......


编辑:

Line#11 和 Line#28 上的 Log.i 语句打印出以下输出,这很好

01-12 13:46:44.445: I/MainActivity(29690): HAPPY [0.0, 0.0, 164.0]
01-12 13:46:44.445: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 255.0]
01-12 13:46:44.445: I/MainActivity(29690): HAPPY [29.0, 252.0, 255.0]
01-12 13:46:44.445: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 0.0]
01-12 13:46:44.445: I/MainActivity(29690): HAPPY [0.0, 0.0, 164.0]
01-12 13:46:44.446: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 255.0]
01-12 13:46:44.446: I/MainActivity(29690): HAPPY [29.0, 252.0, 255.0]
01-12 13:46:44.446: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 0.0]
01-12 13:46:44.446: I/MainActivity(29690): HAPPY [0.0, 0.0, 164.0]
01-12 13:46:44.446: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 255.0]
01-12 13:46:44.446: I/MainActivity(29690): HAPPY [29.0, 252.0, 255.0]
01-12 13:46:44.447: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 0.0]
01-12 13:46:44.447: I/MainActivity(29690): HAPPY [0.0, 0.0, 164.0]
01-12 13:46:44.447: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 255.0]
01-12 13:46:44.447: I/MainActivity(29690): HAPPY [29.0, 252.0, 255.0]
01-12 13:46:44.447: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 0.0]
01-12 13:46:44.448: I/MainActivity(29690): HAPPY [0.0, 0.0, 164.0]
01-12 13:46:44.448: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 255.0]
01-12 13:46:44.448: I/MainActivity(29690): HAPPY [29.0, 252.0, 255.0]
01-12 13:46:44.448: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 0.0]
01-12 13:46:44.448: I/MainActivity(29690): HAPPY [0.0, 0.0, 164.0]
01-12 13:46:44.448: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 255.0]
01-12 13:46:44.448: I/MainActivity(29690): HAPPY [29.0, 252.0, 255.0]
01-12 13:46:44.448: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 0.0]
01-12 13:46:44.448: I/MainActivity(29690): HAPPY [0.0, 0.0, 164.0]
01-12 13:46:44.448: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 255.0]
01-12 13:46:44.449: I/MainActivity(29690): HAPPY [29.0, 252.0, 255.0]
01-12 13:46:44.449: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 0.0]
01-12 13:46:44.449: I/MainActivity(29690): HAPPY [0.0, 0.0, 164.0]
01-12 13:46:44.450: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 255.0]
01-12 13:46:44.450: I/MainActivity(29690): HAPPY [29.0, 252.0, 255.0]
01-12 13:46:44.450: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 0.0]
01-12 13:46:44.450: I/MainActivity(29690): HAPPY [0.0, 0.0, 164.0]
01-12 13:46:44.450: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 255.0]
01-12 13:46:44.450: I/MainActivity(29690): HAPPY [29.0, 252.0, 255.0]
01-12 13:46:44.451: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 0.0]
01-12 13:46:44.451: I/MainActivity(29690): HAPPY [0.0, 0.0, 164.0]
01-12 13:46:44.451: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 255.0]
01-12 13:46:44.451: I/MainActivity(29690): HAPPY [29.0, 252.0, 255.0]
01-12 13:46:44.451: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 0.0]
01-12 13:46:44.451: I/MainActivity(29690): HAPPY [0.0, 0.0, 164.0]
01-12 13:46:44.452: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 255.0]
01-12 13:46:44.452: I/MainActivity(29690): HAPPY [29.0, 252.0, 255.0]
01-12 13:46:44.452: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 0.0]
01-12 13:46:44.452: I/MainActivity(29690): HAPPY [0.0, 0.0, 164.0]
01-12 13:46:44.452: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 255.0]
01-12 13:46:44.452: I/MainActivity(29690): HAPPY [29.0, 252.0, 255.0]
01-12 13:46:44.452: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 0.0]
01-12 13:46:44.452: I/MainActivity(29690): HAPPY [0.0, 0.0, 164.0]
01-12 13:46:44.452: I/MainActivity(29690): HAPPY PAPPY[0.0, 0.0, 255.0]

【问题讨论】:

    标签: android opencv opencv3.0 hsv opencv4android


    【解决方案1】:

    为了检查,我将像素的 HSV 转换为 Android Color 并使用

    记录 Android Color 的值
    //CONVERTING HSV COLOR TO ANDROID COLOR
    //Step 1: Convert double[] to float[]. Step 2: Scale the float[]. STep 3: Use Android's HSVToColor method
    float[] channelsFloatArrayScaled = new float[3];
    for (int i = 0; i < hsvMat.get(firstCoordinate, secondCoordinate).length; i++) {
        if (i == 0) {
            channelsFloatArrayScaled[i] = ((float) hsvMat.get(firstCoordinate, secondCoordinate)[i]) * 2;// TODO Wrap an ArrayIndexOutOfBoundsException wrapper
        } else if (i == 1 || i == 2) {
            channelsFloatArrayScaled[i] = ((float) hsvMat.get(firstCoordinate, secondCoordinate)[i]) / 255;// TODO Wrap an ArrayIndexOutOfBoundsException wrapper
        }
    }
    int androidColor = Color.HSVToColor(channelsFloatArrayScaled);
    Log.i(TAG, "HAPPY PAPPY FAPPY" + androidColor);//check
    

    结果是 -1-1777216 交替像素,代表白色和黑色。

    所以一切都很好,除了我不知道 OpenCV 在将图像写入 sdcard 时在做什么(最后一个 imwrite)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-12
      • 2015-10-27
      相关资源
      最近更新 更多