Torna indietro   Hardware Upgrade Forum > Software > Programmazione

NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT
NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT
Nelle ultime settimane abbiamo provato tre delle proposte top di gamma di NZXT nelle categorie case, dissipatori e ventole. Rispettivamente, parliamo dell'H9 Flow RGB+, Kraken Elite 420 e F140X. Si tratta, chiaramente, di prodotti di fascia alta che si rivolgono agli utenti DIY che desiderano il massimo per la propria build. Tuttavia, mentre i primi due dispositivi mantengono questa direzione, le ventole purtroppo hanno mostrato qualche tallone d'Achille di troppo
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz
ASUS ROG Swift OLED PG34WCDN è il primo monitor gaming con pannello QD-OLED Gen 5 a layout RGB Stripe Pixel e 360 Hz su 34 pollici: lo abbiamo misurato con sonde colorimetriche e NVIDIA LDAT. Ecco tutti i dati
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico
Nothing Phone (4a) Pro cambia pelle: l'alluminio unibody sostituisce la trasparenza integrale, portando una solidità inedita. Sotto il cofano troviamo uno Snapdragon 7 Gen 4 che spinge forte, mentre il display è quasi da top dig amma. Con un teleobiettivo 3.5x e la Glyph Matrix evoluta, è la prova di maturità di Carl Pei. C'è qualche compromesso, ma a 499EUR la sostanza hardware e la sua unicità lo rendono un buon "flagship killer" in salsa 2026
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 13-03-2008, 11:31   #1
hopenthink
Junior Member
 
Iscritto dal: Mar 2008
Messaggi: 10
Pixel detection

Ciao a tutti!
Vi pongo una questione interessante:
Avendo un immagine in bianco e nero, con dei bordi bianchi, si vogliono tagliare i bordi bianchi e far sì che l'immagine rimanga senza i bordi bianchi.

L'immagine in questione è di forma quadrata e l'angolo superiore ed inferiore sinistro dell'immagine iniziano sempre con pixels neri.

Questo ci consentirebbe di dedurre la grandezza di un angolo per tagliare il superfluo bordo bianco, ma il problema rimane sempre l'individuazione dell'angolo in alto a sinistra e di quello in basso a sinistra:
se riuscissi ad individuare il primo pixels in alto a sinistra e l'ultimo in basso a sinistra, otterrei la distanza tra questi (l'angolo di un quadrato) e riuscirei poi a tagliare tutti i bordi circostanti sapendo da quali coordinate di origine partire per il taglio facendo un cropping.

:-? Voi che ne pensate? come posso riuscire ad individuare il primo pixel nero di un immagine?
Spero ci sia qualcuno in gamba in grado di darmi una risposta!
hopenthink è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2008, 12:24   #2
MEMon
Senior Member
 
Iscritto dal: Dec 2002
Messaggi: 3359
Posta l'immagine che fai prima.
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2008, 13:03   #3
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Con che formato immagine lavori? Che linguaggio?
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2008, 13:19   #4
hopenthink
Junior Member
 
Iscritto dal: Mar 2008
Messaggi: 10
Lavoro con jpg,o anche png che dovrebbe essere meglio per i pixels.

In pratica sto sviluppando un decoder in java per trattare simboli come quello allegato, e funziona per immagini standard cioè che ho prodotto io e di cui conosco le dimensioni del bordo, ma vorrei saper tagliare anche immagini che abbiano dimensione diversa da quella che riesco a creare io con il mio programma di creazione.

Il fatto è che non conosco come localizare (parlando in termini di pixel), le estremità dell'immagine così da poter tagliare i bordi bianchi. Notate che l'immagine ha sempre alcune estremità nere, e sono quelle che vedete in figura.
Immagini allegate
File Type: jpg ok.jpg (18.1 KB, 15 visite)
hopenthink è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2008, 13:29   #5
MEMon
Senior Member
 
Iscritto dal: Dec 2002
Messaggi: 3359
Te devi eliminare il bordo azzurro?
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2008, 13:38   #6
hopenthink
Junior Member
 
