Avatar billede plugin- Nybegynder
23. april 2006 - 13:49 Der er 4 kommentarer og
1 løsning

Raster returnere forkert værdi?

Hej eksperter

Jeg sidder og rodder med en java opgave, hvor jeg skal lave convolution på et farvebillede. Det virker da også ok indtil videre bortset fra at min raster hentes forkerte værdier som resultere i at billedet bliver mørkere og mørkere hver gang jeg bruger min convolution kode. Min kode ser ud som følger:

//Method which performs convolution using a mean-kernel
    public static void ConvMean(BufferedImage image)
    {
       
        //kernel size
        int m = 3; //horz
        int n = 3;//vert
       
        //creating kernel-array and assigning values
        double[][] kernel = new double[m][n];
       
        for(int i = 0; i < m; i++)
        {
            for(int j = 0; j < n; j++)
            {
                kernel[i][j] = (1.0 / 9.0); //normalized value in kernel
            }
        }
       
        //m2 and n2 contain the distances from the center to the edge of the kernel(half-kernel).
        int m2 = (m - 1) / 2;
        int n2 = (n - 1) / 2;
       
        WritableRaster raster = image.getRaster();
       
        for(int x = 0; x < image.getWidth(); x++)
        {
            for(int y = 0; y < image.getHeight(); y++)
            {
               
                int sum_r = 0; //setting red pixelvalue to start from
                int sum_g = 0; //setting green pixelvalue to start from
                int sum_b = 0; //setting blue pixelvalue to start from
               
                //System.out.println("x: "+x+" y: "+y);
               
                //check if pixel is a border pixel
                if(x - m2 < 0 || y - n2 < 0 || x + m2 > image.getWidth()-1 || y + n2 > image.getHeight()-1)
                {
                    raster.setSample(x,y,0,raster.getSample(x, y, 0));
                    raster.setSample(x,y,1,raster.getSample(x, y, 1));
                    raster.setSample(x,y,2,raster.getSample(x, y, 2));
                }
                else
                {
                    for(int i = -m2; i <= m2; i++)
                    {
                        for(int j = -n2; j <= n2; j++)
                        {
                            if(i == -m2)
                            {
                                System.out.println(raster.getSample(x + i, y + j, 0));
                            }
                           
                            sum_r += kernel[i+m2][j+n2] * raster.getSample(x - i, y - j, 0);
                            sum_g += kernel[i+m2][j+n2] * raster.getSample(x - i, y - j, 1);
                            sum_b += kernel[i+m2][j+n2] * raster.getSample(x - i, y - j, 2);
                        }
                    }
                   
                    raster.setSample(x,y,0,Math.round(sum_r));
                    raster.setSample(x,y,1,Math.round(sum_g));
                    raster.setSample(x,y,2,Math.round(sum_b));
                }
               
                //System.out.println(sum_r);
               
               
            }
        }
       
        image.setData(raster);
    }

Som I kan se så udskriver jeg denne værdi:

if(i == -m2)
                            {
                                System.out.println(raster.getSample(x + i, y + j, 0));
                            }

og ved at ændre 0'et til henholdsvis 1 og 2 kan jeg se at kanalerne her returnere en forkert værdi når min kernel er sat til -m2 (-1) og det kan jeg slet ikke få til at hænge sammen... pixelværdier er vel pixelværdier!! :( Er der nogen som har et godt bud på hvorfor mine billeder bliver mørkere og mørkere hver gang jeg bruger denne metode?
Avatar billede soreno Praktikant
23. april 2006 - 19:42 #1
Jeg har et spørgsmål (Jeg ved ikke noget om convolution, men lidt til filtre):

Hvad skal kernel maticen bruges til - det er jo bare en konstat der ganges på hver gang (1/9) ?
Avatar billede plugin- Nybegynder
26. april 2006 - 16:55 #2
Det er en mean kernel... den tager et gennemsnit af de (3x3) pixelværdier og sætter den pågældende pixel til denne værdi... altså bliver hele billedet blured.
Avatar billede rolchau Nybegynder
27. april 2006 - 14:45 #3
Du bruger en double værdi til kernel som så vidt muligt giver en samlet værdi på 1, så det burde virke, faktisk lidt over 1 endda, så det skulle ikke gøre billedet mørkere. Så jeg kan ikke umiddelbart se hvorfor det sker andet end at hvis du skiftede int sum_x ud til double så gør den det ikke, så det må være i afrundingen mellem int og double at fejlen ligger.
Avatar billede plugin- Nybegynder
27. april 2006 - 15:35 #4
Det var da utroligt at jeg ikke har prøvet det!! rolchau du er et geni! sum_r, sum_g, sum_b lavet om til double istedet for int også virker det... hold da op... så mange timer pga. det! MANGE TAK! Smid et svar rolchau!!
Avatar billede rolchau Nybegynder
27. april 2006 - 15:51 #5
Det var så lidt ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester