Προς το περιεχόμενο

Smooth image με averaging


zn2709

Προτεινόμενες αναρτήσεις

Βασικά δε κατάλαβα γιατί έχεις κάνει όλες αυτές τις πράξεις... έχω χάσει και κάμποσα μηνύματα, θα ρίξω μια ματιά στα προηγούμενα να καταλάβω τη λογική πίσω από το κώδικά σου και θα προσπαθήσω να σου απαντήσω.

 

τις πράξεις αυτές τις έκανα γιατί μου τις είπε ο computeras13..σ'ευχαριστώ πολύ φίλε! να σαι καλά! μου χει κάψει το μυαλό η συγκεκριμένη..και επίσης, το μόνο που είπε ο καθηγητής όταν απάντησε στο mail ήταν οτι το θεωρεί το πιο δύσκολο κομμάτι της εργασίας και αν το λύσεις πας για άριστα..:) να σαι καλά που με βοηθάς! :)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 95
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Συχνή συμμετοχή στο θέμα

Δημοσιευμένες Εικόνες

Υπ' όψην οτι οι διαιρέσεις μέσα στο index του πίνακα πρέπει να είναι ακέραιες για να δουλέψει. Αλλιώς θα σου πετάει σφάλμα.

 

@x_maras στην ουσία είναι μια πράξη για να παίρνεις τις τιμές από έναν πίνακα ανά 9 σε ένα τετράγωνο 3x3 και να τις αποθηκεύεις σε έναν άλλον μονοδιάστατο με index του 3x3 τετραγώνου. Δες την παρακάτω εικόνα. Τα χρώματα δείχνουν το που θα πάει κάθε 3x3 τετράγωνο στον μονοδιάστατο πίνακα.

 

post-127657-0-37962200-1337030569_thumb.png

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ναι όντως αύτο είδα και γω. Δεν έχω εμπειρία σε image processing. Έχω κάνει μόνο ένα μάθημα και χρησιμοποιούσαμε black&white και grayscale images.

Καταλαβαίνω τη λογική του παραδείγματός σου, αλλά σε περίπτωση που οι διαστάσεις του πίνακα δεν είναι πολλαπλάσια του 3 τι θα πρέπει να κάνει; Στο black&white θυμάμαι ότι βάζαμε μηδενικά και στο τέλος τα κάναμε crop.

 

>
<?php
$image = imagecreatefrompng("image.png");

list($width, $height, $type, $attr) = getimagesize("image.png");

$tempMatrix = array();
$tempHeight = $height+2;
$tempWidth = $width+2;

for($x = 0; $x < $tempHeight; $x++)
{
	for($y = 0; $y < $tempWidth; $y++)
	{
		if($x == 0 || $y == 0)
		{
			$tempMatrix[$x][$y] = 0;
		}
		elseif($x == $tempHeight-1 || $y == $tempWidth-1)
		{
			$tempMatrix[$x][$y] = 0;
		}
		else
		{
			$tempMatrix[$x][$y] = imagecolorat($image,$x,$y);
		}
	}
}

$blurryImage = array();

for($x = 1; $x <= $height; $x++)
{
	for($y = 1; $y <= $width; $y++)
	{
		$meanPoint = 0;
		for($i = $x-1; $i<= $x+1; $i++)
		{
			for($j = $y-1; $j<= $y+1; $j++)
			{
				$meanPoint += $tempMatrix[$i][$j];
			}
		}
		$blurryImage[$x][$y] = $meanPoint/9;
	}
}
?>

 

Φυσικά ο πίνακας θα περιέχει και float... δε γίνεται όλοι οι αριθμοί να διαιρούνται με το 9 :P

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ο πίνακας εννοείται πως θα έχει τιμές float (αν και καλό είναι να τις κάνεις στρογγυλοποίηση γιατί το χρώμα καθορίζεται από ακέραιο αριθμό και όχι float). Εγώ αναφερόμουν στις τιμές των indexes. Εκεί πρέπει να είναι απαραίτητα ακέραιες οι διαιρέσεις. Δεν μπορείς να πας στο index 4.2 πχ.

 