Iscritto dal: Mar 2008
Messaggi: 10
Esatto!
hopenthink è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2008, 13:41   #7
hopenthink
Junior Member
 
Iscritto dal: Mar 2008
Messaggi: 10
Devo eliminare il bordo azzurro, però supponendo di non sapere che ha grandezza 30 pixel come in questo caso, ma la grandezza del bordo può essere variabile.

A me è venuta in mente l'idea di localizzare gli angoli neri, ma non sò come, o meglio, forse con pixelgrubber, ma non riesco a far funzionare pixelgrubber.
hopenthink è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2008, 13:41   #8
MEMon
Senior Member
 
Iscritto dal: Dec 2002
Messaggi: 3359
Dovresti creare una bufferedimage e disegnarci sopra l'immagine, a quel punto con getRGB(int x,int y) ricavi il colore del pixel di coordinate (x,y)

Ultima modifica di MEMon : 13-03-2008 alle 13:44.
MEMon è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2008, 13:51   #9
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Puoi usare la classe BufferedImage: contiene molti metodi utili per lavorare ed editare immagini.

Poi se devi modificare il file finale o solo la sua rappresentazione a video lo sai tu.

Nel primo caso (modifica file) dovresti:
- creare una BufferedImage del tuo file da modificare;
- eidtare la BufferedImage;
- salvare la BufferedImage in un file (sovvrascrivendo quello di partenza);

Nel secondo caso:
- creare una BufferedImage del tuo file da visualizzare senza il bordo;
- editare la BufferedImage;
- mandare a video il contenuto della BufferedImage;

Qui javadoc per BufferdImage

Qui un articolo interessante di Chet Haase (consigliato!)


Infine, puoi scrivere in u file la tua BufferedImage grazie al metodo statico write() della classe javax.imageio.ImageIO.
Questo è l'esempio che ho trovato:
Codice:
  public static boolean write(RenderedImage im,
                              String formatName,
                              File output)
                       throws IOException

Here im is the RenderedImage to be written, formatName is the String containg 
the informal name of the format (e.g. png) and output is the file object to be 
written to. 
An example usage of the method for PNG file format is shown below:

  ImageIO.write(image, "png", file);

You can also use getReaderFormatNames method of the same class to learn 
available informal format names understood by the current set of registered 
readers.

Ciao

Ultima modifica di banryu79 : 13-03-2008 alle 14:00.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 14-03-2008, 11:15   #10
hopenthink
Junior Member
 
Iscritto dal: Mar 2008
Messaggi: 10
Grazie,
Ok, ci sono, per il momento ho bufferizzato l'immagine:

