<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mind Unpacked &#187; matrici convoluzione</title>
	<atom:link href="http://mindunpacked.com/tag/matrici-convoluzione/feed/" rel="self" type="application/rss+xml" />
	<link>http://mindunpacked.com</link>
	<description>informatica.elettronica.chimica.new stuff</description>
	<lastBuildDate>Tue, 22 Dec 2009 17:35:13 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<image>
<link>http://mindunpacked.com</link>
<url>http://mindunpacked.com/wp-content/plugins/maxblogpress-favicon/icons/favicon-2.ico</url>
<title>Mind Unpacked</title>
</image>
		<item>
		<title>Matrici e filtri di convoluzione</title>
		<link>http://mindunpacked.com/2009/matrici-e-filtri-di-convoluzione/</link>
		<comments>http://mindunpacked.com/2009/matrici-e-filtri-di-convoluzione/#comments</comments>
		<pubDate>Sat, 10 Jan 2009 17:23:34 +0000</pubDate>
		<dc:creator>Francesco</dc:creator>
				<category><![CDATA[Informatica]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[filtri convoluzione]]></category>
		<category><![CDATA[image processing]]></category>
		<category><![CDATA[matrici convoluzione]]></category>

		<guid isPermaLink="false">http://mindunpacked.com/?p=310</guid>
		<description><![CDATA[Per matrice di convoluzione si intende una matrice che viene applicata ad un&#8217;immagine per ottenere una seconda immagine con caratteristiche particolari. I filtri di convoluzione sono appunto quei filtri, presenti in quasi tutti i programmi di grafica, che modificano l&#8217;immagine imprimendogli alcuni effetti come per esempio la sfocatura (blur), una maggiore definizione (sharpen), etc&#8230; quasi [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Per <strong>matrice di convoluzion</strong>e si intende una matrice che viene applicata ad un&#8217;immagine per ottenere una seconda immagine con caratteristiche particolari. I <strong>filtri di convoluzione</strong> sono appunto quei filtri, presenti in quasi tutti i programmi di grafica, che modificano l&#8217;immagine imprimendogli alcuni effetti come per esempio la sfocatura (blur), una maggiore definizione (sharpen), etc&#8230; quasi tutti questi filtri fanno uso di matrici di convoluzione, e vedremo come creare un semplice programma in C++ che, data un&#8217;immagine in input ed una matrice di convoluzione produca l&#8217;immagine di output.</p>
<p style="text-align: justify"><span id="more-310"></span> Sebbene le matrici di convoluzione, chiamate anche &#8220;<strong>kerne</strong><strong>l</strong>&#8220;, possano essere di qualsiasi dimensione, le piu&#8217; usate sono quelle 5&#215;5 e <strong>3x</strong><strong>3</strong>. In questo articolo prenderemo in considerazione solo le seconde, che sono sufficienti a creare una grande varieta&#8217; di effetti. La matrice va applicata separatamente ad ogni canale dell&#8217;immagine (R, G, B) nel seguente modo. Supponiamo di operare esclusivamente sul canale R, visto che le operazioni sono analoghe agli altri canali, e di avere pixel con i valori indicati nella matrice a sinistra a cui vogliamo applicare la matrice di convoluzione presente a destra:</p>
<table style="text-align: center;" border="0">
<tbody>
<tr>
<td>
<table style="text-align: center;" border="0">
<tbody>
<tr>
<td>255</td>
<td>180</td>
<td>100</td>
</tr>
<tr>
<td>125</td>
<td><span style="color: #ff0000;">175</span></td>
<td>150</td>
</tr>
<tr>
<td>0</td>
<td>123</td>
<td>20</td>
</tr>
</tbody>
</table>
</td>
<td>
<table border="0">
<tbody>
<tr>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>0</td>
<td>1</td>
<td>0</td>
</tr>
<tr>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<p>Il pixel evidenziato in rosso e&#8217; quello su cui stiamo lavorando in questo momento, mentre la matrice a destra e&#8217; il nostro kernel. Per applicare il filtro di convoluzione sul pixel dobbiamo immaginare di sovrapporre l&#8217;elemento centrale della matrice kernel con il pixel che stiamo considerando e di fare la somma di tutti i prodotti degli elementi sovrapposti. In poche parole dobbiamo moltiplicare gli elementi corrispondenti tra le due matrici e sommare tutti i risultati. Notate che non stiamo effettuando una normale moltiplicazione tra matrici (cioe&#8217; un prodotto riga per colonna)!</p>
<p style="text-align: justify">Nel nostro caso il calcolo e&#8217;:</p>
<p style="text-align: justify">255*0 + 180*0 + 100*0 + 125*0 + 175*1 + 150*0 + 0*0 + 123*0 + 20*0 == 175</p>
<p style="text-align: justify">La matrice di convoluzione che abbiamo scelto, potrebbe essere paragonata alla matrice identita&#8217; nel caso di un prodotto tra matrici. Come la matrice identita&#8217; non cambia il risultato, cosi&#8217; questa matrice  fornisce come risultato lo stesso pixel e quindi l&#8217;immagine di output rimane invariata. Ovviamente questo e&#8217; un caso particolare, e alla fine dell&#8217;articolo vedremo alcuni degli effetti prodotti da altre matrici particolari.</p>
<p style="text-align: justify">Comunque, quando la matrice di convoluzione viene applicata a tutti i pixel dell&#8217;immagine il lavoro e&#8217; terminato ed abbiamo ottenuto la nostra immagine modificata. Vediamo alcune parti del codice in C++ che trovate allegato alla fine dell&#8217;articolo. Ah, il codice fa uso, come al solito, delle librerie EasyBMP per la gestione delle BMP.</p>
<pre class="brush: cpp;">int mat[DIM][DIM];

typedef struct pixel {
	int red, green, blue;
};
</pre>
<p><center><script type="text/javascript">
heyos_ad_user = 11334;
heyos_ad_type = "G";
heyos_ad_format = "1";
heyos_color_border = "23292b";
heyos_color_bg = "23292b";
heyos_color_link = "FFFFFF";
heyos_color_text = "21b8ca";
heyos_color_url = "21b8ca";
</script>
<script type="text/javascript" src="http://admaster.heyos.com/core/bnr.js"></script></center></p>
<p style="text-align: justify">Creiamo una matrice DIMxDIM (dove DIM = 3 nel nostro caso), che sara&#8217; la nostra matrice di convoluzione, e creiamo un nostro tipo per descrivere i pixels. Dopo aver fatto inserire all&#8217;utente i 9 valori degli elementi della matrice, possiamo iniziare i calcoli. Nelle righe 38-56 (non le scrivo qua perche&#8217; vengono formattate male) svolgiamo i calcoli veri e propri. Gli indici i e j sono le coordinate x e y del pixel che stiamo esaminando; notate che escludiamo i pixel appartenenti al bordo esterno dell&#8217;immagine semplicemente perche&#8217; non hanno 8 pixel confinanti come tutti gli altri, e quindi verrebbe piu&#8217; difficile applicare la matrice perche&#8217; dovremmo escludere alcuni pixel dal conteggio; il risultato non cambia di molto.</p>
<p style="text-align: justify">I nuovi valori dei pixel vengono salvati in un array di oggetti pixel (il typedef che abbiamo definito poco piu&#8217; su). Quello che ci manca è riportare questi valori in un intervallo 0&#8230;255. Sappiamo infatti che 255 e&#8217; il valore massimo per ogni componente di un pixel, ma dall&#8217;applicazione del nostro filtro, potremmo avere (e&#8217; spesso e&#8217; cosi&#8217;) valori che superano questa soglia. Per fare cio&#8217; calcoliamo la somma di tutti gli elementi della matrice di convoluzione e dividiamo tutti i valori di output per questa somma. Se dopo questa operazione ci saranno ulteriori valori &gt; 255, li imposteremo uguali a 255, cosi&#8217; come imposteremo a 0 quelli &lt; 0.</p>
<p style="text-align: justify">Vediamo un esempio:</p>
<table border="0">
<tbody>
<tr>
<td><a href="http://www.mindunpacked.com/risorse/2.bmp"><img class="alignnone" title="Immagine originale" src="http://www.mindunpacked.com/risorse/2_th.bmp" alt="" width="200" height="183" /></a></td>
<td>
<p style="text-align: center">MATRICE DI CONVOLUZIONE</p>
<p style="text-align: center">0 -1  0</p>
<p style="text-align: center">-1  4  -1</p>
<p style="text-align: center">0  -1  0</p>
</td>
<td><a href="http://www.mindunpacked.com/risorse/out.bmp"><img class="alignnone" title="Risultato" src="http://www.mindunpacked.com/risorse/out_th.bmp" alt="" width="200" height="183" /></a></td>
</tr>
</tbody>
</table>
<p style="text-align: justify">In questo esempio, e&#8217; stata applicata all&#8217;immagine una matrice per individuare i bordi (edge detection). Le immagini sono piuttosto pesanti essendo BMP e quindi non compresse.</p>
<p style="text-align: justify">Su Internet si trovano facilmente altre matrici di convoluzione associate a risultati particolari. Ecco il <a title="Codice C++ matrici di convoluzione" href="http://www.mindunpacked.com/risorse/matrix.zip" target="_self">codice del programma</a>. Alla prossima.</p>
<p style="text-align: justify">
]]></content:encoded>
			<wfw:commentRss>http://mindunpacked.com/2009/matrici-e-filtri-di-convoluzione/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- www.000webhost.com Analytics Code -->
<script type="text/javascript" src="http://analytics.hosting24.com/count.php"></script>
<noscript><a href="http://www.hosting24.com/"><img src="http://analytics.hosting24.com/count.php" alt="web hosting" /></a></noscript>
<!-- End Of Analytics Code -->