Image processing και εγώ ελάχιστα έχω κάνει, αλλά δες το σαν ένα πρόβλημα ελαχιστοποίησης. Θες να πάρεις έναν μεγάλο πίνακα και να τον κάνεις άθροισμα ανά 3x3 σε έναν μικρότερο.

 

Τώρα αν οι διαστάσεις δεν είναι πολλαπλάσια του 3 εξαρτάται το πως θέλει να το κάνει να δουλέψει. Τώρα που το σκέφτομαι, δεν είμαι σίγουρος και αν ο αλγόριθμος που του έδωσα είναι σωστός. Εφόσον θέλει να βρει την μέση τιμή ενός pixel μέσω της γειτονιάς του, θα καταλήξει πάλι λογικά σε μια εικόνα με τις ίδιες διαστάσεις με την αρχική. Απλά τα χρώματα θα είναι λίγο αλλαγμένα.

 

Στην ουσία πρέπει να κάνει το εξής:

>
for(pixelx = 0; pixelx < image_width; pixelx++)
{
 for(pixely = 0; pixely < image_height; pixely++)
 {
   int cells = 1;
   boolean is_left_edge  = pixelx == 0;
   boolean is_right_edge = pixelx == image_width;
   boolean is_top_edge = pixely == 0;
   boolean is_down_edge = pixely == image_height;

   result[pixelx ][pixely] = getcolor(image, pixelx, pixely);

   if(!is_left_edge) // Το κελί Δ
   {
     result[pixelx ][pixely] = getcolor(image, pixelx - 1, pixely);
     cells++;
   }

   if(!is_right_edge) // Το κελί Α
   {
     result[pixelx ][pixely] = getcolor(image, pixelx + 1, pixely);
     cells++;
   }

   if(!is_top_edge) 
   {
     result[pixelx ][pixely] += getcolor(image, pixelx, pixely - 1); // Το κελί Β 
     cells++;
     if(!is_left_edge)
     {
       result[pixelx ][pixely] += getcolor(image, pixelx - 1, pixely - 1); // Το κελί ΒΔ
       cells++;
     }
     if(!is_right_edge)
     {
       result[pixelx ][pixely] += getcolor(image, pixelx + 1, pixely - 1); // Το κελί ΒΑ
       cells++;
     }
   }


   if(!is_bottom_edge) 
   {
     result[pixelx ][pixely] += getcolor(image, pixelx, pixely + 1); // Το κελί N 
     cells++;
     if(!is_left_edge)
     {
       result[pixelx ][pixely] += getcolor(image, pixelx - 1, pixely + 1); // Το κελί NΔ
       cells++;
     }
     if(!is_right_edge)
     {
       result[pixelx ][pixely] += getcolor(image, pixelx + 1, pixely + 1); // Το κελί NΑ
       cells++;
     }
   }

   result[pixelx ][pixely] = result[pixelx ][pixely] / cells;  
 } // end for loop
} // end for loop

 

Το παραπάνω είναι η σωστή λύση του προβλήματος. Βέβαια είναι η πιο απλή λύση που μπορεί να γίνει. Το έχω γράψει έτσι ώστε να λαμβάνει υπ' όψην τα άκρα της εικόνας. Οπότε δουλεύει για οτιδήποτε διαστάσεις και να είναι η εικόνα.

 

Συγγνώμην zn2709 για τις αρχικές λάθος πληροφορίες. Είχα μπερδέψει εγώ το τι ακριβώς θέλεις να κάνεις.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

καταρχήν ευχαριστώ πάρα πολύ και τους δυο! :-)

φίλε computeras13 χρησιμοποιώντας την λύση σου και αλλάζοντας κατάλληλα τις μεταβλητές κλπ..τρέχω το πρόγραμμα

