<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl">
	<id>http://brain.fuw.edu.pl/edu/index.php?action=history&amp;feed=atom&amp;title=Pracownia_EEG%2Fanaliza_obrazu</id>
	<title>Pracownia EEG/analiza obrazu - Historia wersji</title>
	<link rel="self" type="application/atom+xml" href="http://brain.fuw.edu.pl/edu/index.php?action=history&amp;feed=atom&amp;title=Pracownia_EEG%2Fanaliza_obrazu"/>
	<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/analiza_obrazu&amp;action=history"/>
	<updated>2026-04-23T15:07:26Z</updated>
	<subtitle>Historia wersji tej strony wiki</subtitle>
	<generator>MediaWiki 1.34.1</generator>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/analiza_obrazu&amp;diff=7431&amp;oldid=prev</id>
		<title>Maciek: /* Segmentacja przez analizę skupień (k-means) */</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/analiza_obrazu&amp;diff=7431&amp;oldid=prev"/>
		<updated>2018-01-11T14:46:08Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Segmentacja przez analizę skupień (k-means)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;pl&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← poprzednia wersja&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Wersja z 14:46, 11 sty 2018&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l642&quot; &gt;Linia 642:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Linia 642:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;from scipy.cluster.vq import kmeans,vq&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;from scipy.cluster.vq import kmeans,vq&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;K_opt = 8&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;K_opt = 8&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;centroids,_ = kmeans(l.ravel(),K_opt)&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;centroids,_ = kmeans(l.ravel()&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;*1.&lt;/ins&gt;,K_opt)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# przypisujemy klasę&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# przypisujemy klasę&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l659&quot; &gt;Linia 659:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Linia 659:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;py.show()&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;py.show()&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/source&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/source&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;===Segmentacja przez rozrost===&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;===Segmentacja przez rozrost===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/analiza_obrazu&amp;diff=7414&amp;oldid=prev</id>
		<title>Maciek: /* Zadanie */</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/analiza_obrazu&amp;diff=7414&amp;oldid=prev"/>
		<updated>2017-12-21T10:50:05Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Zadanie&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;pl&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← poprzednia wersja&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Wersja z 10:50, 21 gru 2017&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l749&quot; &gt;Linia 749:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Linia 749:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=Zadanie=&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=Zadanie=&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Przygotuj prezentację demonstrującą działanie operacji na obrazach omawianych w tym rozdziale. Zademonstruj różne możliwości użytych operacji (np. usuwanie drobnych szczegółów z obrazu lub dużych struktur, itp.).&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Przygotuj prezentację demonstrującą działanie operacji na obrazach omawianych w tym rozdziale. Zademonstruj różne możliwości użytych operacji (np. usuwanie drobnych szczegółów z obrazu lub dużych struktur, itp.)&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;. Zaproponuj odpowiednio dobrane własne obrazy, aby lepiej uwidocznić uzyskane efekty&lt;/ins&gt;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/analiza_obrazu&amp;diff=7413&amp;oldid=prev</id>
		<title>Maciek: /* Zadanie */</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/analiza_obrazu&amp;diff=7413&amp;oldid=prev"/>
		<updated>2017-12-21T10:48:08Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Zadanie&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;pl&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← poprzednia wersja&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Wersja z 10:48, 21 gru 2017&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l749&quot; &gt;Linia 749:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Linia 749:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=Zadanie=&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=Zadanie=&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Przygotuj &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;małą &lt;/del&gt;prezentację demonstrującą działanie operacji na obrazach omawianych w tym rozdziale. Zademonstruj różne możliwości użytych operacji (np. usuwanie drobnych szczegółów z obrazu lub dużych struktur, itp.).&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Przygotuj prezentację demonstrującą działanie operacji na obrazach omawianych w tym rozdziale. Zademonstruj różne możliwości użytych operacji (np. usuwanie drobnych szczegółów z obrazu lub dużych struktur, itp.).&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/analiza_obrazu&amp;diff=7412&amp;oldid=prev</id>
		<title>Maciek: /* Zadanie */</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/analiza_obrazu&amp;diff=7412&amp;oldid=prev"/>
		<updated>2017-12-21T10:47:58Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Zadanie&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;pl&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← poprzednia wersja&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Wersja z 10:47, 21 gru 2017&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l749&quot; &gt;Linia 749:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Linia 749:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=Zadanie=&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=Zadanie=&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Przygotuj małą prezentację demonstrującą działanie operacji na obrazach omawianych w tym rozdziale.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Przygotuj małą prezentację demonstrującą działanie operacji na obrazach omawianych w tym rozdziale&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;. Zademonstruj różne możliwości użytych operacji (np. usuwanie drobnych szczegółów z obrazu lub dużych struktur, itp.)&lt;/ins&gt;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/analiza_obrazu&amp;diff=7411&amp;oldid=prev</id>
		<title>Maciek o 10:46, 21 gru 2017</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/analiza_obrazu&amp;diff=7411&amp;oldid=prev"/>
		<updated>2017-12-21T10:46:29Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;pl&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← poprzednia wersja&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Wersja z 10:46, 21 gru 2017&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l747&quot; &gt;Linia 747:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Linia 747:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/source&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/source&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;=Zadanie=&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Przygotuj małą prezentację demonstrującą działanie operacji na obrazach omawianych w tym rozdziale.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Maciek</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/analiza_obrazu&amp;diff=4288&amp;oldid=prev</id>
		<title>Durka o 07:00, 16 paź 2015</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/analiza_obrazu&amp;diff=4288&amp;oldid=prev"/>
		<updated>2015-10-16T07:00:00Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;pl&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← poprzednia wersja&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Wersja z 07:00, 16 paź 2015&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot; &gt;Linia 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Linia 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Pracownia EEG|Pracownia EEG]] / Wstęp do analizy obrazu&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=Wstęp=&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=Wstęp=&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;W tym dziale zajmiemy się analizą obrazu za pomocą narzędzi dostępnych w modułach &amp;lt;tt&amp;gt;numpy&amp;lt;/tt&amp;gt; i &amp;lt;tt&amp;gt;scipy&amp;lt;/tt&amp;gt;.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;W tym dziale zajmiemy się analizą obrazu za pomocą narzędzi dostępnych w modułach &amp;lt;tt&amp;gt;numpy&amp;lt;/tt&amp;gt; i &amp;lt;tt&amp;gt;scipy&amp;lt;/tt&amp;gt;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Durka</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/analiza_obrazu&amp;diff=2240&amp;oldid=prev</id>
		<title>Jarekz: Utworzono nową stronę &quot;=Wstęp= W tym dziale zajmiemy się analizą obrazu za pomocą narzędzi dostępnych w modułach &lt;tt&gt;numpy&lt;/tt&gt; i &lt;tt&gt;scipy&lt;/tt&gt;. Tak więc na potrzeby tego rozdziału u...&quot;</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_EEG/analiza_obrazu&amp;diff=2240&amp;oldid=prev"/>
		<updated>2015-05-23T19:09:25Z</updated>

		<summary type="html">&lt;p&gt;Utworzono nową stronę &amp;quot;=Wstęp= W tym dziale zajmiemy się analizą obrazu za pomocą narzędzi dostępnych w modułach &amp;lt;tt&amp;gt;numpy&amp;lt;/tt&amp;gt; i &amp;lt;tt&amp;gt;scipy&amp;lt;/tt&amp;gt;. Tak więc na potrzeby tego rozdziału u...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nowa strona&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=Wstęp=&lt;br /&gt;
