Newsgroup: it.comp.lang.c
Titolo: lettura di files (immagini)

Ciao a tutti,
sono agli inizi della programmazione con C++, ma il mio
problema credo che riguardi si C++ che C.
Devo analizzare delle immagini,
quindi apro il file, poi con un ciclo di get metto il contenuto in un array
e dovrebbe essere pronto per essere analizzato. So che al'inizio c'e' un
header di un formato specificato, ma non m'interessa, io leggo direttamente
i punti. Il problema é che apparentemente se l'immagine é troppo scura, il
programma non riesce a leggerla. Cioé se l'immagine non funziona, basta che
con un qualsiasi editor la apra, ne aumenti la luminosità, la richiuda, e
dopo non ci sono piu' problemi.
Qualcuno ha un'idea? Grazie comunque
Andrea
--------------------------------
Inviato via 
http://usenet.iol.it

 Qualcuno ha un'idea? Grazie comunque
Suggerimento valido soltanto sotto le seguenti
IPOTESI:
1. Il formato dell'immagine e di tipo bitmap (hai già i pixel)
2. L'immagine è a 256 livelli di grigio
ALGORTIMO:
1. determina il valore minimo e massimo dell'intensità dei pixel,
chiamiamoli m1 e m2 rispettivamente.
2. calcola la dinamica: d = m2-m1
3. egualizzazione della luminosità e del contrasto:
    ogni pixel avrà una nuova luminosità l2 ottenuta dalla vecchia l1
mediante la seguente formula:
    l2=((l1-m1)*255)/d
Stai sicuro che anche una radiografia "piatta" adesso è molto più leggibile!
Se le condizioni in cui ti trovi non soddisfano le tue ipotesi allora le
cose si complicano un pochino, ma a tutto c'è rimedio.
johnpp

Ciao Johnpp,
grazie del suggerimento, quello che mi dici di fare in pratica e' di
riscalare tutti i valori di luminosita' per rendere massimo il contrasto. In
effetti avevo gia' usato una formula simile per rendere i miei dati piu'
leggibili (si tratta di seguire l'evoluzione di alcuni oggetti, sono in un
laboratorio di fisica...). Ma il problema sembra essere anteriore a questo.
In effetti se l'immagine e' troppo scura, e' come se il get non riuscisce a
leggerla bene. Comunque oggi provero' a riguardarlo cosi' potro' essere piu'
preciso. Le immagini sono bmp a 256 colori e l'header ho visto che e' di
1078 byte, mi sembra, comunque me lo sono segnato dopo aver fatto un po' di
prove con delle immagini campione. Ciao
Aliaselia
--------------------------------
Inviato via 
http://usenet.libero.it
 

Dunque ho ridotto il programma solo alla lettura del file con la solita
istruzione fgetc. Mentre legge per trasferire il tutto in un array, un
contatore segna il numero di punti letti. Quello che ho trovato e' che a
seconda di quanto e' scura l'immagine, il programma crede che il file sia
finito e si ferma. Ho preso un'immagine e all'inizio lui leggeva 101408
punti (oltre l'header). La solita immagine l'ho schiarita molto e ha letto
tutti i punti, mentre scurendola abbastanza si ferma quasi subito. Io ho
messo un ciclo for che dovrebbe terminare quando trova eof. Ma sembra che
per lui il momento in cui trova questa istruzione vari in funzione di quanto
e' scura l'immagine. Questo non riesco proprio a capirlo!!!


 quanto e' scura l'immagine. Questo non riesco proprio a capirlo!!!
Posta il pezzo di codice del ciclo, cosi` vediamo se il problema e` li`;
deve esserci per forza un errore da qualche parte, e` un comportamento
troppo strano.
-- 
 Ciao, Bianco.
 Reply to luca.bianco (at) 
tiscali.it

 prove con delle immagini campione. Ciao
Può essere che la legga ma non la visualizzi perché nella visualizzazione
hai meno colori, così se i colori sono scuri mentre li visualizzi li
approssima con il nero; questo se la lettura difettosa ti dà un'immagine
nera; non capisco cosa voglia dire per non funziona; comunque in questo caso
la correzione dell'amico te la schiarisce e allora vuol dire che devi
mettere una modalità schermo più alta; oppure forse cambia la dimensione
dell'header, vedi su 
www.wotsit.org
 /.com o simili per info su formati di
file; inoltre in fase di debug vedrai che non legge il codice del nero ma il
codice di un colore vicino(che non significa un codice quasi zero, non per
forza almeno!). Ciao


Secondo me, quando l'immagine e' molto scura, uno ho piu' pixel hanno un'
intensita' che corrisponde al codice di fine file, o qualcosa del genere,
interrompendo quindi la lettura.
Dovresti leggere il file utilizzando read() o qualcosa di simile, leggendo
in blocco tutti i pixel dell' immagine.
Spero di essere stato di aiuto.


 nera; non capisco cosa voglia dire per non funziona;
Non credo che sia questo il problema: il programma non visualizza
l'immagine, legge solo un byte alla volta e lo mette in memoria. Le immagini
che non funzionano sono quelle per cui la lettura si arresta prima della
fine dell'immagine. Comunque sono andato nel sito dei formati ed ho trovato
una frase piuttosto "strana" : "However, segment boundaries can appear
anywhere in the bitmap"! Questo potrebbe forse spiegare perche' ad un certo
punto si arresta, perche' trova la fine di un segmento? Cerchero' di fare
come mi e' stato suggerito e leggere tutto il file in una volta con read.
In ogni caso vi posto il pezzo di programma incriminato:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <io.h>
#include <string.h>
#include <windows.h>
#include <math.h>
#define HEADER_SIZE 1078 //image files header size, bytes
	unsigned char I1[442368],flheader;
	int i;
	FILE *fin;
 void main ()
 {
 	if ((fin = fopen("c:\\romuald\\image\\S6a100.bmp","r"))!=NULL)
	{
		 fseek( fin,HEADER_SIZE,SEEK_SET);
		 for (i=1;!feof(fin);i++)
	 		I1[i]=fgetc(fin);
		printf("\npunti totali: %d\n",i);
	}
	else
		printf("\nFile non trovato");