>for($pixelx = 0; $pixelx < $width; $pixelx++)
{
 for($pixely = 0 ; $pixely < $height; $pixely++)
 {
   $cells = 1;
   $is_left_edge  = 1;

   $is_right_edge = $width;

   $is_top_edge = 1;

   $is_down_edge = $height;


$result[$pixelx ][$pixely] = imagecolorat($im, $pixelx, $pixely);
	
   if(!$is_left_edge) // Το κελί Δ
   {
     $result[$pixelx ][$pixely] = imagecolorat($im, $pixelx - 1, $pixely);
     $cells++;
   }

   if(!$is_right_edge) // Το κελί Α
   {
     $result[$pixelx ][$pixely] = imagecolorat($im, $pixelx + 1, $pixely);
     $cells++;
   }

   if(!$is_top_edge) 
   {
     $result[$pixelx ][$pixely] += imagecolorat($im, $pixelx, $pixely - 1); // Το κελί Β 
     $cells++;
     if(!$is_left_edge)
     {
       $result[$pixelx ][$pixely] += imagecolorat($im, $pixelx - 1, $pixely - 1); // Το κελί ΒΔ
       $cells++;
     }
     if(!$is_right_edge)
     {
       $result[$pixelx ][$pixely] += imagecolorat($im, $pixelx + 1, $pixely - 1); // Το κελί ΒΑ
       $cells++;
     }
   }

if(!$is_down_edge) 
   {
     $result[$pixelx ][$pixely] += imagecolorat($im, $pixelx, $pixely + 1); // Το κελί N 
     $cells++;
     if(!$is_left_edge)
     {
       $result[$pixelx ][$pixely] += imagecolorat($im, $pixelx - 1, $pixely + 1); // Το κελί NΔ
       $cells++;
     }
     if(!$is_right_edge)
     {
       $result[$pixelx ][$pixely] += imagecolorat($im, $pixelx + 1, $pixely + 1); // Το κελί NΑ
       $cells++;
     }
   }

   $result[$pixelx ][$pixely] = $result[$pixelx ][$pixely] / $cells;  
 } 
} 
var_dump($result);

και τα αποτελέσματα είναι float και μ βγάζει τα εξής:

Notice: imagecolorat() [function.imagecolorat]: 162,81 is out of bounds in C:\xampp\htdocs\sat1.php on line 74

 

Notice: imagecolorat() [function.imagecolorat]: 161,81 is out of bounds in C:\xampp\htdocs\sat1.php on line 79

 

Notice: imagecolorat() [function.imagecolorat]: 162,80 is out of bounds in C:\xampp\htdocs\sat1.php on line 91

 

Notice: Undefined variable: is_bottom_edge in C:\xampp\htdocs\sat1.php on line 105

 

Notice: imagecolorat() [function.imagecolorat]: 162,82 is out of bounds in C:\xampp\htdocs\sat1.php on line 107

 

Notice: imagecolorat() [function.imagecolorat]: 161,82 is out of bounds in C:\xampp\htdocs\sat1.php on line 111

 

αυτό το is out of bounds σκέφτηκα μήπως λύνεται με στρογγυλοποίηση του πίνακα αλλά δεν τα κατάφερα..άλλαξα και τις αρχικές τιμές που παίρνουν τα pixelx και pixely απο 0 σε 1 μήπως φταίνε τα αρχικά όρια αλλά το αποτέλεσμα δεν αλλάζει..

 