W tym dziale zajmiemy się analizą obrazu za pomocą narzędzi dostępnych w modułach &amp;lt;tt&amp;gt;numpy&amp;lt;/tt&amp;gt; i &amp;lt;tt&amp;gt;scipy&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Tak więc na potrzeby tego rozdziału uznamy, że obrazy to dwuwymiarowe tablice numpy.&lt;br /&gt;
Podstawowe operacje macierzowe będziemy czerpać z modułu &amp;lt;tt&amp;gt;numpy&amp;lt;/tt&amp;gt; zaś bardziej specyficzne operacje z modułu  &amp;lt;tt&amp;gt;scipy.ndimage&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
W dalszym toku zajęć zapoznamy się też częściowo z bardziej dedykowanymi narzędziami zawartymi w module OpenCV.&lt;br /&gt;
&lt;br /&gt;
W poniższych materiałach wykorzystano tutorial: http://scipy-lectures.github.io/advanced/image_processing/#feature-extraction autorstwa: Emmanuelle Gouillart, Gaël Varoquaux.&lt;br /&gt;
&lt;br /&gt;
=Wczytywanie i zapisywanie obrazów=&lt;br /&gt;
Do wstępnych ćwiczeń posłużymy się standardowym w świecie analizy obrazów zdjęciem znanym jako Lena.&lt;br /&gt;
Przygotujemy plik w formacie png:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from scipy import misc&lt;br /&gt;
l = misc.lena()&lt;br /&gt;
misc.imsave('lena.png', l) # tu używany jest niejawnie moduł do podstawowej pracy z plikami graficznymi (PIL - python image library) &lt;br /&gt;
&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
plt.imshow(l)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby wczytać obrazek z pliku graficznego jako tablicę: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from scipy import misc&lt;br /&gt;
lena = misc.imread('lena.png')&lt;br /&gt;
type(lena)&lt;br /&gt;
&lt;br /&gt;
lena.shape, lena.dtype&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Zwróćmy uwagę na to, że typem dla obrazków jest uint8 (czyli liczby całkowite z zakresu 0-255).&lt;br /&gt;
&lt;br /&gt;
=Wyświetlanie obrazów=&lt;br /&gt;
W tym celu można zastosować funkcję &amp;lt;tt&amp;gt;imshow&amp;lt;/tt&amp;gt; z &amp;lt;tt&amp;gt;matplotlib&amp;lt;/tt&amp;gt;. Zwróćmy uwagę jak ustawia się mapę kolorów.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
l = misc.lena()&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
plt.imshow(l, cmap=plt.cm.gray)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sterowanie kontrastem za pomocą ustawiania minimalnej i maksymalnej wartości dla skali jasności.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
plt.imshow(l, cmap=plt.cm.gray, vmin=30, vmax=200)&lt;br /&gt;
&lt;br /&gt;
# Remove axes and ticks&lt;br /&gt;
plt.axis('off')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Aby oglądać obraz z dokładnością do piksela należy zmienić domyślną interpolację, porównajmy dwie wersje:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
plt.subplot(1,2,1)&lt;br /&gt;
plt.imshow(l[200:220, 200:220], cmap=plt.cm.gray)&lt;br /&gt;
plt.subplot(1,2,2)&lt;br /&gt;
plt.imshow(l[200:220, 200:220], cmap=plt.cm.gray, interpolation='nearest')&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=Podstawowe manipulacje=&lt;br /&gt;
&lt;br /&gt;
[[Plik:Axis_convention.png|600px|thumb|center|Konwencja układu współrzędnych stosowana w grafice: ]]&lt;br /&gt;
Ponieważ traktujemy obraz jako tablicę numpy możemy stosować standardowe operacje:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
lena = scipy.misc.lena()&lt;br /&gt;
# adresowanie pojedynczego piksela&lt;br /&gt;
lena[0, 40]&lt;br /&gt;
&lt;br /&gt;
# wycinki&lt;br /&gt;
lena[10:13, 20:23]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
lena[100:120] = 255&lt;br /&gt;
&lt;br /&gt;
lx, ly = lena.shape&lt;br /&gt;
X, Y = np.ogrid[0:lx, 0:ly]&lt;br /&gt;
mask = (X - lx / 2) ** 2 + (Y - ly / 2) ** 2 &amp;gt; lx * ly / 4&lt;br /&gt;
# maskowanie&lt;br /&gt;
lena[mask] = 0&lt;br /&gt;
# średnia wartość jasności w obrazie, maksimum i minimum&lt;br /&gt;
lena.mean()&lt;br /&gt;
lena.max()&lt;br /&gt;
lena.min()&lt;br /&gt;
#przycinanie&lt;br /&gt;
crop_lena = lena[lx / 4: - lx / 4, ly / 4: - ly / 4]&lt;br /&gt;
# up &amp;lt;-&amp;gt; down flip&lt;br /&gt;
flip_ud_lena = np.flipud(lena)&lt;br /&gt;
# obroty&lt;br /&gt;
rotate_lena = ndimage.rotate(lena, 45)&lt;br /&gt;
rotate_lena_noreshape = ndimage.rotate(lena, 45, reshape=False)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Częstość w obrazie i dwuwymiarowa transformata Fouriera=&lt;br /&gt;
== sin 2D ==&lt;br /&gt;
Aby uświadomić sobie związki między jednowymiarowym sygnałem a obrazem &amp;amp;mdash; sygnałem 2D &amp;amp;mdash; zrobimy następujące ćwiczenie (poniżej prezentowane fragmenty kodu dopisujemy do jednego pliku): &lt;br /&gt;
* Zrobimy sinusa jednowymiarowego o 10 okresach na 100 punktów:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import  matplotlib.pyplot as py &lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
X = 100 #pikseli &lt;br /&gt;
Fs = 1.0/X #czestosc probkowania co jeden piksel&lt;br /&gt;
dx = 1&lt;br /&gt;
x = np.arange(0,X,dx)&lt;br /&gt;
f = 10.0/X # czestosc sinusa -10 okresów na X &lt;br /&gt;
syg = np.sin(2*np.pi*f*x + np.pi/3);&lt;br /&gt;
py.figure(1)&lt;br /&gt;
py.plot(x,syg)&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Teraz przekształcimy go w obraz:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
py.figure(2)&lt;br /&gt;
# teraz zrobimy z niego obraz 2D &lt;br /&gt;
Y = X/2&lt;br /&gt;
SYG = np.zeros((Y,X));&lt;br /&gt;
for y in range(Y):&lt;br /&gt;
    SYG[y,:]=syg&lt;br /&gt;
