kolor pixela (r,g,b) zaczytywany z obrazu

0

Jak w temacie jestem kompletnym newbie. Program ma za zadanie przejsc pixel za pixelem (kazdy w linii i co 10 wiersz) obrazek i zwrocic do pliku ilosc czerwieni, niebieskiego i zielonego. Problem w tym, ze sam sie nie konczy (nie wiem co jest z petla nie tak) a jesli cos zwraca to jest to zawsze 255 (brak jakichkolwiek zmian, a obrazek bialy nie jest). Pisze to w processing ale utknalem na tym:

PrintWriter output;

void setup()

{
 output = createWriter("positions.txt");     //writedown tool enter
  size(251,201);                             // screen size setup
  PImage img = loadImage("sharp.jpg");       // implementing image Sketch->Add File
  image(img,0,0);                            // placeing the img on the screen
  loadPixels();                              // work on pixels
  println(width);                    // chcek total number of pixels width
}

 void draw() {
  for(int i=0; i < width; i++)   {           // go pxel by pixel in row
   for(int j=0; j < pixels.length/width; j=j+10)      // each ten row
  {
    float r=red(pixels[i]);                  // read the red value from each chceked pixel
    float b=blue(pixels[i]);                 // read the blue value from each chceked pixel
    float g=green(pixels[i]);                // read the green value from each chceked pixel
   
    color black=color(0, 0, 0);
    set(i, j, black);                        // checking positions with black color - OK

  output.println(r + "," + g + "," + b);     // write down the value of red
}
}

}

void keyPressed() {
  output.flush();  // Writes the remaining data to the file
  output.close();  // Finishes the file
  exit();  // Stops the program
}
1

Wskaż mi proszę palcem miejsce w kodzie, w którym zliczasz te ilości.

0
vonski napisał(a):

float r=red(pixels[i]); // read the red value from each chceked pixel
float b=blue(pixels[i]); // read the blue value from each chceked pixel
float g=green(pixels[i]); // read the green value from each chceked pixel

Tutaj zbieram wartosci do pamieci (jesli oczywiscie poprawnie to zrozumialem)

vonski napisał(a):

output.println(r + "," + g + "," + b); // write down the value of red

A tu maja one byc zapisane do pliku.

1

ok, ale nadal to nie jest zliczanie.
odczytujesz kolor
Zapisujesz do pliku

a gdzie zliczanie?

0

Program nie ma zliczac totalnie - do pliku ma byc zwrocona ilosc r,g,b w danym pixelu. Czyli w pliku txt powinienm dostac 5721 rekordow (21 wier x 251 pix) z iloscia czerwonego, zielonego i niebieskiego w kazdym z tych pixeli.

0

"zwrocona ilosc"

po raz trzeci bedzie to samo pytanie

gdzie zliczasz ta ilosc?

1

Wydaje mi się, że pętle powinny być inne:

int startSegment = 0;
while(startSegment + width < pixels.length){
    for(int offset=0;offset<width;offset++){
        float r = red(pixels[startSegment + offset]);
        ...
    }
    startSegment+=9*width;
}
0

Dzieki za dotychczasowa pomoc, mimo problemu z tym co znaczy "zliczac" a ""zaczytywac". Tak, faktycznie chodzilo mi o skladowe RGB. Troche jeszcze kod pozmienialem i dziala pieknie. |Chcialem jednak wejsc w to glebiej tak, aby mi zapisywal wyniki w formie tabeli (najlepiej zeby dalo rade ja do csv eksportowac, choc to juz raczej wyzsza szkola jazdy). Tabela mialaby wygladac tak:

rowIndex0; redValue0, greenValue0, blueValue0; redValue1, greenValue1, blueValue1;...
rowIndex1; redValue0, greenValue0, blueValue0; redValue1, greenValue1, blueValue1;...

Srednikami dla jasnosci oddzielilem kolejne wysokosci wierszy oraz kolejne pixele, ktore program sprawdza.
Utknalem na ArrayIndexOutOfBOundsException i to dla 0. Dlaczego nie moge odwolac sie do elementu 0,0? r,g,b to float - da rade je zapisac do tabeli bez zmiany an int? Dla tak wielowymiarowej tabeli (moze jako kompletny newbie przesadzilem zbytnio) zapis jest poprawny? Oto kod:

PrintWriter output;
Table Tabela;
void setup()

{
 output = createWriter("positions.txt");     //writedown tool enter
 Tabela=new Table();
  size(251,201);                             // screen size setup
  PImage img = loadImage("sharp.jpg");       // implementing image Sketch->Add File
  image(img,0,0);                            // placeing the img on the screen
  loadPixels();                              // work on pixels

  for(int s=0; s < pixels.length; s=s+9*width)    // go through selected rows of pixels with intervals of 10 rows (0 to 0+9width)
  {
    for(int j=0; j < width; j++)               // go through each pixel in selected row
    {
    float r=red(pixels[s+j]);                  // read the red value from each chceked pixel
    float b=blue(pixels[s+j]);                 // read the blue value from each chceked pixel
    float g=green(pixels[j+s]);                // read the green value from each checked pixel
 
   int [][][][] tabela=new int [s][j+1][j][j];         // declare table
       for(int i=0; i<tabela.length;i++)       // go through the whole length of table 
       {
         for(int z=0;z<tabela[i].length;z++)
       {
         int R=(int)r;
         int G=(int)g;
         int B=(int)b;
         tabela[i][z][z][z]=tabela[s][R][G][B];   // should write s;R;G;B
       
       println("tabela[%d][%d]=%d \n", i, z, z,z, tabela[i][z][z][z]);  
       } 
       }
   
   output.println(s + " , "+ j +" , "+ r + " , " + g + " , " + b);  //write the data down to the file (selected data)
   
   color black = color(0, 0, 0);                              // checking, set a black color
   pixels[j+s]=black;                                         // checking, change the color of current pixel
   
  println(s + " , "+ j +" ; "+ r + " , " + g + " , " + b);    // print the read data
   
    }
    
    output.flush();
   // saveTable(Tabela,"data/tabela.csv");
    updatePixels();                                // set changes
  }
}
void keyPressed()
{
output.flush();  // Writes the remaining data to the file
 output.close();  // Finishes the file
  exit();  // Stops the program
}

  
0
for(int s=0; s < pixels.length; s=s+9*width)    // go through selected rows of pixels with intervals of 10 rows (0 to 0+9width)
{
    for(int j=0; j < width; j++)               // go through each pixel in selected row
    {
       float r = red(pixels[s+j]);                  // read the red value from each chceked pixel
       float b = blue(pixels[s+j]);                 // read the blue value from each chceked pixel
       float g = green(pixels[j+s]);                // read the green value from each checked pixel
 
       int [][][][] tabela = new int [s][j+1][j][j];         // declare table

Dla j=0 lub s=0 utworzona w ostatnim wierszu tablica,nie zawiera żadnego elementu, zatem każdy zestaw indeksów wychodzi poza tablicę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1