【问题标题】:Weird color dots on image after converting RGB to HSV and HSV to RGB将 RGB 转换为 HSV 和 HSV 转换为 RGB 后图像上出现奇怪的色点
【发布时间】:2017-06-12 01:18:36
【问题描述】:

大家早上好。我正在尝试编写可以在 RGB 和 HSV 之间转换的类。下面是我将 RGB 转换为 HSV 和 HSV 转换为 RGB 的代码。我尝试将 RGB 转换为 HSV,然后将 HSV 转换为 RGB,然后打印图像。看起来可行,但我的图像上有色点。我想知道是否有人可以帮助解释这种现象。

public class RGBtoHSV {
private float normR, normG, normB, Cmax, Cmin, delta;
private float hue, saturation, value;
private int R, G, B;
int numP;
public RGBtoHSV(int R, int G, int B){
    this.R=R; this.G=G; this.B=B;
    normR = R/255; normG = G/255; normB = B/255;
    Cmax = Math.max(R, Math.max(G, B));
    Cmin = Math.min(R, Math.min(G, B));
    delta = Cmax - Cmin;
    calcHue();
    calcSaturation();
    calcValue();
}
public void calcHue(){
    if(delta == 0 ){
        hue = 0;
    }else if((Cmax == R)){
        hue = 60 * ((G-B)/delta);
    }else if(G  == Cmax){
        hue = 60 * (((B-R)/delta)+2);
    }else{
        hue = 60f * (((R-G)/delta)+4f);
    }
}
public void calcSaturation(){
    if(Cmax == 0)
        saturation = 0;
    else
        saturation = delta/Cmax;
}   
public void calcValue(){
    value = Cmax/255;
}

//getters
public float[] getHSV(){
    float[] HSV = new float[3]; 
    HSV[0] = hue;
    HSV[1] = saturation;
    HSV[2] = value;
    return HSV;
}
}

将 HSV 转换为 RGB 的代码

public class HSVtoRGB {
int R, G, B;
float C, X, m;
float normR, normG, normB;
public HSVtoRGB(float H, float S, float V){
    C = S *V;
    X = C * (1 - Math.abs((H/60)%2 -1));
    m = V - C;

    if(H < 60){
        normR=C; normG=X; normB=0;
    }else if(H<120){
        normR=X; normG=C; normB=0;
    }else if(H <180){
        normR=0; normG=C; normB=X;
    }else if(H<240){
        normR=0; normG=X; normB=C;
    }else if(H<300){
        normR=X;normG=0;normG=C;
    }else{
        normR=C;normG=0;normG=X;
    }
    R = Math.round((normR+m)*255);
    G = Math.round((normG+m)*255);
    B = Math.round((normB+m)*255);
}
public int[] getRGB(){
    int [] RGB = new int[3];
    RGB[0] = R;
    RGB[1] = G;
    RGB[2] = B;
    return RGB;
}

Original Image

Image after Conversion

提前致谢!!

【问题讨论】:

    标签: eclipse image-processing rgb hsv


    【解决方案1】:

    我没有查看您的代码,但我确信我知道是什么导致了问题:在您的代码中的某处,值被包装(例如,从“全白”之外)到另一端缩放(例如,接近“全黑”的某个地方),通常是因为使用了一个太小的变量来保存临时值。

    例如,如果你有一个有符号字节变量,并用它来存储乘以16*9(144,大于+127的最大值)的结果一个有符号字节),您的有符号字节值将是 -16 - 这将产生“意外”的结果。

    编辑

    查看您的代码后,我怀疑您的部分问题是混合整数和浮点算术:例如,您使用 60 的某些地方和您使用 60f 的其他地方,我认为这意味着您想要浮点数计算中的点数。 (我只是猜测,因为您没有指定您正在使用的语言。)您需要在所有的计算中使用浮点数。

    【讨论】:

    • 我正在使用 Java eclipse
    • 所以...您正在使用 Java 进行编程,使用 Eclipse 作为 IDE 来编辑您的代码...(我认为它看起来像 Java 代码..)跨度>
    猜你喜欢
    • 2010-12-14
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多