py.subplot(2,2,1)&lt;br /&gt;
py.pcolor(SYG, cmap=py.cm.gray,vmin=-2,vmax = 2) &lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Te zmieniające intensywność prążki to właśnie obrazek przedstawiający sin w kierunku X.&lt;br /&gt;
&lt;br /&gt;
==Transformata Fouriera 2D==&lt;br /&gt;
* fft2 z sin2D &lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
py.subplot(221)&lt;br /&gt;
py.pcolor(SYG, cmap=py.cm.gray,vmin=-2,vmax = 2) &lt;br /&gt;
&lt;br /&gt;
py.subplot(222)&lt;br /&gt;
SK_X = np.arange(-X/2,X/2,1)&lt;br /&gt;
SK_Y = np.arange(-Y/2,Y/2,1)&lt;br /&gt;
S = np.fft.fft2(SYG)&lt;br /&gt;
modS = np.abs(np.fft.fftshift(S))&lt;br /&gt;
py.pcolor(SK_X,SK_Y, modS, cmap=py.cm.gray) &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* sprawdźmy jak widoczne jest dodanie stałej wartości do obrazu:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
py.subplot(223)&lt;br /&gt;
py.pcolor(SYG+1, cmap=py.cm.gray, vmin=-2,vmax = 2)&lt;br /&gt;
py.subplot(224)&lt;br /&gt;
S = np.fft.fft2(SYG+1)&lt;br /&gt;
py.pcolor(SK_X,SK_Y,np.abs(np.fft.fftshift(S)), cmap=py.cm.gray) &lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=Filtrowanie liniowe. Korelacja i splot=&lt;br /&gt;
Sygnały jednowymiarowe, np. jeden kanał sygnału EEG, filtrowaliśmy poprzez splatanie sygnału z funkcją odpowiedzi impulsowej filtru. Podobnie można myśleć o filtrowanie obrazów, traktowanych jako sygnały dwuwymiarowe. Trzeba tylko określić jak liczyć splot w dwóch wymiarach. Zobaczmy jak to się robi praktycznie.&lt;br /&gt;
 &lt;br /&gt;
==Korelacja==&lt;br /&gt;
Przyjmijmy, że:&lt;br /&gt;
*obrazem jest duża macierz;&lt;br /&gt;
*jądrem splotu/korelacji jest mniejsza macierz.&lt;br /&gt;
&lt;br /&gt;
Załóżmy, że mamy obraz &amp;lt;tt&amp;gt;A&amp;lt;/tt&amp;gt;:&lt;br /&gt;
 [[17, 24,  1,  8, 15],&lt;br /&gt;
  [23,  5,  7, 14, 16],&lt;br /&gt;
  [ 4,  6, 13, 20, 22],&lt;br /&gt;
  [10, 12, 19, 21,  3],&lt;br /&gt;
  [11, 18, 25,  2,  9]]&lt;br /&gt;
i jądro korelacji &amp;lt;tt&amp;gt;h&amp;lt;/tt&amp;gt;:&lt;br /&gt;
 [[8, 1, 6],&lt;br /&gt;
  [3, 5, 7],&lt;br /&gt;
  [4, 9, 2]])&lt;br /&gt;
&lt;br /&gt;
wówczas operacja korelacji dla elementu &amp;lt;tt&amp;gt;A[1,3]&amp;lt;/tt&amp;gt; jest następująca:&lt;br /&gt;
# kładziemy macierz &amp;lt;tt&amp;gt;h&amp;lt;/tt&amp;gt; elementem środkowym (5) na elemencie &amp;lt;tt&amp;gt;A[1,3]&amp;lt;/tt&amp;gt;;&lt;br /&gt;
# wymnażamy przez siebie wszystkie pokrywające się elementy i sumujemy iloczyny.&lt;br /&gt;
Wtedy dla tego elementu otrzymujemy:&lt;br /&gt;
 D[1,3] =1*8 + 8*1 +15*6 +&lt;br /&gt;
        7*3 + 14*5 + 16*7+&lt;br /&gt;
        13*4 + 20*9 +22*2 = 585&lt;br /&gt;
Taką korelację mamy zaimplementowaną w  &amp;lt;tt&amp;gt;ndimage.correlate&amp;lt;/tt&amp;gt; (w dokumentacji można doczytać różne opcje dotyczące traktowania brzegów, kiedy macierz &amp;lt;tt&amp;gt;h&amp;lt;/tt&amp;gt; &amp;quot;wystaje&amp;quot; poza macierz &amp;lt;tt&amp;gt;A&amp;lt;/tt&amp;gt;) :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
A = np.array([[17, 24,  1,  8, 15],[23, 5, 7, 14, 16 ],[4,6,13,20,22],[10,12,19,21,3],[11,18,25,2,9]  ])&lt;br /&gt;
h = np.array([[8,1,6],[3,5,7],[4,9,2]])&lt;br /&gt;
D = ndimage.correlate(A,h)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Splot==&lt;br /&gt;
Bardzo podobna jest operacja dwuwymiarowego splotu. Jedyna różnica jest taka, że przed operacją mnożenia i dodawania jądro jest obracane o 180&amp;amp;deg;, implementacja w &amp;lt;tt&amp;gt;ndimage.convolve&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Ćwiczenie==&lt;br /&gt;
Na obrazie &amp;lt;tt&amp;gt;lena&amp;lt;/tt&amp;gt; proszę sprawdzić działanie kilku podstawowych, często stosowanych filtrów:&lt;br /&gt;
* filtr uśredniający:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
h = np.array([[1./9, 1./9, 1./9],&lt;br /&gt;
              [1./9, 1./9, 1./9], &lt;br /&gt;
              [1./9, 1./9, 1./9]])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* filtr wyostrzający:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
 h = np.array([[ 0, -1,  0], &lt;br /&gt;
              [ -1,  5, -1], &lt;br /&gt;
              [  0, -1,  0]])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* filtr uwypuklający:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
 h = np.array([[-1, -1, -1, -1, 0],&lt;br /&gt;
              [ -1, -1, -1,  0, 1],&lt;br /&gt;
              [ -1, -1,  0,  1, 1],&lt;br /&gt;
              [ -1,  0,  1,  1, 1],&lt;br /&gt;
              [  0,  1,  1,  1, 1]])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Filtry nieliniowe=&lt;br /&gt;