Τώρα δεν παίρνω σφάλματα αλλά με το var_dump που έβαλα μου δίνει τα εξής: array(162) { [0]=> array(81) { [0]=> int(11920925) [1]=> int(11920925) [2]=> int(11920925) [3]=> int(11920925) [4]=> int(11920925) [5]=> int(11986716) [6]=> int(12052252) [7]=> int(12052252) [8]=> int(11986716) [9]=> int(11920925) [10]=> int(11920925) [11]=> int(12117788) [12]=> int(12905240) [13]=> int(8639533) [14]=> int(2798666) [15]=> int(3323719) [16]=> int(7523891) [17]=> int(10608419) [18]=> int(12445978) [19]=> int(12052252) [20]=> int(12314651) [21]=> int(11855389) [22]=> int(7523890) [23]=> int(5751611) [24]=> int(10017574) [25]=> int(12642842) [26]=> int(11986461) [27]=> int(11920925) [28]=> int(11920925) [29]=> int(11920925) [30]=> int(11920925) [31]=> int(11920925) [32]=> int(11724318) [33]=> int(11920925) [34]=> int(14544141) [35]=> int(16773888) [36]=> int(16773888) [37]=> int(16773632) [38]=> int(16773632) [39]=> int(16773632) [40]=> int(16773632) [41]=> int(16773632) [42]=> int(16773632) [43]=> int(16773632) [44]=> int(16773888) [45]=> int(16773888) [46]=> int(15855109) [47]=> int(12574486) [48]=> int(6932019) [49]=> int(2142541) [50]=> int(895827) [51]=> int(7391281) [52]=> int(16314370) [53]=> int(16774912) [54]=> int(16773888) [55]=> int(16775424) [56]=> int(13033748) [57]=> int(3913796) [58]=> int(764500) [59]=> int(2273612) [60]=> int(2273612) [61]=> int(2273612) [62]=> int(2273612) [63]=> int(2273612) [64]=> int(2273612) [65]=> int(2273612) [66]=> int(2273612) [67]=> int(2273612) [68]=> int(2273612) [69]=> int(2273612) [70]=> int(2273612) [71]=> int(2273612) [72]=> int(2273612) [73]=> int(2273612) [74]=> int(2273612) [75]=> int(2273612) [76]=> int(2273612) [77]=> int(2273612) [78]=> int(2273612) [79]=> int(2273612) [80]=> int(2273612) } [1]=> array(81) { [0]=> int(11920925) [1]=> int(11920925) [2]=> int(11920925) [3]=> int(12314651) [4]=> int(11592735) [5]=> int(9295914) [6]=> int(7720754) [7]=> int(7917617) [8]=> int(9820711) [9]=> int(11986461) [10]=> int(12183324) [11]=> int(12052252) [12]=> int(12511514) [13]=> int(9689640) [14]=> int(6145594) [15]=> int(8573997) [16]=> int(12511770) [17]=> int(12445978) [18]=> int(11986461) [19]=> int(12052252) [20]=> int(9886247) [21]=> int(6670391) [22]=> int(2207821) [23]=> int(2339148) [24]=> int(9033259) [25]=> int(13036567) [26]=> int(12052252) [27]=> int(11920925) [28]=> int(11920925) [29]=> int(11855389) [30]=> int(11920925) [31]=> int(11986460) [32]=> int(13298196) [33]=> int(15003146) [34]=> int(16249091) [35]=> int(16773632) [36]=> int(16773632) [37]=> int(16773632) [38]=> int(16773632) [39]=> int(16773632) [40]=>

 

Δεν μπορώ να καταλάβω αν είναι λογικό ή σωστό όμως.:-/

μέσα στο array $result υπάρχουν ακέραιοι και ο αλγόριθμος δεν έχει σφάλματα.είμαι σε καλό δρόμο ή μπα? :-/

 

 

ΥΓ. επίσης έχω αλλάξει τις τιμές στην αρχή :

$cells = 1;

$is_left_edge = 1;

 

$is_right_edge = $width;

 

$is_top_edge = 1;

 

$is_down_edge = $height;

 

Σωστή αλλαγή ή κάνει λάθος συνέχεια?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Η αλλαγή σου είναι λάθος. Θέλεις οι μεταβλητές is_*_edge να εκφράζουν μια σχέση αληθείας. Γι' αυτό και τις είχα δηλώσει boolean. Οπότε για πχ το is_left_edge θέλεις να δεις αν το τρέχον pixelx είναι ίσο με το 0, δηλαδή pixelx == 0.

 

Ο σκοπός αυτών των ελέγχων είναι για να μπορείς να υπολογίσεις τα pixel που βρίσκονται στις άκρες της εικόνας και η "γειτονιά" τους είναι μικρότερη.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Η αλλαγή σου είναι λάθος. Θέλεις οι μεταβλητές is_*_edge να εκφράζουν μια σχέση αληθείας. Γι' αυτό και τις είχα δηλώσει boolean. Οπότε για πχ το is_left_edge θέλεις να δεις αν το τρέχον pixelx είναι ίσο με το 0, δηλαδή pixelx == 0.

 

Ο σκοπός αυτών των ελέγχων είναι για να μπορείς να υπολογίσεις τα pixel που βρίσκονται στις άκρες της εικόνας και η "γειτονιά" τους είναι μικρότερη.

 

 

Δηλαδή πχ:

>is_left_edge == 0;

??

όχι ε?

και μήπως αυτός ο έλεγχος αληθείας πρέπει να πάει σε κάθε if? η πάλι χαζομάρα είπα?

 

αν βάλω αυτά στην αρχή:

>
$cells = 1;

$is_left_edge  = $pixelx == 0;

$is_right_edge = $pixelx ==$width;

$is_top_edge = $pixely == 0;

$is_down_edge = $pixely == $height;

 

παίρνω σαν μήνυμα λάθους αυτό:

Notice: imagecolorat() [function.imagecolorat]: 0,81 is out of bounds in C:\xampp\htdocs\sat1.php on line 106

 

Notice: imagecolorat() [function.imagecolorat]: 1,81 is out of bounds in C:\xampp\htdocs\sat1.php on line 115

 

Notice: imagecolorat() [function.imagecolorat]: 1,81 is out of bounds in C:\xampp\htdocs\sat1.php on line 106

 

Notice: imagecolorat() [function.imagecolorat]: 0,81 is out of bounds in C:\xampp\htdocs\sat1.php on line 110

 

Notice: imagecolorat() [function.imagecolorat]: 2,81 is out of bounds in C:\xampp\htdocs\sat1.php on line 115

 

Notice: imagecolorat() [function.imagecolorat]: 2,81 is out of bounds in C:\xampp\htdocs\sat1.php on line 106

 

Notice: imagecolorat() [function.imagecolorat]: 1,81 is out of bounds in C:\xampp\htdocs\sat1.php on line 110

 

Notice: imagecolorat() [function.imagecolorat]: 3,81 is out of bounds in C:\xampp\htdocs\sat1.php on line 115

 

Notice: imagecolorat() [function.imagecolorat]: 3,81 is out of bounds in C:\xampp\htdocs\sat1.php on line 106

 

Notice: imagecolorat() [function.imagecolorat]: 2,81 is out of bounds in C:\xampp\htdocs\sat1.php on line 110

κοκ

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

όπως στο είχα εγώ στο προηγούμενο post.

>is_left_edge = pixelx == 0;

 

Ίσως να μην καταλαβαίνεις τι ακριβώς κάνει αυτή η γραμμή. Θα στο γράψω πιο αναλυτικά για να δεις σε τι ισοδυναμεί.

 

>
if(pixelx == 0)
 is_left_edge = TRUE;
else
 is_left_edge = FALSE;

 

Και τα δύο αυτά κομμάτια κώδικα κάνουν ακριβώς το ίδιο. Απλά το δεύτερο είναι πολύ περιφραστικό, μαζί με ότι αυτό συνεπάγεται (περισσότερος κώδικας και περισσότερες εντολές προς εκτέλεση - όχι αυτό σε ενδιαφέρει αυτή τη στιγμή).

 

Τα σφάλματα είναι πολύ περιέργα. Στην ουσία προσπαθεί να πάει σε pixel που δεν είναι ακέραιος αριθμός. Ποιες είναι ακριβώς οι γραμμές που σου χτυπάνε; Είναι μέσα από το κομμάτι που έχεις βάλει εδώ λογικά έτσι;

 

Αυτό το 0.81 δεν μπορώ να καταλάβω από που προέκυψε...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

@ zn2709

Δεν είμαι σίγουρος για το αν θα πρέπει να έχεις μόνο int... δε μου κάθετε καλά στη λογική ότι υπάρχει διαίρεση στις πράξεις και είναι πολύ πιθανό να έχεις δεκαδικούς.

Δεν έχω καθόλου εμπειρία με rgb και έχω ελάχιστη με image processing αλλά προσπάθησα να βοηθήσω αλγοριθμικά.

 

@computeras13

Επειδή φαίνεται ότι έχεις ασχοληθεί με visualization&graphics τι γνώμη έχεις για το παραπάνω. Λέω βλακείες σχετικά με τα float pixels?

 

 

υ.γ. πιστεύω για να μην έχεις πρόβλημα με τα οριακά pixel, το να κάνεις wrap την εικόνα με μηδενικά pixel και να τα κάνεις crop στο τέλος θα δουλέψει. Μπορεί να μην είναι efficient γιατί έχεις πολλά loops "Ο(Ν^x)" σε σχέση με τα O(1) ifs αλλά πιστεύω θα δουλέψει...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Στο RGP τα χρώματα είναι ακέραιοι μεταξύ 0 και 255. Οπότε δεν έχεις δεκαδικά. Άρα κάνεις στρογγυλοποίηση.

 

Άλλο το αποτέλεσμα της διαίρεσης όμως και άλλο το να έχεις float index για pixel. Εδώ έχει ένα 0.81 που ακολουθεί το index των pixel αν παρατηρήσεις, το οποίο δεν βλέπω από που προέρχεται.

 

 

ΥΓ: το wrapping είναι να ενώσεις τα δύο άκρα του πίνακα. Εσύ εννοείς να κάνει padding.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

wrapping εννοούσα να βάλεις μηδενικά γύρο από την εικόνα. Λογικά ονομάζεται padding όπως λες... δεν ήξερα το σωστό term :rolleyes:

 

Σχετικά με τα float δεν εννούσα float στο index αλλά στο value και φυσικά όπως λες κάνεις στρογγυλοποίηση μετά.

 

Όσο για το warning του den έχει float index, δεν είναι "0.81" αλλά σημείο (0, 81) γι αυτό πρότεινα τη λύση με τα μηδενικά.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

έχω καταμπερδευτεί!σας επισυνάπτω τα εξής για να μην σας κουράζω γιατί αυτό νιώθω :-/: αρχειο html, αρχείο php και την εικόνα. αν έχετε χρόνο τοποθετήστε τα μέσα στον φάκελο htdocs του xampp και τρέξτε το html με firefox.(αυτό κάνω εγώ)

ευχαριστώ πολύ και για τον χρόνο και για τις απαντήσεις σας πάντως, να 'στε καλα! :)

 

ΥΓ η εικόνα είναι αφηρημένη τέχνη :Ρ κάτι έπρεπε να δημιουργήσω για το παράδειγμα :P

sat.html

sat1.php

post-204822-0-79274900-1337080583_thumb.png

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ναι έχεις δίκιο. Πέρασα το κόμμα για τελεία. Η λύση που προτίνεις με τα μηδενικά όμως θα αλλιώσει το χρώμα. Σκέψου του ως εξής:

 

0 0 0

255 123 125

100 99 3

 

Ας πούμε ότι έχεις αυτά τα pixel όπου η δεύτερη σειρά είναι στην ουσία η πάνω άκρη της εικόνας και το κάνεις pad με μηδενικά (πρώτη σειρά). Αν πάρεις τα μηδενικά σαν κελιά και τα μετρήσεις και τα χρησιμοποιήσεις για την διαίρεση τότε θα πάρεις:

(0 + 0 + 0 + 255 + 123 + 125 + 100 + 99 + 3) / 9 = 78 (με στρογγυλοποίηση)

 

Ενώ κανονικά θα έπρέπει να βγάλεις την παρακάτω τιμή:

(255 + 123 + 125 + 100 + 99 + 3) / 6 = 118 (με στρογγυλοποίηση)

 

Όπως βλέπεις έχεις μεγάλη απόκλιση. Θα μπορούσες βέβαια να κάνεις έλεγχο για τα οριακά κελιά και να κάνεις σωστά τις διαιρέσεις κτλ. Αυτό όμως θα προσθέσει μόνο επιπλέον φόρτο στην λύση που έδωσα.

 

Τώρα το θέμα είναι γιατί του βγάζει οτι το pixel αυτό δεν ανοίκει στην εικόνα. Αν μπορούσε να μας δώσει τις διαστάσεις της εικόνας θα ήταν ακόμα καλύτερα για να ξέραμε τι ακριβώς παίζει.

 

ΥΓ: Με πρόλαβε.

 

EDIT

 

 

Μιας και δεν έχω xampp εγκατεστημένο και βαριέμαι απίστευτα να το κάνω τώρα, έχω μια υποψία για το τι παίζει. Η διαστάσεις της εικόνας είναι 162x81. Οπότε στο height η τιμή είναι 81 που σημαίνει οτι το index θα έχει τιμές [0,80]. Όταν όμως πάει να κάνει την boolean πράξη δεν γίνεται σωστά γιατί θα έπρεπε να είναι ως εξής:

 

 

>
is_right_edge = pixelx == width - 1
is_bottom_edge = pixely == height -1

 

Λογικά αν αλλάξεις αυτές τις δύο γραμμές θα είσαι οκ.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ναι έχεις δίκιο. Πέρασα το κόμμα για τελεία. Η λύση που προτίνεις με τα μηδενικά όμως θα αλλιώσει το χρώμα. Σκέψου του ως εξής:

 

0 0 0

255 123 125

100 99 3

 

Ας πούμε ότι έχεις αυτά τα pixel όπου η δεύτερη σειρά είναι στην ουσία η πάνω άκρη της εικόνας και το κάνεις pad με μηδενικά (πρώτη σειρά). Αν πάρεις τα μηδενικά σαν κελιά και τα μετρήσεις και τα χρησιμοποιήσεις για την διαίρεση τότε θα πάρεις:

(0 + 0 + 0 + 255 + 123 + 125 + 100 + 99 + 3) / 9 = 78 (με στρογγυλοποίηση)

 

Ενώ κανονικά θα έπρέπει να βγάλεις την παρακάτω τιμή:

(255 + 123 + 125 + 100 + 99 + 3) / 6 = 118 (με στρογγυλοποίηση)

 

Όπως βλέπεις έχεις μεγάλη απόκλιση. Θα μπορούσες βέβαια να κάνεις έλεγχο για τα οριακά κελιά και να κάνεις σωστά τις διαιρέσεις κτλ. Αυτό όμως θα προσθέσει μόνο επιπλέον φόρτο στην λύση που έδωσα.

 

Τώρα το θέμα είναι γιατί του βγάζει οτι το pixel αυτό δεν ανοίκει στην εικόνα. Αν μπορούσε να μας δώσει τις διαστάσεις της εικόνας θα ήταν ακόμα καλύτερα για να ξέραμε τι ακριβώς παίζει.

 

ΥΓ: Με πρόλαβε.

 

Πίστευα ότι στο averaging κάνει χρησιμοποιείς μια μάσκα 3x3 με τιμές 1/9

 

δηλαδή στο παράδειγμά μου θα είχαμε το εξής

(0/9 + 0/9 + 0/9 + 255/9 + 123/9 + 125/9 + 100/9 + 99/9 + 3/9)

 

στο δικό σου

(255/9 + 123/9 + 125/9 + 100/9 + 99/9 + 3/9)

 

που είναι ακριβώς το ίδιο

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...