0

I was wondering if when you call color.HSBtoRGB if the hue value would be entered as a range of 0-255, 0-1, 0-360? I am inquiring because I am trying to convert an edge angle to a color but it is only giving me blue or purple? can anyone explain what I am doing?

public void sobelGrey(){
    this.greyScale();
    double edgex;
    double edgey;
    Picture pi = new Picture(this.getWidth(), this.getHeight());
    Picture tou = new Picture(this.getWidth(), this.getHeight());
    Pixel[][] Y = pi.getPixels2D();
    Pixel[][] X = tou.getPixels2D();
    Pixel[][] h = this.getPixels2D();
    for (int y = 1; y< X.length-1; y++){
        for(int x= 1; x<X[1].length-1; x++){
            edgex =
                    h[y-1][x-1].getRed() * -1 +
                            h[y][x-1].getRed()  * -2+
                            h[y+1][x-1].getRed()  * -1+
                            h[y-1][x+1].getRed() * 1 +
                            h[y][x+1].getRed()  * 2+
                            h[y+1][x+1].getRed()  * 1;
            Y[y][x].setRed((int)Math.abs(edgex/2));
            Y[y][x].setGreen((int)Math.abs(edgex/2));
            Y[y][x].setBlue((int)Math.abs(edgex/2));
        }
    }

    for (int y = 1; y< X.length-1; y++){
        for(int x= 1; x<X[1].length-1; x++){
            edgex =
                    h[y-1][x-1].getRed() * -1 +
                            h[y-1][x].getRed()  * -2+
                            h[y-1][x+1].getRed()  * -1+
                            h[y+1][x-1].getRed() * 1 +
                            h[y+1][x].getRed()  * 2+
                            h[y+1][x+1].getRed()  * 1;
            X[y][x].setRed((int)Math.abs(edgex/2));
            X[y][x].setGreen((int)Math.abs(edgex/2));
            X[y][x].setBlue((int)Math.abs(edgex/2));
        }
    }

    for (int y = 1; y< X.length-1; y++){
        for(int x= 1; x<X[1].length-1; x++){
            int x1 = (int) Math.sqrt(Math.pow(X[y][x].getRed(), 2) + Math.pow(X[y][x].getGreen(), 2) + Math.pow(X[y][x].getBlue(), 2));
            int y1 = (int) Math.sqrt(Math.pow(Y[y][x].getRed(), 2) + Math.pow(Y[y][x].getGreen(), 2) + Math.pow(Y[y][x].getBlue(), 2));
            int hr = (int) (200/(2*Math.PI)*(Math.tanh(y1/ (x1+.000000000000001))));

            int rgb = Color.HSBtoRGB(hr/255, hr, (int) Math.sqrt(Math.pow(x1, 2) + Math.pow(y1, 2)));
            Color fixed = new Color(rgb&0xFF*7/10, (rgb>>8)&0xFF*80/255/10, (rgb>>16)&0xFF*4/10);
            if( !(Math.sqrt(Math.pow(x1, 2) + Math.pow(y1, 2))< 40))
            h[y][x].setColor(fixed);
            else
                h[y][x].setColor(Color.black);
        }
    }
    pi.explore();
    tou.explore();
    explore();
}

i am using a computer science AP image processing from Eimacs, and using the swan

1 Answers1

0

You declared hr (and the other variables) to be an int. Then in Color.HSBtoRGB(hr/255, ... you divide an int by an int. For all values of hr below 255, the result will be 0.

Probably it is sufficient to divide by 255.0 to force a floating point division.

Rainer Schwarze
  • 4,462
  • 1
  • 24
  • 42