Koncepcję filtrowania można rozszerzyć na inne operacje wykonywane na pikselach otaczających aktualnie rozważany. Może to być obliczenie dowolnej funkcji  z wartości pikseli w sąsiedztwie, np.: mediany, maximum, minimum, konkretnego kwantyla, odchylenia standardowego, zakresu zmienności itd. Dla przykładu rozważmy odszumianie obrazu.&lt;br /&gt;
==Odszumianie==&lt;br /&gt;
Szum w obrazie polegający na tym, że wartość każdego piksela jest zaburzona przez wartość losową ma głównie wysokie częstości przestrzenne. W pierwszym podejściu można próbować usunąć je przez filtr uśredniający. Będzie on niestety rozmywał krawędzie. Zwykle lepsze rezultaty daje filtr medianowy (do elementu centralnego przypisywana jest wartość mediany z sąsiedztwa o zadanym promieniu). Proszę porównać: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from scipy import misc&lt;br /&gt;
l = misc.lena()&lt;br /&gt;
l = l[230:310, 210:350]&lt;br /&gt;
noisy = l + 0.4 * l.std() * np.random.random(l.shape)&lt;br /&gt;
# dodajmy jeszcze &amp;quot;zagniecenie&amp;quot; zdjęcia&lt;br /&gt;
noisy[range(80),range(80)]=255&lt;br /&gt;
&lt;br /&gt;
#filtr gaussowski&lt;br /&gt;
gauss_denoised = ndimage.gaussian_filter(noisy, 2)&lt;br /&gt;
#filtr medianowy&lt;br /&gt;
med_denoised = ndimage.median_filter(noisy, 3)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Operacje morfologiczne=&lt;br /&gt;
Szczególnym przypadkiem filtrów nieliniowych sa operacje morfologiczne. Polegają one na tym, że obraz jest &amp;quot;próbkowany&amp;quot; pewnym prostym kształtem tzw. elementem strukturalnym. Obraz wyjściowy jest modyfikowany w zależności od tego jak taki element &amp;quot;pasuje&amp;quot; do poszczególnych miejsc obrazu wejściowego. Dalej zajmiemy się operacjami morfologicznymi dla obrazów binarnych. &lt;br /&gt;
==Element strukturalny==&lt;br /&gt;
Element strukturalny to binarna maska przykładana do oryginalnego obrazka. &lt;br /&gt;
&lt;br /&gt;
==Erozja==&lt;br /&gt;
Erozja powoduje zamianę aktualnego piksela na wartość minimalną zawartą w części wspólnej elementu strukturalnego o środku w aktualnym pikselu i oryginalnego obrazka.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as py&lt;br /&gt;
from scipy import ndimage&lt;br /&gt;
from scipy import misc&lt;br /&gt;
&lt;br /&gt;
def element():&lt;br /&gt;
    el = np.array([[0, 1, 0],[1,1,1],[0,1,0]], dtype=bool)&lt;br /&gt;
    #el = np.array([[0, 0, 0],[1,1,1],[0,0,0]], dtype=bool)&lt;br /&gt;
    return el&lt;br /&gt;
def dodaj_kwadrat(ob, x,y, dx,dy):&lt;br /&gt;
    '''dodaje kwadrat wypełniony 1 do obrazu binarnego ob. &lt;br /&gt;
    x, y - lewy górny róg&lt;br /&gt;
    dx,dy - szerokosć i wysokość '''&lt;br /&gt;
    ob[x:x+dx,y:y+dy] = 1&lt;br /&gt;
    return ob&lt;br /&gt;
def dodaj_kolo(ob, x,y, r):&lt;br /&gt;
    '''dodaje koło wypełnione 1 do obrazu binarnego ob. &lt;br /&gt;
    x, y - środek&lt;br /&gt;
    r - promień '''&lt;br /&gt;
    r2=r**2&lt;br /&gt;
    for xi in range(ob.shape[0]):&lt;br /&gt;
        for yi in range(ob.shape[1]):&lt;br /&gt;
            if (xi-x)**2+(yi-y)**2&amp;lt;=r2:&lt;br /&gt;
                ob[xi,yi]=1&lt;br /&gt;
    return ob&lt;br /&gt;
    &lt;br /&gt;
