PDA

View Full Version : [C] Elaborazione immagini .pgm


Starise
06-05-2005, 11:25
Ciao a tutti,
mi trovo a dover realizzare un programma in C, che consente id leggere un file formato PGM in ASCII, memorizzandolo in un array 2D, e da qui, calcolare il negativo dell'immagine (l'immagine è in B/N), e, assegnate le coordinate di un pixel 'q' e una soglia 's', calcolare la componente connessa dell'immagine a cui appartiene 'q', avendo fissato l’insieme:
V = {p(i, j) : p(i, j) - q < s}
come insieme dei valori di grigio che consentono di definire la 4-adiacenza, e memorizzare il risultato in una immagine digitale binaria in cui i pixel di C hanno valore 1 ed i rimanenti hanno valore 0.

Sinceramente, non so molto bene da dove iniziare... e vorrei che mi deste dei consigli per realizzare questo programma!
Allego l'immagine .pgm

ciao a tutti

Starise
06-11-2005, 11:37
emergo questo topic, perchè ho ritrovato questo problema facendo pulizia tra le mie cose! Cavolo... sapete che non ci sono mai riuscito!? :D :D

Qu@ker
06-11-2005, 14:38
Ecco un po' di codice: e' C++ perche' era piu' comodo per me, e mi sono fermato al negativo dell'immagine per lasciarti un po' di spazio. :Prrr:

#include <fstream>
#include <vector>
#include <string>

using namespace std;

class PGM
{
int w, h, max, size;
vector<int> data;
public:
PGM(const char *filename);
void salva(const char *filename);
void negativo(void) {
for (int i = 0; i < size; ++i)
data[i] = max - data[i];
}
};

PGM::PGM(const char *filename)
{
ifstream in(filename);
string sign;

in >> sign >> w >> h >> max;
size = w*h;
data.reserve(size);
for (int i = 0; i < size; ++i)
in >> data[i];
}

void PGM::salva(const char *filename)
{
ofstream out(filename);

out << "P2" << endl;
out << w << " " << h << endl;
out << max << endl;
for (int i = 0; i < h; ++i) {
for (int j = 0; j < w; ++j)
out << data[i * w + j] << " ";
out << endl;
}
}

int main(void)
{
PGM pgm("Rice.pgm");
pgm.negativo();
pgm.salva("Negativo.pgm");
}

Nota che non ho fatto nessun controllo di errore (per mantenere il listato corto, eh...).

Starise
09-11-2005, 09:13
si, ho visto.. grazie tante! :D
mo me lo converto in C... ;)