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

Image Processing C program for hough circle!!


iex

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

 

Καλησπέρα σε όλους σας,

Αντιμετωπίζω πρόβλημα με το πως να εφαρμόσω τους μαθηματικούς τύπους και να λύσω την εξής άσκηση που σας παραθέτω. 

 

"Να δημιουργηθεί πρόγραμμα το οποίο θα δημιουργεί μια εικόνα, διαστάσεων 256x256 pixels η οποία θα αποτελείται από background  απόχρωσης 225 και θα περιέχει κύκλο,  μεταβλητής ακτίνας η οποία θα δίνεται από το πληκτρολόγιο, απόχρωσης 64. Το κέντρο του κύκλου θα βρίσκεται στο κέντρο της εικόνας."

 

Ενημερωτικά τις εικόνες που δημιουργώ τις τρέχω με το irfanview και ειναι της μορφής .raw

Επισυνάπτω και το αρχείο που είναι έτοιμη η δομή του αλλα χωρίς το συγκεκριμένο τμήμα.

(σπάω το κεφάλι μου εδώ και ώρες , ψάχνοντας και στο google αλλα δεν βρήκα κάτι μου να με καλύπτει. ) :shock:  :shock:  :shock:  :shock:  :shock:  :shock:  :shock: 

 

Σας ευχαριστώ όλους εκ των προτέρων. B)

testcode.txt

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

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

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

Στην if(?????) πρέπει να εκφράσεις το κριτήριο με το οποίο θα τεστάρεις εάν το τρέχων pixel ανήκει στον κύκλο ή όχι

Το κριτήριο αυτό είναι το: "Η απόσταση από κέντρο του κύκλου να είναι ίση με την ακτίνα" 

Την απόσταση θα την υπολογίσεις ώς εξής: SquareRoot((128 - ι)^2 + (128 - j)^2)
 

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

Στην if(?????) πρέπει να εκφράσεις το κριτήριο με το οποίο θα τεστάρεις εάν το τρέχων pixel ανήκει στον κύκλο ή όχι

 

Το κριτήριο αυτό είναι το: "Η απόσταση από κέντρο του κύκλου να είναι ίση με την ακτίνα" 

 

Την απόσταση θα την υπολογίσεις ώς εξής: SquareRoot((128 - ι)^2 + (128 - j)^2)

 

Σε ευχαριστώ , αλλά δεν μου τρέχει .. δεν βγάζει καν αρχείο εξόδου.. ίσως να χρειάζεται κάτι ακόμη;;  :wacko:

 

Στην if(?????) πρέπει να εκφράσεις το κριτήριο με το οποίο θα τεστάρεις εάν το τρέχων pixel ανήκει στον κύκλο ή όχι

 

Το κριτήριο αυτό είναι το: "Η απόσταση από κέντρο του κύκλου να είναι ίση με την ακτίνα" 

 

Την απόσταση θα την υπολογίσεις ώς εξής: SquareRoot((128 - ι)^2 + (128 - j)^2)

 

Επίσης την ακτίνα R που θα την βάλω..?? εννοώ πως κάπου πρέπει να υπάρχει για να της δίνω τιμή..

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

Ευχαριστώ πολύ για την απάντηση, το σχήμα και οι επεξηγήσεις είναι άψογες!!
Θα το δοκιμάσω αν όχι τώρα (γιατί είμαι αυπνος 30 ώρες) σίγουρα αύριο !! :-D  :-D  :-D

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

Δημοσ. (επεξεργασμένο)

Μια μικρή υλοποίηση του πρώτου τρόπου (μου είναι πιο οικείος) σε C..

 

// Draw circle to RAW file
#include <stdio.h>
#include <string.h>
#include <math.h>

#define WIDTH  	256
#define HEIGHT  256
#define CENTRE 	128
#define RADIUS	100
#define BKGRND	225	/* background */
#define	FRGRND	 65	/* foreground */