Codice:
	public class PixelDetection extends Canvas{
		
		BufferedImage bimage;
		String imageName;
		Image imgSelected;
		
		public static int width = 400;
		public static int height = 400;
	
		public PixelDetection(){
			acquisisciImmagine();
			
			}
		
		public void acquisisciImmagine(){
			
			// Acquisisco il nome dell'immagine da shell
			DataInputStream inputImageName = new DataInputStream(System.in);
			System.out.println("Scrivi il nome dell'immagine da bufferizare comprensiva di estensione: ");
			try{
				imageName = inputImageName.readLine();
			}catch(Exception e){}
			
			// Definisco l'immagine scelta:
			imgSelected = Toolkit.getDefaultToolkit().getImage(imageName);
						
			bufferizzaImmagineSelezionata(imgSelected);

		}
		
		public void bufferizzaImmagineSelezionata(Image image){
			
			// Creo una buffered image di tipo RGB
			bimage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
			
			// Creo un oggeto grafico che contiene il contenuto del buffer
	        Graphics g = bimage.createGraphics();
	    
	        // Copia l'immagine selezionata nel buffer
	        g.drawImage(image, 0, 0, null);
	        g.dispose();
	        							
			}	
		
		public void scanPixels(BufferedImage bimage){
			
			}

Ora mi rimane da scansionare i pixel, trovare l'inizio dell'immaigne, talgiarla e salvarla.
La bufferizzazione è corretta?
hopenthink è offline   Rispondi citando il messaggio o parte di esso
Old 14-03-2008, 12:11   #11
hopenthink
Junior Member
 
Iscritto dal: Mar 2008
Messaggi: 10
Mi correggo, forse è meglio se bafferizzassi in questo modo...
Codice:
// Acquisisco il nome dell'immagine da shell
DataInputStream inputImageName = new DataInputStream(System.in);
System.out.println("Scrivi il nome dell'immagine da bufferizzare comprensiva di estensione: ");
try{
	imageName = inputImageName.readLine();
}catch(Exception e){}
			
try{
	String fileName = imageName;
	File file = new File(fileName);
	bimage = ImageIO.read(file);
	}catch(Exception ex){}
Però rimane un problema. Se per esempio creassi un metodo:
Codice:
		public int getPixel(int x, int y) {	
			return bimage.getRGB(x, y);
		}
Come mai invocando una println
Codice:
System.out.println("PIXEL: "+getPixel(31,31));
mi ritorna un numero?? ES: -16514044
Cosa significa?
Devo codificarlo in qualche cosa??
hopenthink è offline   Rispondi citando il messaggio o parte di esso
Old 14-03-2008, 13:47   #12
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da hopenthink Guarda i messaggi
Come mai invocando una println
Codice:
System.out.println("PIXEL: "+getPixel(31,31));
mi ritorna un numero?? ES: -16514044
Cosa significa?
Devo codificarlo in qualche cosa??
Guarda qua:
Codice:
int argb = bufferedImage.getRGB(x, y); // ottiene il valore RGB del pixel
int alpha = (argb >> 24) & 0xff; // ottiene il componente Alpha
int red = (argb >> 16) & 0xff; // ottiene il componente Red
int green = (argb >> 8) & 0xff; // ottiene il componente Green
int blue = argb & 0xff; // ottiene il componente Blue
Ciao
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 14-03-2008, 14:30   #13
hopenthink
Junior Member
 
Iscritto dal: Mar 2008
Messaggi: 10
Ora mi è più chiaro, grazie!
hopenthink è offline   Rispondi citando il messaggio o parte di esso
Old 14-03-2008, 17:53   #14
hopenthink
Junior Member
 
Iscritto dal: Mar 2008
Messaggi: 10
Allora, intanto ti ringrazio, ma premetto che non conoscendo il valore del nero mi è difficile individuare il bianco.
Non so neanche come creare il nero, non riesco a trovare nulla riguardo la composizione dei colori nel modo che mi hai segnalato.
Comunque sò che il valore del bianco è -1, del nero -16514044 in numerico. Potrei trovarlo anche così ma non è efficace se l'immagine non è perfettamente in bianco e nero. Quindi non penso che la mia strada sia giusta.
Se sapessi la composizione del nero lo valuterei con il pixel in scansione..
Mi hai detto come fare il red, il green, il blue, potresti dirmi come fare il nero?
Purtroppo non basta fare nero = 0,0,0 non è così?
hopenthink è offline   Rispondi citando il messaggio o parte di esso
Old 14-03-2008, 18:39   #15
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Il bianco corrisponde ai valori massimi per tutte e tre le componenti (R,G,B).
Il nero è l'esatto opposto, corrisponde ai valori minimi (0 tutte e 3)

Se noti nell'esempio dell'ultimo post che ho pubblicato, alla fine ottieni dei valori
di tipo intero per ogni singola componente.

La scala di questi valori va da 0 a 255.

Quindi bianco = R255 G255 B255; nero = R0 G0 B0.

Se devi individuare il colore bianco, ma il tuo "bordo" non è perfettamente bianco allora dovrai stabilire te una "soglia";

Per esempio (ma vado a spanne, devi verificare a video il colore) puoi decidere di utilizzare una soglia che parte da valore 250 in su (max 255).

Se tutte e tre le componenti sono > del valore deciso, allora sei nella soglia.


@EDIT:
Giustamente tu stai cercando gli "estremi" dell'immagine caratterizzati da pixel neri.
(nero = R0 G0 B0)
Puoi stabilire una soglia tipo da 0 a 5 (vado sempre a spanne).
Con questa soglia ti cerchi gli estremi (primo pixel significativo in alto a sinistra, ultimo pixel significativo in basso a destra).

A quel punto, la tua immagine "pulita" è il subset di pixel compresi tra il primo e l'ultimo.

Ciao

Ultima modifica di banryu79 : 14-03-2008 alle 18:44.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 15-03-2008, 17:36   #16
hopenthink
Junior Member
 
Iscritto dal: Mar 2008
Messaggi: 10
Bene!
Grazie al tuo aiuto sono riuscito a trovare le coordinate del primo pixel nero dell'immagine.

Codice:
public void scanPixel(BufferedImage imgToScan){

w = imgToScan.getWidth();
h = imgToScan.getHeight();

int originX;
int originY;

int actualPixel;

boolean founded = false;

for(int row = 0; row < h; row++){		// Per ogni riga dell'immagine
if (founded == false){
for(int col = 0; col < w; col++){	// Controlla ciascun pixel che costituisce la riga

actualPixel = imgToScan.getRGB(col,row);

// Ottengo le componenti RGB del pixel scansionato:
//int alpha = (actualPixel >> 24) & 0xff; 	// ottiene il componente Alpha
int red   = (actualPixel >> 16) & 0xff; 	// ottiene il componente Red
int green = (actualPixel >> 8) & 0xff;  	// ottiene il componente Green
int blue =   actualPixel & 0xff; 		    // ottiene il componente Blue

//
// Verifica Soglia colori
//
boolean r = false;
boolean g = false;
boolean b = false;

int soglia = 1;
		
if((red == 0)||(red < soglia)){
	r = true;
	System.out.println("RED: " +red);
}
if((green == 0)||(green < soglia)){
	g = true;
	System.out.println("GREEN: " +green);
}
if((blue == 0)||(blue < soglia)){
	b = true;
	System.out.println("BLUE: " +blue);}

if(r == g == b == true){
	System.out.println("FOUND PIXEL AT "+col +" " +row);
	originX = col;	// Setto le coordinate di origine
	originY = row;
	founded = true;
	System.out.println("Ora posso tagliare l'immagine partendo dal punto x: "+originX +" y: " +originY);
	break;
	
	}
	


} //For interno
} else{ break; }	
} // For Esterno
}
Come ti pare?
hopenthink è offline   Rispondi citando il messaggio o parte di esso
Old 15-03-2008, 20:36   #17
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da hopenthink Guarda i messaggi
Come ti pare?
Mi pare che il primo pixel (quello in alto a sinistra) così lo trovi.
Trovi anche l'ultimo eseguendo la scansione iniziando dall'ultimo e iterando all'indietro.

Con questi due pixel (coppia di XY) dovresti essere in grado di completare il tuo task e ottenere l'immagine che desideravi.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abb...
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz ASUS ROG Swift OLED PG34WCDN recensione: il prim...
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico Recensione Nothing Phone (4a) Pro: finalmente in...
WoW: Midnight, Blizzard mette il primo, storico mattone per l'housing e molto altro WoW: Midnight, Blizzard mette il primo, storico ...
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato Ecovacs Goat O1200 LiDAR Pro: la prova del robot...
Il fondatore di Framework: il personal c...
JBL Live Flex 3 a 129€ su Amazon: ANC ad...
Come un uomo ha costruito un'azienda da ...
Multe fino a 400 euro anche se hai pagat...
Tapo lancia una valanga di offerte su Am...
Little Snitch su Linux: finalmente dispo...
John Deere accetta un accordo da 99 mili...
Gli astronauti di Artemis II osservano i...
OpenAI lancia ChatGPT Pro da 100 dollari...
Allarme rosso: CPU-Z e HWMonitor, segnal...
Arriva su Instagram la funzione per modi...
Le offerte del mondo Apple: iPhone 17 e ...
Italia sotto assedio: il settore governa...
Microsoft fa marcia indietro sull'IA: Co...
Windows 11 24H2 e 25H2: bug negli update...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 16:02.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v