NX=10&lt;br /&gt;
NY=10&lt;br /&gt;
&lt;br /&gt;
py.figure('erozja 1')&lt;br /&gt;
ob = np.zeros((NX,NY))&lt;br /&gt;
py.subplot(1,3,1)&lt;br /&gt;
el = element()&lt;br /&gt;
py.imshow(el,interpolation = 'nearest',cmap=py.cm.gray)&lt;br /&gt;
py.xlim([-0.5,NX])&lt;br /&gt;
py.ylim([-0.5,NY])&lt;br /&gt;
py.axis('off')&lt;br /&gt;
py.title('element strukturalny')&lt;br /&gt;
&lt;br /&gt;
py.subplot(1,3,2)&lt;br /&gt;
ob = dodaj_kwadrat(ob,2,2,6,6)&lt;br /&gt;
py.imshow(ob, interpolation = 'nearest',cmap=py.cm.gray)&lt;br /&gt;
py.xlim([-0.5,NX])&lt;br /&gt;
py.ylim([-0.5,NY])&lt;br /&gt;
py.axis('off')&lt;br /&gt;
py.title(u'obraz wejściowy')&lt;br /&gt;
&lt;br /&gt;
py.subplot(1,3,3)&lt;br /&gt;
ob_wyj = ndimage.binary_erosion(ob, structure = el).astype(ob.dtype)&lt;br /&gt;
py.imshow(ob_wyj, interpolation = 'nearest',cmap=py.cm.gray)&lt;br /&gt;
py.xlim([-0.5,NX])&lt;br /&gt;
py.ylim([-0.5,NY])&lt;br /&gt;
py.axis('off')&lt;br /&gt;
py.title(u'obraz wyjściowy')&lt;br /&gt;
py.show()&lt;br /&gt;
&lt;br /&gt;
py.figure('erozja 2')&lt;br /&gt;
ob = np.zeros((NX,NY))&lt;br /&gt;
py.subplot(1,3,1)&lt;br /&gt;
el = element()&lt;br /&gt;
py.imshow(el,interpolation = 'nearest',cmap=py.cm.gray)&lt;br /&gt;
py.xlim([-0.5,NX])&lt;br /&gt;
py.ylim([-0.5,NY])&lt;br /&gt;
py.axis('off')&lt;br /&gt;
py.title('element strukturalny')&lt;br /&gt;
&lt;br /&gt;
py.subplot(1,3,2)&lt;br /&gt;
#ob = dodaj_kwadrat(ob,2,2,6,6)&lt;br /&gt;
ob = dodaj_kolo(ob,5,5,3)&lt;br /&gt;
py.imshow(ob, interpolation = 'nearest',cmap=py.cm.gray)&lt;br /&gt;
py.xlim([-0.5,NX])&lt;br /&gt;
py.ylim([-0.5,NY])&lt;br /&gt;
py.axis('off')&lt;br /&gt;
py.title(u'obraz wejściowy')&lt;br /&gt;
&lt;br /&gt;
py.subplot(1,3,3)&lt;br /&gt;
ob_wyj = ndimage.binary_erosion(ob, structure = el).astype(ob.dtype)&lt;br /&gt;
py.imshow(ob_wyj, interpolation = 'nearest',cmap=py.cm.gray)&lt;br /&gt;
py.xlim([-0.5,NX])&lt;br /&gt;
py.ylim([-0.5,NY])&lt;br /&gt;
py.axis('off')&lt;br /&gt;
py.title(u'obraz wyjściowy')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Dylacja==&lt;br /&gt;
Dylacja powoduje zamianę aktualnego piksela na wartość maksymalną zawartą w części wspólnej elementu strukturalnego o środku w aktualnym pikselu i oryginalnego obrazka. Implementacja: &amp;lt;tt&amp;gt;ndimage.binary_dilation&amp;lt;/tt&amp;gt;. Proszę wypróbować tą operację modyfikując kod przykładowy od Erozji.&lt;br /&gt;
&lt;br /&gt;
==Otwarcie==&lt;br /&gt;
Otwarcie to złożenie operacji erozji i dylacji. Operacja otwarcia zachowuje rozmiary obiektów obrazu przy ich jednoczesnym wygładzeniu &amp;amp;mdash; usunięciu wszystkich „wystających” elementów. Zwiększanie rozmiaru elementu strukturalnego &amp;lt;tt&amp;gt;B&amp;lt;/tt&amp;gt; skutkuje usuwaniem coraz większych detali obrazu oraz upodabnianiem powstałych obszarów do elemetu strukturalnego. Implementacja: &amp;lt;tt&amp;gt;ndimage.binary_opening&amp;lt;/tt&amp;gt;. Proszę wypróbować tą operację:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as py&lt;br /&gt;
from scipy import ndimage&lt;br /&gt;
from scipy import misc&lt;br /&gt;
    &lt;br /&gt;
def element():&lt;br /&gt;
    #el = np.array([[0, 1, 0],[1,1,1],[0,1,0]], dtype=bool)&lt;br /&gt;
    el = np.zeros((3,3))&lt;br /&gt;
    el = dodaj_kolo(el,1.5,1.5,1.5)&lt;br /&gt;
    return el&lt;br /&gt;
def dodaj_kwadrat(ob, x,y, dx,dy):&lt;br /&gt;
    '''dodaje kwadrat wypełniony 1 do obrazu binarnego ob. &lt;br /&gt;
    x, y - lewy górny róg&lt;br /&gt;
    dx,dy - szerokosć i wysokość '''&lt;br /&gt;
    ob[x:x+dx,y:y+dy] = 1&lt;br /&gt;
    return ob&lt;br /&gt;
def dodaj_kolo(ob, x,y, r):&lt;br /&gt;
    '''dodaje koło wypełnione 1 do obrazu binarnego ob. &lt;br /&gt;
    x, y - środek&lt;br /&gt;
    r - promień '''&lt;br /&gt;
    r2=r**2&lt;br /&gt;
    for xi in range(ob.shape[0]):&lt;br /&gt;
        for yi in range(ob.shape[1]):&lt;br /&gt;
            if (xi-x)**2+(yi-y)**2&amp;lt;=r2:&lt;br /&gt;
                ob[xi,yi]=1&lt;br /&gt;
    return ob&lt;br /&gt;
def dodaj_szum(ob,ile):&lt;br /&gt;
    tmp = np.random.rand(ob.shape[0],ob.shape[1])&lt;br /&gt;
    idx = np.where(tmp&amp;lt;ile)&lt;br /&gt;
    ob[idx] = np.abs(ob[idx]-1)&lt;br /&gt;
    return ob&lt;br /&gt;
    &lt;br /&gt;
            &lt;br /&gt;