int main(void)
{
	FILE *f = NULL;

	if(!(f = fopen("TEST.RAW", "wb")))
		perror("fopen");
	else
	{
		const double maxAngle = M_PI * 2;

		double angle;

		unsigned char cImage[HEIGHT][WIDTH];

		memset(&cImage, BKGRND, sizeof(cImage));

                /* Draw circle */
		for(angle = 0.0; angle < maxAngle; angle += 0.01)
		{
			const int y = (RADIUS * sin(angle)) + CENTRE,
				  x = (RADIUS * cos(angle)) + CENTRE;

			cImage[y][x] = FRGRND;
		}

		/* Dump array to disk.. */
		if(fwrite(cImage, sizeof(unsigned char), WIDTH * HEIGHT, f) != WIDTH * HEIGHT)
			perror("fwrite");

		fclose(f);
	}

	puts("Press Enter to exit..");
	getchar();

	return 0;
}

post-41640-0-49010600-1364754293_thumb.png

Υ.Γ.

Το πρόγραμμα έχει δοκιμασθεί σε C++ Builder και μπορεί να περιέχει bugs ή άλλες αβλεψίες..

 

 

Επεξ/σία από Directx
  • Like 2
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

 

Μια μικρή υλοποίηση του πρώτου τρόπου (μου είναι πιο οικείος) σε C..

 

 

// Draw circle to RAW file
#include <stdio.h>
#include <string.h>
#include <math.h>

#define WIDTH  	256
#define HEIGHT  256
#define CENTRE 	128
#define RADIUS	100
#define BKGRND	225	/* background */
#define	FRGRND	 65	/* foreground */

int main(void)
{
	FILE *f = NULL;

	if(!(f = fopen("TEST.RAW", "wb")))
		perror("fopen");
	else
	{
		const double maxAngle = M_PI * 2;

		double angle;

		unsigned char cImage[HEIGHT][WIDTH];

		memset(&cImage, BKGRND, sizeof(cImage));

                /* Draw circle */
		for(angle = 0.0; angle < maxAngle; angle += 0.01)
		{
			const int y = (RADIUS * sin(angle)) + CENTRE,
				  x = (RADIUS * cos(angle)) + CENTRE;

			cImage[y][x] = FRGRND;
		}

		/* Dump array to disk.. */
		if(fwrite(cImage, sizeof(unsigned char), WIDTH * HEIGHT, f) != WIDTH * HEIGHT)
			perror("fwrite");

		fclose(f);
	}

	puts("Press Enter to exit..");
	getchar();

	return 0;
}

attachicon.gifrawcircle.png

Υ.Γ.

Το πρόγραμμα έχει δοκιμασθεί σε C++ Builder και μπορεί να περιέχει bugs ή άλλες αβλεψίες..

 

Ωραίος φίλε , θα του κάνω 2 αλλαγές για να το φέρω στα μέτρα μου... ( να γεμίζει τον κύκλο με χρώμα και να μπορώ να του δώσω εγώ την ακτίνα..  :-D  Thnx Directx

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

 

Μια μικρή υλοποίηση του πρώτου τρόπου (μου είναι πιο οικείος) σε C..

 

 

// Draw circle to RAW file
#include <stdio.h>
#include <string.h>
#include <math.h>

#define WIDTH  	256
#define HEIGHT  256
#define CENTRE 	128
#define RADIUS	100
#define BKGRND	225	/* background */
#define	FRGRND	 65	/* foreground */

int main(void)
{
	FILE *f = NULL;

	if(!(f = fopen("TEST.RAW", "wb")))
		perror("fopen");
	else
	{
		const double maxAngle = M_PI * 2;

		double angle;

		unsigned char cImage[HEIGHT][WIDTH];

		memset(&cImage, BKGRND, sizeof(cImage));

                /* Draw circle */
		for(angle = 0.0; angle < maxAngle; angle += 0.01)
		{
			const int y = (RADIUS * sin(angle)) + CENTRE,
				  x = (RADIUS * cos(angle)) + CENTRE;

			cImage[y][x] = FRGRND;
		}

		/* Dump array to disk.. */
		if(fwrite(cImage, sizeof(unsigned char), WIDTH * HEIGHT, f) != WIDTH * HEIGHT)
			perror("fwrite");

		fclose(f);
	}

	puts("Press Enter to exit..");
	getchar();

	return 0;
}

attachicon.gifrawcircle.png

Υ.Γ.

Το πρόγραμμα έχει δοκιμασθεί σε C++ Builder και μπορεί να περιέχει bugs ή άλλες αβλεψίες..

 

Μπράβο φίλε μου που ασχολήθηκες, αλλά όλα στη main; Πολύ κακή προγραμματιστική συνήθεια ακόμα και για το πιο απλό πρόγραμμα!

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

Μπράβο φίλε μου που ασχολήθηκες, αλλά όλα στη main; Πολύ κακή προγραμματιστική συνήθεια ακόμα και για το πιο απλό πρόγραμμα!

Όταν πρόκειται για κάτι τόσο απλό επέτρεψε μου να διαφωνήσω μαζί σου.
  • Like 2
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Όταν πρόκειται για κάτι τόσο απλό επέτρεψε μου να διαφωνήσω μαζί σου.

Επίτρεψέ μου να διαφωνήσω και εγώ. Αξίζει να κάνεις ακόμα και μια σειρά κώδικα συνάρτηση, αν αυτό κάνει πιο ευανάγνωστο τον κώδικά σου. ;)

 

