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

Image Processing C program for hough circle!!


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

Δημοσ.

 

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

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

 

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

 

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

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

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

 

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

testcode.txt

Δημοσ.

Στην 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 αν θέλετε πάντως! Είναι καλή συνήθεια.

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

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

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

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

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

Σύνδεση

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

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

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