py.close('all')&lt;br /&gt;
NX=100&lt;br /&gt;
NY=100&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#spróbujmy progowania na różnym poziomie&lt;br /&gt;
py.figure('erozja 1')&lt;br /&gt;
ob = np.zeros((NX,NY))&lt;br /&gt;
py.subplot(1,3,1)&lt;br /&gt;
el = element()&lt;br /&gt;
py.imshow(el,interpolation = 'nearest',cmap=py.cm.gray)&lt;br /&gt;
py.xlim([-0.5,NX])&lt;br /&gt;
py.ylim([-0.5,NY])&lt;br /&gt;
py.axis('off')&lt;br /&gt;
py.title('element strukturalny')&lt;br /&gt;
&lt;br /&gt;
py.subplot(1,3,2)&lt;br /&gt;
ob = dodaj_kwadrat(ob,20,20,60,60)&lt;br /&gt;
ob = dodaj_szum(ob,0.2)&lt;br /&gt;
py.imshow(ob, interpolation = 'nearest',cmap=py.cm.gray)&lt;br /&gt;
py.xlim([-0.5,NX])&lt;br /&gt;
py.ylim([-0.5,NY])&lt;br /&gt;
py.axis('off')&lt;br /&gt;
py.title(u'obraz wejściowy')&lt;br /&gt;
&lt;br /&gt;
py.subplot(1,3,3)&lt;br /&gt;
ob_wyj = ndimage.binary_opening(ob, structure = el).astype(ob.dtype)&lt;br /&gt;
py.imshow(ob_wyj, interpolation = 'nearest',cmap=py.cm.gray)&lt;br /&gt;
py.xlim([-0.5,NX])&lt;br /&gt;
py.ylim([-0.5,NY])&lt;br /&gt;
py.axis('off')&lt;br /&gt;
py.title(u'obraz wyjściowy')&lt;br /&gt;
py.show()&lt;br /&gt;
&lt;br /&gt;
py.figure('erozja 2')&lt;br /&gt;
ob = np.zeros((NX,NY))&lt;br /&gt;
py.subplot(1,3,1)&lt;br /&gt;
el = element()&lt;br /&gt;
py.imshow(el,interpolation = 'nearest',cmap=py.cm.gray)&lt;br /&gt;
py.xlim([-0.5,NX])&lt;br /&gt;
py.ylim([-0.5,NY])&lt;br /&gt;
py.axis('off')&lt;br /&gt;
py.title('element strukturalny')&lt;br /&gt;
&lt;br /&gt;
py.subplot(1,3,2)&lt;br /&gt;
#ob = dodaj_kwadrat(ob,2,2,6,6)&lt;br /&gt;
ob = dodaj_kolo(ob,50,50,30)&lt;br /&gt;
ob = dodaj_szum(ob,0.2)&lt;br /&gt;
py.imshow(ob, interpolation = 'nearest',cmap=py.cm.gray)&lt;br /&gt;
py.xlim([-0.5,NX])&lt;br /&gt;
py.ylim([-0.5,NY])&lt;br /&gt;
py.axis('off')&lt;br /&gt;
py.title(u'obraz wejściowy')&lt;br /&gt;
&lt;br /&gt;
py.subplot(1,3,3)&lt;br /&gt;
ob_wyj = ndimage.binary_opening(ob, structure = el).astype(ob.dtype)&lt;br /&gt;
py.imshow(ob_wyj, interpolation = 'nearest',cmap=py.cm.gray)&lt;br /&gt;
py.xlim([-0.5,NX])&lt;br /&gt;
py.ylim([-0.5,NY])&lt;br /&gt;
py.axis('off')&lt;br /&gt;
py.title(u'obraz wyjściowy')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Domknięcie ==&lt;br /&gt;
Domknięcie to złożenie operacji dylacji i erozji. Domknięcie usuwa z obrazu wszelkie „dziury” oraz wklęsłości mniejsze od elementu strukturalnego. Może skutkować „połączeniem się” blisko położonych detali. Zwiększanie wielkości elementu strukturalnego powoduje wypełnianie coraz większych „dziur” oraz wklęsłości, upodabnianiem powstałych obszarów do elementu strukturalnego i łączeniem coraz dalej położonych detali.Implementacja: &amp;lt;tt&amp;gt;ndimage.binary_closing&amp;lt;/tt&amp;gt;. Proszę wypróbować tą operację modyfikując poprzedni skrypt.&lt;br /&gt;
&lt;br /&gt;
==Progowanie==&lt;br /&gt;
Aby uzyskać obraz binarny z obrazu w skali szarości należy obraz wejściowy sprogować. &lt;br /&gt;
Proszę obejrzeć histogram szarości Leny i zobaczyć efekty progowania dla kilku wybranych wartości:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as py&lt;br /&gt;
from scipy import ndimage&lt;br /&gt;
from scipy import misc&lt;br /&gt;
&lt;br /&gt;
def proguj(ob, prog):&lt;br /&gt;
    ob_wyj = np.zeros(ob.shape)&lt;br /&gt;
    ob_wyj[np.where(ob&amp;gt;prog)]=1&lt;br /&gt;
    return ob_wyj&lt;br /&gt;
py.close('all')&lt;br /&gt;
l = misc.lena()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
py.figure('histogram szarosci')&lt;br /&gt;
py.hist(l.ravel(),255) # narysujmy histogram odcieni&lt;br /&gt;
py.show()&lt;br /&gt;
#spróbujmy progowania na różnym poziomie&lt;br /&gt;
py.figure('progowanie')&lt;br /&gt;
py.subplot(1,2,1)&lt;br /&gt;
py.imshow(l,interpolation = 'nearest',cmap=py.cm.gray)&lt;br /&gt;
py.axis('off')&lt;br /&gt;
py.subplot(1,2,2)&lt;br /&gt;
prog = 110&lt;br /&gt;
l_prog = proguj(l,prog)&lt;br /&gt;
py.imshow(l_prog, interpolation = 'nearest',cmap=py.cm.gray)&lt;br /&gt;
py.axis('off')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Szukanie krawędzi==&lt;br /&gt;
Złożenie operacji morfologicznych erozji i dylacji można zastosować do detekcji krawędzi.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as py&lt;br /&gt;
from scipy import ndimage&lt;br /&gt;
from scipy import misc&lt;br /&gt;
&lt;br /&gt;
def proguj(ob, prog):&lt;br /&gt;
    ob_wyj = np.zeros(ob.shape)&lt;br /&gt;
    ob_wyj[np.where(ob&amp;gt;prog)]=1&lt;br /&gt;
    return ob_wyj&lt;br /&gt;
def element():&lt;br /&gt;
    #el = np.array([[0, 1, 0],[1,1,1],[0,1,0]], dtype=bool)&lt;br /&gt;
    el = np.zeros((6,6))&lt;br /&gt;
    el = dodaj_kolo(el,3,3,3)&lt;br /&gt;
    return el&lt;br /&gt;
def dodaj_kwadrat(ob, x,y, dx,dy):&lt;br /&gt;
    '''dodaje kwadrat wypełniony 1 do obrazu binarnego ob. &lt;br /&gt;
    x, y - lewy górny róg&lt;br /&gt;
    dx,dy - szerokosć i wysokość '''&lt;br /&gt;
    ob[x:x+dx,y:y+dy] = 1&lt;br /&gt;
    return ob&lt;br /&gt;
def dodaj_kolo(ob, x,y, r):&lt;br /&gt;
    '''dodaje koło wypełnione 1 do obrazu binarnego ob. &lt;br /&gt;
    x, y - środek&lt;br /&gt;
    r - promień '''&lt;br /&gt;
    r2=r**2&lt;br /&gt;
    for xi in range(ob.shape[0]):&lt;br /&gt;
        for yi in range(ob.shape[1]):&lt;br /&gt;
            if (xi-x)**2+(yi-y)**2&amp;lt;=r2:&lt;br /&gt;
                ob[xi,yi]=1&lt;br /&gt;
    return ob    &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