Τέτοια και άλλα αντίστοιχα θέματα πραγματεύεται το εξαιρετικό βιβλίο Refactoring του Fowler. Θα σου αλλάξει τον τρόπο που προγραμματίζεις! Στόχος -μεταξύ άλλων- είναι τα προγράμματα να είναι τόσο ευανάγνωστα που να μη χρειάζονται comments!

 

Φιλικά πάντα!

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

 

Μια μικρή υλοποίηση του πρώτου τρόπου (μου είναι πιο οικείος) σε C..

 

 

// Draw circle to RAW file
#include <stdio.h>
#include <string.h>
#include <math.h>

#define WIDTH  	256
#define HEIGHT  256
#define CENTRE 	128
#define RADIUS	100
#define BKGRND	225	/* background */
#define	FRGRND	 65	/* foreground */

int main(void)
{
	FILE *f = NULL;

	if(!(f = fopen("TEST.RAW", "wb")))
		perror("fopen");
	else
	{
		const double maxAngle = M_PI * 2;

		double angle;

		unsigned char cImage[HEIGHT][WIDTH];

		memset(&cImage, BKGRND, sizeof(cImage));

                /* Draw circle */
		for(angle = 0.0; angle < maxAngle; angle += 0.01)
		{
			const int y = (RADIUS * sin(angle)) + CENTRE,
				  x = (RADIUS * cos(angle)) + CENTRE;

			cImage[y][x] = FRGRND;
		}

		/* Dump array to disk.. */
		if(fwrite(cImage, sizeof(unsigned char), WIDTH * HEIGHT, f) != WIDTH * HEIGHT)
			perror("fwrite");

		fclose(f);
	}

	puts("Press Enter to exit..");
	getchar();

	return 0;
}

attachicon.gifrawcircle.png

Υ.Γ.

Το πρόγραμμα έχει δοκιμασθεί σε C++ Builder και μπορεί να περιέχει bugs ή άλλες αβλεψίες..

 

 

Μπορείς να το κάνεις και πιο γρήγορο αν  εκμεταλλευτεις τη συμμετρία του κύκλου.

 

Για παράδειγμα μπορείς να πάρεις  τα x,y από το πρώτο ογδοημόριο και να βρεις τα υπόλοιπα :

 

(x, -y) , (-x,y) , (y , x) , ( -x , -y ) , ( -y,-x ) , (-y, x) , ( y,-x)

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

Επίτρεψέ μου να διαφωνήσω και εγώ. Αξίζει να κάνεις ακόμα και μια σειρά κώδικα συνάρτηση, αν αυτό κάνει πιο ευανάγνωστο τον κώδικά σου. ;)

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

 

Καλή συνέχεια!!

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

Προφανώς δεν θα κατάλαβα καλά αλλά ο κώδικας που θέλεις να κάνει ο DirectX refactor σε συναρτήσεις είναι ο κώδικας των 49 γραμμών (με 3 γραμμές σχολίων και 12 κενές) του spoiler ?

 

Αν ναι, συμφωνώ και εγώ μαζί του εκτός αν το refactor είναι στο πλαίσιο της πρωταπριλιάς :)

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

To να γράψεις ένα πρόγραμμα που να καταλαβαίνει ο υπολογιστής είναι εύκολο, το θέμα είναι να το γράψεις έτσι ώστε να το καταλαβαίνουν εύκολα οι άνθρωποι! Μπορεί να κάτσω κάποια στιγμή να το κάνω refactor αν θέλετε πάντως! Είναι καλή συνήθεια.

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

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

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

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

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

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

Σύνδεση

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

Συνδεθείτε τώρα
  • Δημιουργία νέου...