【问题标题】:Are my channel separation calculations correct?我的通道分离计算是否正确?
【发布时间】:2017-02-23 20:11:23
【问题描述】:

我有一张 HSV 图像,我对图像的某个区域感兴趣。我已经开始选择图像并确定我感兴趣的区域,但我认为我分离频道的方式不正确。我的通道值不接近它们的实际值。我正在查看的图像部分是 RGB 比例的白色。我知道在 HSV 中,白色的饱和度约为 (0..20) 和值 (230..255),但程序打印出的数字并未接近该范围。我得到 S 的高 40 低 50 和 -93 主要是 V。我的通道计算是否正确?

public void splitChannels() {

    Mat firstImage = Imgcodecs.imread("firstImage.jpg");
    int width = 20;
    int height = 20;
    Rect roi = new Rect(120, 160, width, height);
    Mat smallImg = new Mat(firstImage, roi);
    int channels = smallImg.channels();
    System.out.println("small pixels:" + smallImg.total());
    System.out.println("channels:" + smallImg.channels());
    int totalBytes = (int)(smallImg.total() * smallImg.channels());
    byte buff[] = new byte[totalBytes];
    smallImg.get(0, 0, buff);

    for (int i=0; i< height; i++) {
        // stride is the number of bytes in a row of smallImg
        int stride = channels * width;
        for (int j=0; j<stride; j+=channels) {
        //I don't know if these channels calculations are correct.
            int h = buff[(i * stride) + j];
            int s = buff[(i * stride) + j + 1]; 
            int v = buff[(i * stride) + j + 2];

            // Do something with the hsv.
            System.out.println("s: "+ s + " v: " + v);

        } 
    }
}

这是我的图片:

感兴趣的区域是中心的左上角贴纸,不过它们都是白色的。

它为此程序打印出来的 HSV 是:

h: 99 s: 78 v: 57
h: 97 s: 76 v: 55
h: 101 s: 77 v: 57
h: 101 s: 77 v: 57
h: 103 s: 79 v: 59
h: 103 s: 79 v: 59
h: 103 s: 79 v: 59
h: 102 s: 78 v: 58
h: 100 s: 76 v: 58
h: 99 s: 75 v: 57
h: 98 s: 74 v: 56
h: 98 s: 74 v: 56
h: 98 s: 74 v: 54
h: 99 s: 75 v: 55

【问题讨论】:

  • 可以分享图片吗?
  • 更新我的问题我会添加他们@RossPresser
  • 了解代码中发生的情况的一个好方法是创建一个恒定(已知)HSV 值的图像,并在您的算法上进行尝试。
  • 好的,我刚刚尝试了一张白色图像,值在h: 122 s: 63 v: 67@DaveS 左右
  • 据我所知,这并不接近白色图像的正确 HSV 值。白色应该在该范围内有一个Saturation(0..20) and Value(230..255)。 @DaveS这就是为什么我想知道我的计算是否错误地获得了这些值。

标签: java opencv hsv


【解决方案1】:

您似乎获得了正确的值,但它们是来自原始字节的 RGB 强度。它们出现 -1 -1 -1 因为 Java 字节数据类型是 8 位长,但它是有符号数据类型,而不是无符号数据。

您需要将这些值从 RGB 转换为 HSV。试试这个: 这是转换定义的链接:

RGBtoHSB:

将默认 RGB 模型指定的颜色分量转换为一组等效的色相、饱和度和亮度值,它们是 HSB 模型的三个分量。

public static float[] RGBtoHSB(int r,
                           int g,
                           int b,
                           float[] hsbvals)

用法:

int r = ...
int g = ... 
int b = ...
float[] hsbvals = new float[3];
Color.RGBtoHSB(r,g,b,hsbvals)

【讨论】:

  • 可行,但我可以像拥有 RGB 一样获得单独的 HSV 通道吗?
  • 您在返回的浮点数组中拥有每个组件 hsv, hsv[0], hsvt[1], hsv[2]
  • 那么白应该是这个? H: 0.0 S: -0.0 V -0.003921569
  • 好吧,当我用谷歌搜索它时,虽然白色的 HSV 是 H 的 60 度和 S 的 0 度和价值的 100 度。
  • 我相信我得到了正确的值,只是我必须了解它们是如何表示的,我知道这是可行的,但是 HSV(0°,0%,100%) 与此相同。 H: 0.0 S: -0.0 V: -0.003921569
猜你喜欢
  • 2011-10-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 2011-10-19
  • 2014-12-26
  • 1970-01-01
  • 2017-12-04
相关资源
最近更新 更多