py.close('all')&lt;br /&gt;
l = misc.lena()&lt;br /&gt;
&lt;br /&gt;
py.figure('operacje')&lt;br /&gt;
py.subplot(3,3,1)&lt;br /&gt;
py.imshow(l,interpolation = 'nearest',cmap=py.cm.gray)&lt;br /&gt;
py.axis('off')&lt;br /&gt;
py.title(u'oryginał')&lt;br /&gt;
&lt;br /&gt;
py.subplot(3,3,2)&lt;br /&gt;
prog = 110&lt;br /&gt;
l_prog = proguj(l,prog)&lt;br /&gt;
py.imshow(l_prog, interpolation = 'nearest',cmap=py.cm.gray)&lt;br /&gt;
py.axis('off')&lt;br /&gt;
py.title('progowany')&lt;br /&gt;
&lt;br /&gt;
py.subplot(3,3,3)&lt;br /&gt;
el=element()&lt;br /&gt;
l_wyj1 = ndimage.binary_erosion(l_prog, structure = el).astype(l_prog.dtype)&lt;br /&gt;
py.imshow(l_wyj1, interpolation = 'nearest',cmap=py.cm.gray)&lt;br /&gt;
py.axis('off')&lt;br /&gt;
py.title('erozja')&lt;br /&gt;
&lt;br /&gt;
py.subplot(3,3,6)&lt;br /&gt;
el=element()&lt;br /&gt;
l_wyj2 = ndimage.binary_dilation(l_prog, structure = el).astype(l_prog.dtype)&lt;br /&gt;
py.imshow(l_wyj2, interpolation = 'nearest',cmap=py.cm.gray)&lt;br /&gt;
py.axis('off')&lt;br /&gt;
py.title('dylacja')&lt;br /&gt;
&lt;br /&gt;
py.subplot(3,3,9)&lt;br /&gt;
l_wyj3 = l_wyj2-l_wyj1&lt;br /&gt;
py.imshow(l_wyj3, interpolation = 'nearest',cmap=py.cm.gray)&lt;br /&gt;
py.axis('off')&lt;br /&gt;
py.title('erozja-dylacja')&lt;br /&gt;
&lt;br /&gt;
py.subplot(3,3,8)&lt;br /&gt;
el = np.array([[0, 1, 0],[1,1,1],[0,1,0]], dtype=bool)&lt;br /&gt;
l_wyj3 = ndimage.binary_erosion(l_prog, structure = el).astype(l_prog.dtype)-ndimage.binary_dilation(l_prog, structure = el).astype(l_prog.dtype)&lt;br /&gt;
py.imshow(l_wyj3, interpolation = 'nearest',cmap=py.cm.gray)&lt;br /&gt;
py.axis('off')&lt;br /&gt;
py.title(u'erozja-dylacja,mały element')&lt;br /&gt;
&lt;br /&gt;
py.subplot(3,3,4)&lt;br /&gt;
l_wyj4 = ndimage.binary_closing(l_prog, structure = el).astype(l_prog.dtype)&lt;br /&gt;
py.imshow(l_wyj4, interpolation = 'nearest',cmap=py.cm.gray)&lt;br /&gt;
py.axis('off')&lt;br /&gt;
py.title(u'domknięcie')&lt;br /&gt;
&lt;br /&gt;
py.subplot(3,3,5)&lt;br /&gt;
l_wyj5 = ndimage.binary_opening(l_prog, structure = el).astype(l_prog.dtype)&lt;br /&gt;
py.imshow(l_wyj5, interpolation = 'nearest',cmap=py.cm.gray)&lt;br /&gt;
py.axis('off')&lt;br /&gt;
py.title(u'otwarcie')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
py.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Segmentacja=&lt;br /&gt;
Na początek, do treningu wytworzymy obrazek zawierający kilka obiektów.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as py&lt;br /&gt;
from scipy import ndimage&lt;br /&gt;
from scipy import misc&lt;br /&gt;
&lt;br /&gt;
np.random.seed(1)&lt;br /&gt;
n = 10&lt;br /&gt;
l = 256&lt;br /&gt;
# generujemy pusty obrazek&lt;br /&gt;
im = np.zeros((l, l))&lt;br /&gt;
&lt;br /&gt;
# w losowych miejscach dorzucamy n punktów&lt;br /&gt;
points = l*np.random.random((2, n**2))&lt;br /&gt;
im[(points[0]).astype(np.int), (points[1]).astype(np.int)] = 1&lt;br /&gt;
&lt;br /&gt;
#rozmywamy punkty filtrem gaussowskim&lt;br /&gt;
im = ndimage.gaussian_filter(im, sigma=l/(4.*n))&lt;br /&gt;
&lt;br /&gt;
#progujemy maskę na połowie wartości średniej obrazka&lt;br /&gt;
mask = (im &amp;gt; im.mean()).astype(np.float)&lt;br /&gt;
&lt;br /&gt;
# wytwarzamy obrazek złożony z zaszumionej maski&lt;br /&gt;
img = mask + 0.2*np.random.randn(*mask.shape)&lt;br /&gt;
&lt;br /&gt;
#progujemy zszumiony obrazek&lt;br /&gt;
binary_img = img &amp;gt; 0.5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
hist, bin_edges = np.histogram(img, bins=60)&lt;br /&gt;
bin_centers = 0.5*(bin_edges[:-1] + bin_edges[1:])&lt;br /&gt;
&lt;br /&gt;
py.figure(figsize=(11,4))&lt;br /&gt;
&lt;br /&gt;
py.subplot(131)&lt;br /&gt;
py.imshow(img)&lt;br /&gt;
py.axis('off')&lt;br /&gt;
py.subplot(132)&lt;br /&gt;
#py.plot(bin_centers, hist, lw=2)&lt;br /&gt;
py.hist(img.ravel(),60)&lt;br /&gt;
py.axvline(0.5, color='r', ls='--', lw=2)&lt;br /&gt;
py.yticks([])&lt;br /&gt;
py.subplot(133)&lt;br /&gt;
py.imshow(binary_img, cmap=py.cm.gray, interpolation='nearest')&lt;br /&gt;
py.axis('off')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Segmentacja za pomocą funkcji &amp;lt;tt&amp;gt; ndimage.label&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# odszumiamy&lt;br /&gt;
# usuwamy białe kropki&lt;br /&gt;
open_img = ndimage.binary_opening(binary_img)&lt;br /&gt;
py.subplot(234)&lt;br /&gt;
py.imshow(open_img)&lt;br /&gt;
py.axis('off')&lt;br /&gt;
# usuwamy małe czarne dziury&lt;br /&gt;
close_img = ndimage.binary_closing(open_img)&lt;br /&gt;
py.subplot(235)&lt;br /&gt;
py.imshow(close_img)&lt;br /&gt;
py.axis('off')&lt;br /&gt;
# segmentujemy:&lt;br /&gt;
img_labeled,N_objects = ndimage.label(close_img)&lt;br /&gt;
py.subplot(236)&lt;br /&gt;
py.imshow(img_labeled.astype(np.float),interpolation='nearest')&lt;br /&gt;
py.colorbar()&lt;br /&gt;
py.axis('off')&lt;br /&gt;
py.title(str(N_objects)+u' obiektów')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Segmentacja przez analizę skupień (k-means)===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as py&lt;br /&gt;
from scipy import ndimage&lt;br /&gt;
from scipy import misc&lt;br /&gt;
#segmentacja przez analizę skupień&lt;br /&gt;
l=misc.lena()&lt;br /&gt;
from scipy.cluster.vq import kmeans,vq&lt;br /&gt;
K_opt = 8&lt;br /&gt;
centroids,_ = kmeans(l.ravel(),K_opt)&lt;br /&gt;
 &lt;br /&gt;
# przypisujemy klasę&lt;br /&gt;
idx,_ = vq(l.ravel(),centroids)&lt;br /&gt;
idx.shape = l.shape&lt;br /&gt;
py.figure(2)&lt;br /&gt;
py.subplot(1,2,1)&lt;br /&gt;
py.imshow(idx)#, cmap=py.cm.gray)&lt;br /&gt;
py.colorbar()&lt;br /&gt;
py.axis('off')&lt;br /&gt;
py.subplot(1,2,2)&lt;br /&gt;
tmp_obj = np.zeros((l.shape[0],l.shape[1]))&lt;br /&gt;
tmp_obj[np.where(idx==4)] = 1&lt;br /&gt;
py.imshow(tmp_obj)#, cmap=py.cm.gray)&lt;br /&gt;
py.axis('off')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Segmentacja przez rozrost===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as py&lt;br /&gt;
from scipy import ndimage&lt;br /&gt;
from scipy import misc&lt;br /&gt;
import sys&lt;br /&gt;
#segmentacja przez rozrost&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
def testuj(reg_id, x,y, do_sprawdzenia, prog = 10): &lt;br /&gt;
    global im_org, im_marked, reg_wsp, reg_wart  &lt;br /&gt;
    while len(do_sprawdzenia)&amp;gt;0:&lt;br /&gt;
        tmp_x,tmp_y = do_sprawdzenia.pop(0)&lt;br /&gt;
        #print 'testuje: ', tmp_x,tmp_y &lt;br /&gt;
        if tmp_x&amp;gt;=0 and tmp_y&amp;gt;=0 and tmp_x&amp;lt;im_org.shape[0] and tmp_y&amp;lt;im_org.shape[1]: # jeśli punkt wewnątrz obrazu&lt;br /&gt;
            if im_marked[tmp_x,tmp_y]==-1: # jeśli punkt nie należy do żadnego regionu&lt;br /&gt;
                if im_marked[tmp_x,tmp_y] != reg_id: #jeśli punkt nie należy do aktualnego regionu&lt;br /&gt;
                    if np.abs(im_org[tmp_x,tmp_y]-np.mean(reg_wart[reg_id])) &amp;lt; prog: #jeśli punkt ma wartość bliższą do średniej z obszaru niż próg&lt;br /&gt;
                        #to dodajemy punkt do listy bieżącego regionu, odhaczamy go na mapie regionów i dodajemy jego sąsiadów do listy, którą trzeba sprawdzić&lt;br /&gt;
                        reg_wsp[reg_id].append((tmp_x,tmp_y))&lt;br /&gt;
                        reg_wart[reg_id].append(im_org[tmp_x,tmp_y])&lt;br /&gt;
                        im_marked[tmp_x,tmp_y]=reg_id&lt;br /&gt;
                        do_sprawdzenia.append((tmp_x-1,tmp_y))&lt;br /&gt;
                        do_sprawdzenia.append((tmp_x  ,tmp_y+1))&lt;br /&gt;
                        do_sprawdzenia.append((tmp_x,  tmp_y-1))&lt;br /&gt;
                        do_sprawdzenia.append((tmp_x+1,tmp_y))&lt;br /&gt;
            &lt;br /&gt;
            &lt;br /&gt;
    return do_sprawdzenia&lt;br /&gt;
            &lt;br /&gt;
# wczytujemy lenę i wybieramy fragment z twarzą&lt;br /&gt;
l=misc.lena()&lt;br /&gt;
l = np.copy(l[200:400,200:400])&lt;br /&gt;
&lt;br /&gt;
global im_org, im_marked, reg_wsp, reg_wart&lt;br /&gt;
im_marked = -1*np.ones((l.shape[0],l.shape[1]),dtype='int')&lt;br /&gt;
im_org = l&lt;br /&gt;
# próg na odchylenie dołączanego punktu od średniej&lt;br /&gt;
prog = 35&lt;br /&gt;
&lt;br /&gt;
reg_wsp = []&lt;br /&gt;
reg_wart =[]&lt;br /&gt;
reg_id = 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
while np.sum(im_marked==-1)&amp;gt;0:&lt;br /&gt;
    # współrzędne punktu startowego bierzemy jako pierwsze z brzegu nie przypisane jeszcze do żadnego regionu&lt;br /&gt;
    x=np.where(im_marked==-1)[0][0] &lt;br /&gt;
    y=np.where(im_marked==-1)[1][0] &lt;br /&gt;
    # dodajemy miejsce na listę przechowującą współrzedne punktów należących do regionów i na ich wartości&lt;br /&gt;
    reg_wsp.append([])&lt;br /&gt;
    reg_wsp[reg_id].append((x,y))&lt;br /&gt;
    reg_wart.append([])&lt;br /&gt;
    reg_wart[reg_id].append(im_org[x,y])&lt;br /&gt;
    # odchaczamy na mapie regionów bieżący punkt jako przypisany do reg_id&lt;br /&gt;
    im_marked[x,y] = reg_id&lt;br /&gt;
    # inicjujemy listę punktów, które trzeba sprawdzić, czy nie należą do bieżącego regionu &lt;br /&gt;
    do_sprawdzenia = [(x-1,y),(x,y+1),(x,y-1),(x+1,y)]&lt;br /&gt;
    do_sprawdzenia = testuj(reg_id,x,y,do_sprawdzenia,prog)&lt;br /&gt;
    print  reg_id&lt;br /&gt;
    reg_id +=1&lt;br /&gt;
&lt;br /&gt;
# rysowanie wyników    &lt;br /&gt;
py.figure(2)&lt;br /&gt;
py.subplot(1,3,1)&lt;br /&gt;
py.imshow(l, interpolation='nearest', cmap=py.cm.gray)&lt;br /&gt;
py.axis('off')&lt;br /&gt;
py.title(u'oryginał')&lt;br /&gt;
py.subplot(1,3,2)&lt;br /&gt;
py.imshow(im_marked, interpolation='nearest')#, cmap=py.cm.gray)&lt;br /&gt;
py.axis('off')&lt;br /&gt;
py.title('po segmentacji')&lt;br /&gt;
py.subplot(1,3,3)&lt;br /&gt;
S = np.array([ len(reg_wart[i]) for i in range(len(reg_wart))])&lt;br /&gt;
id = np.where((S&amp;gt;5000))[0][0]&lt;br /&gt;
py.imshow(im_marked==id, interpolation='nearest')#, cmap=py.cm.gray)&lt;br /&gt;
py.axis('off')&lt;br /&gt;
py.title('obiekt '+str(id))&lt;br /&gt;
py.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
</feed>