<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.linuxformat.ru/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki.linuxformat.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mike2014</id>
		<title>Linuxformat - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.linuxformat.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mike2014"/>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:Contributions/Mike2014"/>
		<updated>2026-05-13T11:53:50Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.19.20+dfsg-0+deb7u3</generator>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF136:%D0%A1%D1%82%D0%B5%D0%B3%D0%B0%D0%BD%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1%8F</id>
		<title>LXF136:Стеганография</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF136:%D0%A1%D1%82%D0%B5%D0%B3%D0%B0%D0%BD%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1%8F"/>
				<updated>2014-04-22T08:50:57Z</updated>
		
		<summary type="html">&lt;p&gt;Mike2014: ссылка на автора&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;: '''Сте­га­но­гра­фия''' Скры­ва­ем цен­ные дан­ные в обыч­ных на вид изо­бра­же­ни­ях&lt;br /&gt;
&lt;br /&gt;
==''Perl'': Во­дя­ные зна­ки==&lt;br /&gt;
&lt;br /&gt;
{{Цикл/Perl}}[[Категория:Учебники]][[Категория:Perl]]&lt;br /&gt;
&lt;br /&gt;
: '''Часть 3''': Тот, кто при­ду­мал вы­ра­же­ние «ви­ла­ми на во­де пи­са­но», яв­но не знал про сте­га­но­гра­фию и не чи­тал ста­тьи [http://www.smirnov.sp.ru/ '''Ми­ха­ил Смир­нов'''].&lt;br /&gt;
&lt;br /&gt;
В эпо­ху гло­баль­ных ком­пь­ю­тер­ных систем необ­хо­ди­мость за­щи­ты кон­фи­ден­ци­аль­ной и сек­рет­ной ин­фор­ма­ции оче­вид­на и зло­бо­днев­на. Во мно­гих при­ло­жениях – на­при­мер, элек­трон­ном до­ку­мен­то­обо­ро­те – на­ря­ду с шиф­ро­ванием ин­фор­ма­ции возника­ет по­треб­ность сде­лать неза­мет­ным сам факт пе­ре­да­чи или хранения дан­ных. Ак­ту­аль­ность та­ких за­дач на­пря­мую свя­за­на с ростом кон­ку­рент­ной борь­бы, про­мыш­лен­ным шпио­на­жем, воз­растаю­щим кон­тро­лем го­су­дар­ствен­ных струк­тур над элек­трон­ны­ми сред­ства­ми свя­зи, проник­но­вением ха­ке­ров в ба­зы дан­ных. Одним из наи­бо­лее эф­фек­тив­ных спо­со­бов про­ти­во­дей­ствия та­ко­му вме­ша­тель­ству яв­ля­ет­ся со­кры­тие дан­ных (сте­га­но­гра­фия) в мас­си­ве циф­ро­во­го изо­бра­жения.&lt;br /&gt;
&lt;br /&gt;
Исто­ри­че­ски, по­яв­ление ме­то­дов встраи­вания циф­ро­вых во­дя­ных зна­ков в файл изо­бра­жения бы­ло обу­слов­ле­но про­бле­­ма­ми за­щи­ты ин­тел­лек­ту­аль­ной соб­ствен­но­сти – в ча­ст­но­сти, прав вла­дель­цев на фо­то­сним­ки в Интернете. Ре­шение этой зада­чи, в той или иной сте­пени, дости­га­ет­ся с по­мо­щью встраи­вания в за­щи­щае­мое изо­бра­жение ви­ди­мых или скры­тых циф­ро­вых во­дя­ных зна­ков или ме­ток. Досто­ин­ства ме­то­дов за­щи­ты с ис­поль­зо­ванием ви­ди­мых зна­ков из­вест­ны – это пре­ж­де все­го про­сто­та про­це­ду­ры на­ло­жения во­дя­ных зна­ков на за­щи­щае­мое изо­бра­жение и воз­мож­ность со­хранить во­дя­ной знак при пе­ча­ти.&lt;br /&gt;
&lt;br /&gt;
Наи­боль­шей по­пу­ляр­но­стью поль­зу­ет­ся встраи­вание во­дя­ных зна­ков с ре­гу­ли­руе­мой про­зрач­но­стью. С одним из ва­ри­ан­тов та­ко­го встраи­вания мы уже по­зна­ко­ми­лись в пер­вой ста­тье цик­ла ([[LXF134:Perl|LXF134]]). Уда­ление ви­ди­мых гра­фи­че­ских зна­ков мо­жет вы­лить­ся в весь­ма слож­ную и тру­до­ем­кую за­да­чу, и это сле­ду­ет от­нести к досто­ин­ствам. Недостат­ки встраи­вания ви­ди­мых во­дя­ных зна­ков, как ни па­ра­док­саль­но, со­сто­ят в их ви­ди­мо­сти. По­следнее об­стоя­тель­ство ши­ро­ко ис­поль­зу­ет­ся в под­поль­ной ин­ду­ст­рии кон­тра­факт­ной про­дук­ции для ти­ра­жи­ро­вания под­де­лок изо­бра­жений из­вест­ных тор­го­вых брен­дов.&lt;br /&gt;
&lt;br /&gt;
Про­ти­во­дей­ствие под­дел­кам мож­но осу­ще­ствить с по­мо­щью ме­то­дов встраи­вания скры­тых циф­ро­вых во­дя­ных зна­ков или ме­ток в файл изо­бра­жения-но­си­те­ля. В сфе­ре за­щи­ты ав­тор­ских прав основ­ной недоста­ток сте­но­гра­фи­че­ских ме­то­дов обу­слов­лен неустой­чи­во­стью скры­тых во­дя­ных зна­ков к раз­лич­ным ви­дам пре­об­ра­зо­ваний за­щи­щае­мо­го изо­бра­жения. Вме­сте с тем, в сфе­ре за­щи­ты кон­фи­ден­ци­аль­ной ин­фор­ма­ции этот ми­ нус ста­но­вит­ся плю­сом, обес­пе­чи­ваю­щим раз­ру­шение дан­ных при несанк­циониро­ван­ном вме­ша­тель­стве. Имен­но о реа­ли­за­ции этих ме­то­дов за­щи­ты кон­фи­ден­ци­аль­ной ин­фор­ма­ции с по­мо­щью про­грамм­но­го обес­пе­чения на язы­ке ''Perl'' и пой­дет речь ниже.&lt;br /&gt;
&lt;br /&gt;
===Дво­ич­ные во­дя­ные зна­ки===&lt;br /&gt;
&lt;br /&gt;
Изо­бра­жения, ис­поль­зуе­мые для встраи­вания скры­тых дан­ных, бу­дут пред­став­лять со­бой кон­тейнеры (но­си­те­ли) для пе­ре­да­чи или хранения сек­рет­ной ин­фор­ма­ции. При этом доступ для про­смот­ра изо­бра­жений мо­жет быть от­кры­тым и не вы­зы­вать по­доз­рений. Для хранения дан­ных в этом слу­чае мо­гут ис­поль­зо­вать­ся не толь­ко спе­циа­ли­зи­ро­ван­ные цен­тры дан­ных, но и обыч­ные HTTP-сер­ве­ры. Пе­ре­да­вае­мое со­об­щение пред­ва­ри­тель­но шиф­ру­ет­ся и пре­об­ра­зу­ет­ся в дво­ич­ную по­сле­до­ва­тель­ность. На сле­дую­щем эта­пе дво­ич­ная по­сле­до­ва­тель­ность встраи­ва­ет­ся в мас­сив дан­ных фай­ла изо­бра­жения. Раз­мер­ность встраи­вае­мых дан­ных за­ви­сит от спо­со­ба встраи­вания, объ­е­ма и яр­ко­ст­ных ха­рак­те­ри­стик изо­бра­жения-кон­тейнера. По­пыт­ки несанк­циониро­ван­но­го пре­об­ра­зо­вания изо­бра­жения-кон­тейнера при­во­дят к частич­ной или пол­ной по­те­ре скры­вае­мых дан­ных.&lt;br /&gt;
&lt;br /&gt;
Важней­шим эле­мен­том лю­бой ин­фор­ма­ци­он­ной систе­мы яв­ля­ет­ся шиф­ро­вание кон­фи­ден­ци­аль­ной ин­фор­ма­ции. Рас­смат­ри­вае­мая ме­то­до­ло­гия – не исклю­чение: дву­мер­ные крип­то­грам­мы ор­ганиче­ски встраи­ва­ют­ся в дву­мер­ные изо­бра­жения-кон­тейнеры. Со­вме­ст­ное ис­поль­зо­вание стегано­гра­фи­че­ско­го под­хо­да и крип­то­си­стем обес­пе­чи­ва­ет прак­ти­че­ски непре­одо­ли­мый барь­ер взло­му. При этом стой­кость шиф­ра к взло­му оп­ре­де­ля­ет­ся исклю­чи­тель­но стой­ко­стью (дли­ной) сек­рет­но­го клю­ча.&lt;br /&gt;
&lt;br /&gt;
===Ме­тод би­то­вых плоско­стей===&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF136_64_1.jpg|300px|Рис. 1]] Рис. 1. Дво­ич­ные дан­ные в би­то­вой плос­ко­сти изо­бра­же­ния.|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
Одним из наи­бо­лее из­вест­ных спо­со­бов со­кры­тия дан­ных (во­дя­ных зна­ков) в циф­ро­вом изо­бра­жении яв­ля­ет­ся ме­тод встраи­вания в би­то­вые плоско­сти изо­бра­жения. Би­то­вые плоско­сти или сре­зы – это про­сто раз­ря­ды циф­ро­во­го изо­бра­жения, на­хо­дя­щие­ся в одних и тех же по­ло­жениях в со­от­вет­ствую­щих дво­ич­ных чис­лах, пред­став­ляю­щих со­бой дан­ные изо­бра­жения. Их «ве­са» рав­ны 2&amp;lt;sup&amp;gt;M&amp;lt;/sup&amp;gt;, где M = 0,1,2, … – но­мер по­зи­ции. Ал­го­ритм встраи­вания осно­вы­ва­ет­ся на свой­ствах зри­тель­но­го воспри­ятия и реа­ли­зу­ет­ся та­ким об­ра­зом, что­бы внедряе­мые би­ты оста­ва­лись бы неза­мет­ны­ми при ви­зу­аль­ном рас­смот­рении циф­ро­во­го изо­бра­жения. Обыч­но для вы­полнения это­го усло­вия дан­ные встраи­ва­ют­ся в би­то­вую плоскость с наи­мень­шим ве­сом, рав­ным 2&amp;lt;sup&amp;gt;0&amp;lt;/sup&amp;gt; (млад­ший бит). Чем мень­ше вес вы­бран­ной би­то­вой плоско­сти для встраи­вания, тем мень­шее влияние ока­зы­ва­ет­ся на ка­че­ство изо­бра­жения-кон­тейнера, и тем менее за­мет­ны из­менения. На рис.1 пред­став­лен при­мер дву­мер­ной дво­ич­ной по­сле­до­ва­тель­но­сти дан­ных для со­кры­тия.&lt;br /&gt;
&lt;br /&gt;
Объ­ем '''Q''' сим­во­лов встраи­вае­мых дан­ных в по­лу­то­но­вое [grayscale] изображение мож­но под­счи­тать по фор­му­ле: '''Q=P*W*H/B''', где '''P''' – чис­ло би­то­вых плоско­стей, ис­поль­зуе­мых для встраи­вания, '''W''' и '''H''' – ши­ри­на и вы­со­та изо­бра­жения в пик­се­лях, со­от­вет­ствен­но, '''В''' — чис­ло бит на сим­вол. На рис. 2 по­ка­за­ны при­ме­ры встраи­вания дан­ных в би­то­вые плоско­сти цвет­но­го (RGB) изо­бра­жения.&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF136_65_1.jpg|500px|Рис. 2]] Рис. 2. Изо­бра­же­ния со встро­ен­ны­ми дво­ич­ны­ми дан­ны­ми: а) в би­то­вую плос­кость ну­ле­­во­го раз­ря­да и толь­ко ком­по­нен­ты Blue, б) в че­ты­ре би­то­вые плос­ко­сти всех RGB-ком­по­нент.|Ширина=500px}}&lt;br /&gt;
&lt;br /&gt;
В пер­вом слу­чае, на рис. 2а, для встраи­вания ис­поль­зу­ет­ся од­на би­то­вая плоскость наи­мень­ше­го ну­ле­во­го раз­ря­да 2&amp;lt;sup&amp;gt;0&amp;lt;/sup&amp;gt; толь­ко синей (Blue) ком­понен­ты изо­бра­жения. Фраг­мент про­грамм­ной реа­ли­за­ции для это­го слу­чая по­ка­зан ниже:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
 $Width3 = $Width * $nbyte;&lt;br /&gt;
 $wt = int($Width3/4);&lt;br /&gt;
 $wt = $wt*4;&lt;br /&gt;
 $ut = $Width3 - $wt;&lt;br /&gt;
 if($ut!=0){$ut = 4 - $ut;}&lt;br /&gt;
 for($j=0;$j&amp;lt;$Height; $j++){&lt;br /&gt;
 for($i=0;$i&amp;lt;$Width; $i++){&lt;br /&gt;
   bin[$i][$j] = int(rand(2));&lt;br /&gt;
 }}&lt;br /&gt;
 $bit_plan = 1;&lt;br /&gt;
 $rgb=0;&lt;br /&gt;
 for($j=0;$j&amp;lt;$Height; $j++){&lt;br /&gt;
   $y1=$j*($Width3 + $ut);&lt;br /&gt;
   $k=0;&lt;br /&gt;
   for($i=$rgb;$i&amp;lt;$Width3; $i+=3){		&lt;br /&gt;
     $tmp = ($BMP_IMG[$i + $y1]&amp;gt;&amp;gt; $bit_plan)&amp;lt;&amp;lt; $bit_plan;&lt;br /&gt;
   $BMP_IMG[$i + $y1] = $tmp + $bin[$k][$j];&lt;br /&gt;
   $k++;&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ис­ход­ное изо­бра­жение-кон­тейнер ши­ри­ной '''$Width''' и вы­со­той '''$Height''' пик­се­лей со­дер­жит­ся в мас­си­ве '''@BMP_IMG'''. В мас­си­ве '''@bin''' соз­да­ет­ся слу­чай­ная по­сле­до­ва­тель­ность дво­ич­ных чи­сел [0,1], ими­ти­рую­щих шиф­ро­ван­ную по­сле­до­ва­тель­ность скры­вае­мых дан­ных. Па­ра­метр '''$nbyte''' ра­вен 3 для цвет­но­го RGB-изо­бра­жения. В пе­ре­мен­ной '''$wt''' за­да­ет­ся ко­ли­че­ство слов в стро­ке изо­бра­жения фор­ма­та '''BITMAP'''. В пе­ре­мен­ную '''$tmp''' запи­сы­ва­ет­ся ре­зуль­тат об­ну­ления би­то­вой плоско­сти 2&amp;lt;sup&amp;gt;0&amp;lt;/sup&amp;gt; синей ком­понен­ты ('''$rgb=0''').&lt;br /&gt;
&lt;br /&gt;
Во вто­ром при­ме­ре, на рис.2б, для встраи­вания ис­поль­зу­ют­ся че­ты­ре би­то­вых плоско­сти млад­ших раз­ря­дов ка­ж­дой из RGB-ком­понент со­от­вет­ствен­но. Из сравнения изо­бра­жений на рис. 2а и рис. 2б вид­но, что чем боль­ше би­то­вых плоско­стей за­нима­ют встраи­вае­мые дан­ные, тем вы­ше сте­пень иска­жений, ви­ди­мых гла­зу. При­чем, кро­ме от­дель­ных шу­мо­вых вы­бро­сов, по­яв­ля­ют­ся лож­ные кон­ту­ры на уча­ст­ках изо­бра­жения с рав­но­мер­ным фо­ном (на­при­мер, на го­лу­бом небе). Фраг­мент про­грам­мы для это­го слу­чая по­ка­зан ниже.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
 $bit_plan=4;&lt;br /&gt;
 @BMP_IMG=map($_ &amp;gt;&amp;gt; $bit_plan, @BMP_IMG);&lt;br /&gt;
 @BMP_IMG=map($_ &amp;lt;&amp;lt; $bit_plan, @BMP_IMG);&lt;br /&gt;
 for($plan=0;$plan&amp;lt;$bit_plan;$plan++){&lt;br /&gt;
 for($rgb = 0;$rgb&amp;lt;$nbyte; $rgb++){&lt;br /&gt;
 for($j=0;$j&amp;lt;$Height; $j++){&lt;br /&gt;
   $y1=$j*($Width3 + $ut);&lt;br /&gt;
   $k=0;&lt;br /&gt;
   for($i=$rgb;$i&amp;lt;$Width3; $i+=3){		&lt;br /&gt;
     $BMP_IMG[$i + $y1] += $bin[$k][$j]*(1&amp;lt;&amp;lt;$plan);&lt;br /&gt;
   $k++;&lt;br /&gt;
 }}}}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Об­ну­ление би­то­вых плоско­стей осу­ще­ств­ля­ет­ся вне основ­ных цик­лов с по­мо­щью функ­ции '''map()'''.&lt;br /&gt;
&lt;br /&gt;
Умень­шить иска­жения от­части по­мо­га­ет при­менение в ка­че­стве кон­тейнеров тек­стур­ных изо­бра­жений. Ста­ти­сти­че­ские ха­рак­те­ри­сти­ки тек­стур по­зво­ля­ют оп­ти­ми­зи­ро­вать со­от­но­шение ме­ж­ду ко­ли­че­ством встраи­вае­мых дан­ных и ка­че­ством ви­зу­аль­но­го воспри­ятия. При­мер тек­стур­но­го кон­тейнера при встраи­вании дан­ных в че­ты­ре би­то­вые плоско­сти всех RGB-ком­понент по­ка­зан на рис. 3.&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF136_66_1.jpg|300px|Рис. 3]] Рис. 3. При­мер тек­стур­но­го кон­тей­не­ра со встро­ен­ны­ми дан­ны­ми в че­ты­ре би­то­вые плос­ко­сти всех RGB-ком­по­нент.|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
Объ­ем встраи­вае­мых дан­ных в при­ме­ре на рис. 3 при­близительно со­став­ля­ет '''Q = 1,18 МБ'''. Объ­ем ис­ход­но­го изо­бра­жения-кон­тейнера ра­вен 2,4 МБ. Ко­эф­фи­ци­ент ис­поль­зо­вания равен око­ло 49 %.&lt;br /&gt;
&lt;br /&gt;
Как мож­но су­дить из на­звания спо­со­ба, для встраи­вания дан­ных без по­терь необ­хо­ди­мо ис­поль­зо­вать гра­фи­че­ские BITMAP-фор­ма­ты ти­па BMP, TIFF и т. п. С этим свя­зан основ­ной недоста­ток дан­но­го спо­со­ба, обу­слов­лен­ный зна­чи­тель­ным объ­е­мом фай­лов изо­бра­жений в фор­ма­те BITMAP. Ес­ли этот фак­тор ока­жет­ся су­ще­ствен­ным, то мож­но восполь­зо­вать­ся струк­тур­ным спо­со­бом, пред­став­лен­ным ниже.&lt;br /&gt;
&lt;br /&gt;
===Струк­тур­ный спо­соб===&lt;br /&gt;
&lt;br /&gt;
На­стоя­щий спо­соб осно­вы­ва­ет­ся на ис­поль­зо­вании внут­ренней струк­ту­ры гра­фи­че­ских фор­ма­тов. По­след­няя пред­став­ля­ет со­бой неко­то­рую ор­ганиза­цию функ­цио­наль­ных и ин­фор­ма­ци­он­ных сег­мен­тов (по­лей) циф­ро­во­го изо­бра­жения. Имен­но в эти по­ля и встраи­ва­ют­ся сек­рет­ные дан­ные. Объ­ем встраи­вае­мых дан­ных мо­жет быть не свя­зан с раз­мер­но­стью изо­бра­жения-кон­тейнера. Основ­ное досто­ин­ство спо­со­ба со­сто­ит в том, что в ка­че­стве кон­тейнера мо­гут ис­поль­зо­вать­ся прак­ти­че­ски лю­бые струк­ту­ри­ро­ван­ные дан­ные, вклю­чая ме­диа­-фай­лы, до­ку­мен­ты PDF, ZIP и др. При­менение гра­фи­че­ских фор­ма­тов, до­пускаю­щих сжа­тие, по­зво­ля­ет зна­чи­тель­но по­вы­сить ко­эф­фи­ци­ент ис­поль­зо­вания фай­ла-кон­тейнера.&lt;br /&gt;
&lt;br /&gt;
Рас­смот­рим про­грамм­ную реа­ли­за­цию струк­тур­но­го встраи­вания на при­ме­ре фор­ма­та JPEG. Де­ление на сег­мен­ты в этом слу­чае осу­ще­ств­ля­ет­ся с по­мо­щью мар­ке­ров, ко­то­рые при­ня­то запи­сы­вать в ше­ст­на­дца­те­рич­ном ви­де '''0xFF 0xnn''', где ше­ст­на­дца­те­рич­ное чис­ло '''nn''' ука­зы­ва­ет на то, ка­кую функ­цио­наль­ную на­груз­ку несет тот или иной сег­мент. Лю­бой мар­кер на­чи­на­ет­ся бай­том '''0xFF'''. На­при­мер, значения '''0xFF 0xD8''', рас­по­ло­жен­ные в ну­ле­вом и пер­вом бай­тах фай­ла изо­бра­жения, обо­зна­ча­ют на­ча­ло изо­бра­жения (SOI) JPEG-фор­ма­та. '''0xFF 0xD9''' со­от­вет­ству­ет при­зна­ку кон­ца изо­бра­жения (EOI). Далее пред­став­лен ва­ри­ант про­грам­мы для встраи­вания сек­рет­ных дан­ных в по­ле пе­ред при­зна­ком на­ча­ла ин­фор­ма­ци­он­но­го бло­ка '''0xFF 0xС4''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
 open FIMG, “images/filein.jpg”;&lt;br /&gt;
 binmode(FIMG );&lt;br /&gt;
 @FILE_IMG=&amp;lt;FIMG&amp;gt;;&lt;br /&gt;
 close FIMG;&lt;br /&gt;
 $data=join(“”, @FILE_IMG);&lt;br /&gt;
 @JPG = unpack(“C*”, $data);&lt;br /&gt;
 $marker=”\xff\xc4”;&lt;br /&gt;
 $pos =index($data, $marker);&lt;br /&gt;
 $message=”сек­рет­ное со­об­ще­ние”;&lt;br /&gt;
 @C1 = unpack(“C*”, $message);&lt;br /&gt;
 @BEGIN=@JPG[0..$pos - 1];&lt;br /&gt;
 @END=@JPG[$pos..scalar(@JPG)];&lt;br /&gt;
 @UNIT=(@BEGIN,@C1,@END);&lt;br /&gt;
 $out = pack(“C*”, @UNIT);&lt;br /&gt;
 open JPEG, “&amp;gt;images/fileout.jpg”;&lt;br /&gt;
 binmode(JPEG);&lt;br /&gt;
 print JPEG $out;&lt;br /&gt;
 close JPEG;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В при­ве­ден­ном при­ме­ре встраи­вание дан­ных осу­ще­ств­ля­ет­ся во внут­ренний сег­мент фай­ла фор­ма­та JPEG, и по­это­му про­грам­ма долж­на от­сле­жи­вать воз­мож­ность по­яв­ления бай­тов '''0xFF''', пре­об­ра­зо­вы­вать их или уда­лять. Мож­но реа­ли­зо­вать бо­лее про­стой ва­ри­ант про­грам­мы, не тре­бую­щий ана­ли­за бай­тов '''0xFF''', ес­ли про­из­во­дить встраи­вание дан­ных в конец фай­ла. Ниже пред­став­лен при­мер встраи­вания в файл ар­хи­ва в фор­ма­те ZIP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
 open FILE, “$PATH/example.zip”;&lt;br /&gt;
 binmode(FILE);&lt;br /&gt;
 @FILE_ZIP=&amp;lt;FILE_ZIP&amp;gt;;&lt;br /&gt;
 close FILE;&lt;br /&gt;
 $zip=join(“”, @FILE_ZIP);&lt;br /&gt;
 @ZIP = unpack(“C*”, $zip);&lt;br /&gt;
 @UNIT=(@ZIP,0xff,0xd9);&lt;br /&gt;
 $out = $data.pack(“C*”, @UNIT);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
За­вер­шаю­щи­ми бай­та­ми встро­ен­ных дан­ных бу­дет при­знак кон­ца фай­ла: '''0xFF 0xD9'''. От­ме­тим, что объ­ем встраи­вае­мых дан­ных при ис­поль­зо­вании струк­тур­но­го спо­со­ба мо­жет быть про­из­воль­ным и зна­чи­тель­но пре­вы­шать раз­мер фай­ла изо­бра­жения-кон­тейнера, и не соз­да­вать при этом ника­ких ви­зу­аль­ных иска­жений. Недостат­ком рас­смот­рен­но­го под­хо­да бу­дет пред­ска­зуе­мость мест для встраи­вания скры­вае­мых дан­ных. При­менение об­лач­ных web-тех­но­ло­гий по­зво­ля­ет уст­ранить этот недоста­ток, ес­ли мы ра­зо­бьем скры­вае­мые дан­ные на '''N''' частей, встро­им их в '''N*L''' изо­бра­жений-кон­тейнеров и раз­местим на '''L''' HTTP-сер­ве­рах в Ин­тернете. С уче­том раз­ви­тия со­вре­мен­ных web-тех­но­ло­гий реа­ли­зо­вать по­доб­ное со­всем не слож­но.&lt;br /&gt;
&lt;br /&gt;
===Го­ло­гра­фи­че­ский под­ход===&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF136_66_2.jpg|400px|Рис. 4]] Рис. 4. Встраи­ва­ние об­раз­ца под­пи­си: а) кон­тей­нер со встро­ен­ной го­ло­грам­мой, б) ре­зуль­тат вос­ста­нов­ле­ния во­дя­но­го зна­ка.|Ширина=400px}}&lt;br /&gt;
&lt;br /&gt;
Счи­та­ет­ся, что с точ­ки зрения устой­чи­во­сти скры­тых во­дя­ных зна­ков к раз­лич­ным пре­об­ра­зо­ваниям (ата­кам) це­ле­со­об­раз­но встраи­вать дан­ные в сег­мент ви­део­дан­ных, то есть непо­сред­ствен­но в кар­тин­ку фай­ла изо­бра­жения. Одним из ин­те­рес­ных спо­со­бов, обес­пе­чи­ваю­щим, кро­ме все­го, со­хранение дан­ных при пе­ча­ти, яв­ля­ет­ся го­ло­гра­фи­че­ский под­ход. Про­цесс фо­то­-­пе­ча­ти пред­став­ля­ет со­бой каскад циф­ро-ана­ло­го­вых пре­об­ра­зо­ваний, ко­то­рые мо­гут оценивать­ся как экстре­маль­ные ата­ки. Фо­то­гра­фи­че­ское изо­бра­жение фор­ми­ру­ет­ся (ес­ли го­во­рить крат­ко) в про­цес­се вы­мы­вания и кри­стал­ли­за­ции га­ло­ид­но­го се­реб­ра в фо­то­но­си­те­ле. Ви­зуа­ли­за­ция и сте­пень по­темнения кар­тин­ки при этом обес­пе­чи­ва­ет­ся за счет раз­лич­ной плот­но­сти зе­рен кри­стал­ли­че­ско­го се­реб­ра. В циф­ро­вом изо­бра­жении, пик­се­лям, со­дер­жа­щим толь­ко млад­шие би­ты, бу­дут со­от­вет­ство­вать тем­ные уча­ст­ки изо­бра­жения, а пик­се­лям, имею­щим и стар­шие би­ты – свет­лые уча­ст­ки. Циф­ро­вое пред­став­ление изо­бра­жений име­ет де­ло с пик­се­ля­ми и би­та­ми, ана­ло­го­вое фо­то­гра­фи­че­ское ха­рак­те­ри­зу­ет­ся зер­на­ми и оп­ти­че­ской плот­но­стью. Оче­вид­но, что ме­то­ды, по­доб­ные ме­то­дам би­то­вых плоско­стей, не в со­стоянии обес­пе­чить со­хранение во­дя­ных зна­ков при пе­ча­ти изо­бра­жения-кон­тейнера.&lt;br /&gt;
&lt;br /&gt;
В го­ло­гра­фи­че­ском под­хо­де, в изо­бра­жение-кон­тейнер встраи­ва­ет­ся не сам во­дя­ной знак, а его циф­ро­вая го­ло­грам­ма.&lt;br /&gt;
&lt;br /&gt;
Фор­му­ла для встраи­вания циф­ро­вых го­ло­грамм '''h(x,y)''' в изо­бра­жение-кон­тейнер '''g(x,y)''' име­ет вид:&lt;br /&gt;
&lt;br /&gt;
 s(x,y) = g(x,y) + h(x,y),&lt;br /&gt;
&lt;br /&gt;
где '''s(x,y)''' – ре­зуль­ти­рую­щее изо­бра­же­ние со встро­ен­ной го­ло­грам­мой во­дя­но­го зна­ка '''W(u,v)'''. По­лу­че­ние го­ло­грам­мы осу­ще­ст­в­ля­ет­ся с по­мо­щью об­рат­но­го пре­об­ра­зо­ва­ния Фу­рье&lt;br /&gt;
&lt;br /&gt;
 h(x,y) = F&amp;lt;sup&amp;gt;-1&amp;lt;/sup&amp;gt;{W1(u,v)}, (1)&lt;br /&gt;
&lt;br /&gt;
где F&amp;lt;sup&amp;gt;-1&amp;lt;/sup&amp;gt; – опе­ра­тор об­рат­но­го пре­об­ра­зо­вания Фу­рье, '''W1(u,v) = W(u-m,v-N) + W(-u-m,-v-N)''' – сум­ма изо­бра­жений во­дяно­го зна­ка и его зеркаль­но­го от­ра­жения, '''m''' и '''N''' – сме­щение от­но­си­тель­но на­ча­ла ко­ор­ди­нат в частот­ной плоско­сти '''u,v'''. Па­ра­мет­ры '''m''' и '''N''' яв­ля­ют­ся клю­ча­ми го­ло­грам­мы. Рас­смот­рим фраг­мент ко­да для вы­чис­ления го­ло­грам­мы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
 for($y=0;$y&amp;lt;$NN; $y++){&lt;br /&gt;
  for($x=0;$x&amp;lt;$NN; $x++){&lt;br /&gt;
   $wx[$x][$y]=0;&lt;br /&gt;
   $wy[$x][$y]=0;&lt;br /&gt;
 }}&lt;br /&gt;
 for($y=0;$y&amp;lt;$Yh; $y++){&lt;br /&gt;
  for($x=0;$x&amp;lt;$Xw; $x++){&lt;br /&gt;
   $wx[$x+$M][$y+$N] = $W[$x][$y];&lt;br /&gt;
   $wx[$NN ­ $x ­ $M ­1][$NN ­ $y ­ $N ­1] = $W[$x][$y];&lt;br /&gt;
 }}&lt;br /&gt;
 &amp;amp;d2cdfti(\@wx,\@wy,\$NN,\$PI);&lt;br /&gt;
 for($y=0;$y&amp;lt;$NN; $y++){&lt;br /&gt;
  for($x=0;$x&amp;lt;$NN; $x++){&lt;br /&gt;
   $h[$x][$y]=$wx[$x][$y];&lt;br /&gt;
 }}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Дву­мер­ное об­рат­ное пре­об­ра­зо­вание Фу­рье вы­пол­ня­ет­ся с по­мо­щью под­про­грам­мы '''d2cdfti()''', код ко­то­рой был пред­став­лен в пре­ды­ду­щей ста­тье это­го цик­ла. Раз­мер квад­рат­ной мат­ри­цы изо­бра­жения контейнера '''g(x,y)''' за­да­ет­ся па­ра­мет­ром '''$NN''', а раз­ме­ры мас­си­ва '''@W''' во­дя­но­го зна­ка '''W(u,v)''' за­да­ют­ся пе­ре­мен­ны­ми '''$Yh''' и '''$Xw'''. Па­ра­мет­ры сме­щения '''$N''' и '''$M''' не долж­ны пре­вы­шать по­ло­ви­ны '''$NN''' за вы­че­том '''$Yh''' и '''$Xw''', со­от­вет­ствен­но.&lt;br /&gt;
&lt;br /&gt;
Основ­ной недоста­ток это­го спо­со­ба свя­зан с ог­раничен­ным объ­е­мом встраи­вае­мых дан­ных. Наи­бо­лее це­ле­со­об­раз­но при­ме­нять го­ло­гра­фи­че­ский под­ход для со­кры­тия неболь­ших изо­бра­жений, восста­нов­ление ко­то­рых до­пуска­ет неко­то­рую по­те­рю ка­че­ства (по­доб­но JPEG): об­раз­цов подпи­сей, от­пе­чат­ков паль­цев, но­ме­ра и се­рии пас­пор­та и т. п. На рис. 4а пред­став­ле­но изо­бра­жение-кон­тейнер в фор­ма­те JPEG со встро­ен­ным фак­си­миль­ным об­раз­чиком подпи­си. Ка­че­ство JPEG-изо­бра­жения наи­выс­шее – 100 %. На рис. 4б по­ка­зан ре­зуль­тат восста­нов­ления об­раз­ца подпи­си; па­ра­мет­ры сме­щения '''N''' и '''m''' со­став­ля­ли 118 и 120 пик­се­лей, со­от­вет­ствен­но. Ва­ри­ант для со­кры­тия дак­ти­ло­ско­пи­че­ско­го от­пе­чат­ка ил­лю­ст­ри­ру­ет­ся на рис. 5а. Дво­ич­ное изо­бра­жение во­дя­но­го зна­ка встраи­ва­лось во все три RGB-ком­понен­ты. Ка­че­ство JPEG-изо­бра­жения бы­ло средним и рав­ня­лось 50 %, а сжа­тие по сравнению со 100 % ка­че­ством со­ста­ви­ло 75 %. На рис. 5б пред­став­лен ре­зуль­тат восста­нов­ления об­раз­ца от­пе­чат­ка с па­ра­мет­ра­ми сме­щения '''N''' и '''m''' рав­ны­ми 199 и 204 пик­се­лей, со­от­вет­ствен­но.&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF136_67_1.jpg|400px|Рис. 5]] Рис. 5. Встраи­ва­ние об­раз­ца от­пе­чат­ка паль­ца: а) кон­тей­нер со встро­ен­ной го­ло­грам­мой, б) ре­зуль­тат вос­ста­нов­ле­ния во­дя­но­го зна­ка.|Ширина=400px}}&lt;br /&gt;
&lt;br /&gt;
На рис. 4б и рис. 5б восста­нов­лен­ные об­раз­цы во­дя­ных зна­ков име­ют зеркаль­ное ото­бра­жение, что обу­слов­ле­но по­яв­лением мнимо­го изо­бра­жения при восста­нов­лении го­ло­грам­мы Фу­рье. Про­цесс восста­нов­ления го­ло­грам­мы яв­ля­ет­ся про­це­ду­рой, об­рат­ной встраи­ванию во­дя­ных зна­ков, и по­это­му, в со­от­вет­ствии с фор­му­лой (1), по­тре­бу­ет­ся вы­полнить пря­мое пре­об­ра­зо­вание Фу­рье изо­бра­жения-кон­тейнера. От­ме­тим, что для об­на­ру­жения и восста­нов­ления сек­рет­ных дан­ных тре­бу­ет­ся ап­ри­ор­ное знание па­ра­мет­ров '''N''' и '''m''', при ко­то­рых соз­да­ва­лась го­ло­грам­ма.&lt;br /&gt;
&lt;br /&gt;
В слу­чае, ес­ли изо­бра­жение со встро­ен­ным во­дя­ным зна­ком бы­ло со­хранено в ви­де твер­дой ко­пии – на­при­мер, нанесе­но на кре­дит­ную кар­ту (рис. 6) – то пе­ред восста­нов­лением по­тре­бу­ет­ся сна­ча­ла отсканиро­вать фо­то­изо­бра­жение с кар­точ­ки, а за­тем уже при­менить про­грамм­ное обес­пе­чение для из­вле­чения об­раз­ца во­дя­но­го зна­ка.&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF136_67_2.jpg|300px|Рис. 6]] Рис. 6. Блок-схе­ма про­цес­са иден­ти­фи­ка­ции вла­дель­ца кре­дит­ной кар­ты.|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
Фо­то­изо­бра­жение на рис. 6 счи­ты­ва­ет­ся с по­мо­щью сканера на ПЗС-мат­ри­це, под­вер­га­ет­ся пре­об­ра­зо­ваниям с це­лью восста­нов­ления скры­то­го во­дя­но­го зна­ка, и за­тем скры­тая ин­фор­ма­ция вы­во­дит­ся на дис­плей. На схе­ме, скры­тые дан­ные пред­став­ля­ют со­бой гра­фи­че­ское изо­бра­жение зна­ка ко­пи­рай­та ©.&lt;br /&gt;
&lt;br /&gt;
Мы по­зна­ко­ми­лись с весь­ма неболь­шим пред­ста­ви­тель­ством спо­со­бов для встраи­вания циф­ро­вых во­дя­ных зна­ков в фай­лы изо­бра­жений. Вме­сте с тем, мы за­тро­ну­ли важ­ные ас­пек­ты встраи­вания как скры­тых, так и ви­ди­мых во­дя­ных зна­ков. Уз­на­ли, как восполь­зо­вать­ся об­лач­ной web-тех­но­ло­ги­ей при встраи­вании скры­вае­мой ин­фор­ма­ции во мно­же­стве изо­бра­жений и раз­ме­щении этих изо­бра­жений на мно­же­стве сер­ве­ров. Рас­смот­ре­ли спо­соб, по­зво­ляю­щий вос­ста­но­вить скры­тый во­дя­ной знак из изо­бра­же­ния, ко­то­рое бы­ло пред­ва­ри­тель­но на­пе­ча­та­но на твер­дом но­си­те­ле. По-мо­ему, для че­ты­рех стра­ниц – весь­ма не­пло­хо.&lt;/div&gt;</summary>
		<author><name>Mike2014</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF137:Perl</id>
		<title>LXF137:Perl</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF137:Perl"/>
				<updated>2014-04-22T08:49:17Z</updated>
		
		<summary type="html">&lt;p&gt;Mike2014: ссылка на автора&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;: '''Рас­по­зна­ва­ние об­ра­зов''' На­пи­шем про­грам­му, ко­то­рая чи­та­ет но­мер­ные зна­ки ав­то­мо­би­лей &lt;br /&gt;
&lt;br /&gt;
==Perl: Об­на­ру­жим объ­ек­ты==&lt;br /&gt;
&lt;br /&gt;
{{Цикл/Perl}}[[Категория:Учебники]][[Категория:Perl]]&lt;br /&gt;
&lt;br /&gt;
: '''Часть 4''': Реа­ли­за­ция объ­ек­тов в ''Perl'' ос­тав­ля­ет же­лать луч­ше­го, но это не зна­чит, что с его по­мо­щью нель­зя на­хо­дить объ­ек­ты на фо­то­гра­фи­ях, счи­та­ет [http://www.smirnov.sp.ru/ '''Ми­ха­ил Смир­нов'''].&lt;br /&gt;
&lt;br /&gt;
Мно­гие прак­ти­че­ские при­ло­жения об­ра­бот­ки и ана­ли­за изо­бра­жений вклю­ча­ют про­це­ду­ру об­на­ру­жения и рас­по­зна­вания объ­ек­тов. В эту сфе­ру по­па­да­ют мно­гие за­да­чи со­вре­мен­но­сти: от ме­ди­цин­ских ис­сле­до­ваний до на­ви­га­ции ав­то­ма­ти­че­ских косми­че­ских стан­ций. В исто­ри­че­ском плане наи­боль­шую из­вест­ность по­лу­чи­ли ме­то­ды сравнения с эта­ло­ном, оцениваю­щие сте­пень кор­ре­ля­ции объ­ек­та об­на­ру­жения и эта­ло­на. В по­следние де­ся­ти­ле­тия ин­тен­сив­но раз­ви­ва­лись ме­то­ды рас­по­зна­вания об­ра­зов, осно­ван­ные на фор­маль­ном (струк­тур­ном или се­ман­ти­че­ском) опи­сании изо­бра­жений. К успе­хам фор­маль­ных опи­саний мож­но отнести при­ло­жения по рас­по­зна­ванию пе­чат­но­го тек­ста, от­пе­чат­ков паль­цев, клас­си­фи­ка­ции хро­мо­сом в био­ме­ди­цин­ских при­ло­жениях и так да­лее. В рас­по­зна­вании об­ра­зов по­лу­чи­ли дальней­шее раз­ви­тие и искусствен­&lt;br /&gt;
ные ней­рон­ные се­ти, основ­ное пре­иму­ще­ство ко­то­рых за­клю­ча­ет­ся в на­ли­чии универ­саль­но­го ме­ханиз­ма обу­чения. Вме­сте с тем, в ря­де экстре­маль­ных за­дач об­на­ру­жения ме­тод сравнения с эта­ло­ном оста­ет­ся до­минирую­щим.&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF137_73_1.jpg|Рис. 1|300px]]   Рис. 1. Фотогра­фическая карта местности: а) полутоновое входное изображе­ние; б) контурное представление.|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
Яр­ким при­ме­ром слу­жат систе­мы на­ви­га­ции и на­ве­дения кры­ла­тых ра­кет по рель­е­фу ме­ст­но­сти. В ка­че­стве эта­ло­нов ис­поль­зу­ют­ся кар­ты ме­ст­но­сти, изо­бра­жения ко­то­рых пред­ва­ри­тель­но за­но­сят­ся в па­мять бор­то­во­го ком­пь­ю­те­ра. В хо­де по­ле­та ви­део­систе­ма ра­ке­ты сканиру­ет ме­ст­ность, а ком­пь­ю­тер оценива­ет кор­ре­ля­цию те­ку­ще­го изо­бра­жения ме­ст­но­сти с на­бо­ром эта­ло­нов и кор­рек­ти­ру­ет по­ло­жение ра­ке­ты в про­стран­стве от­но­си­тель­но рас­чет­ной тра­ек­то­рии по­ле­та. В систе­му на­ве­дения кры­ла­той ра­ке­ты вхо­дит элек­трон­но-оп­ти­че­ская кор­ре­ля­ци­он­ная под­систе­ма, ко­то­рая вы­да­ет ре­зуль­та­ты в ре­аль­ном вре­мени. Циф­ро­вые кар­ти­ны-эта­ло­ны пред­ва­ри­тель­но от­сня­тых рай­онов ме­ст­но­сти по­сле­до­ва­тель­но вво­дят­ся в элек­трон­но-оп­ти­че­ский кор­ре­ля­тор по ме­ре пе­ре­ме­щения ра­ке­ты вдоль тра­ек­то­рии по­ле­та. Бор­то­вой ком­пь­ю­тер оценива­ет ве­ли­чи­ны кор­ре­ля­ции и про­кла­ды­ва­ет курс ра­ке­ты по рель­е­фу ме­ст­но­сти. Нуж­но от­ме­тить, что в со­от­вет­ствии со свой­ства­ми зри­тель­но­го воспри­ятия для улуч­шения ре­зуль­та­тов сравнения при­ме­ня­ет­ся кор­ре­ля­ция по кон­ту­рам рель­е­фа ме­ст­но­сти. На рис. 1 пред­став­лен при­мер фо­то­гра­фи­че­ской кар­ты ме­ст­но­сти и её кон­тур­ное (гра­ди­ент­ное) пред­став­ление. Кон­тур­ное пред­став­ление мо­жет быть по­лу­че­но с по­мо­щью, на­при­мер, диф­фе­рен­ци­аль­но­го опе­ра­то­ра Со­бе­ля или с по­мо­щью вы­со­ко­частот­ной фильт­ра­ции ви­део­дан­ных.&lt;br /&gt;
&lt;br /&gt;
Ра­зу­ме­ет­ся, на дан­ном уро­ке мы по­ста­вим пе­ред со­бой бо­лее скром­ную и ку­да бо­лее мир­ную за­да­чу, а имен­но: реа­ли­зу­ем об­на­ру­жи­тель-кор­ре­ля­тор для про­стых сцен. Для нас бу­дет ва­жен прин­цип по­строения та­ко­го об­на­ру­жи­те­ля на прак­ти­че­ском уровне с по­мо­щью про­грамм­ных средств язы­ка ''Perl''.&lt;br /&gt;
&lt;br /&gt;
===Об­на­ру­жение, раз­ли­чение, опознавание===&lt;br /&gt;
&lt;br /&gt;
Джон­сон [J. Johnson], ис­сле­дуя влияние ви­део­систем на воспри­ятие во­ен­ных объ­ек­тов, уста­но­вил три основ­ных уров­ня ви­дения, ха­рак­те­ри­зую­щих про­цесс ото­жде­ств­ления изо­бра­жений дан­ных объ­ек­тов: об­на­ру­жение (по­яв­ление объ­ек­та в по­ле зрения), раз­ли­чение (раз­биение на клас­сы: тан­ки, ав­то­мо­би­ли) и опо­зна­вание ти­па объ­ек­та (на­при­мер, на­блю­да­ет­ся танк t-72). На рис. 2 ил­лю­ст­ри­ру­ет­ся кри­те­рий Джон­со­на, где сле­ва по­ка­за­ны пе­рио­ды строч­ной раз­верт­ки те­ле­ви­зи­он­ной систе­мы на­блю­дения, а спра­ва – кон­тур­ное изо­бра­жение ав­то­мо­би­ля. Та­ким об­ра­зом, Джон­сон уста­но­вил, что чис­ло по­лу­пе­рио­дов раз­верт­ки, при­хо­дя­щих­ся на минималь­ный раз­мер объ­ек­та, долж­но быть рав­но 2 (+1/-0.5) для об­на­ру­жения (рис. 2а), 8 (+1.6/-0.4) для клас­си­фи­ка­ции (рис. 2б) и 12.8 (+3.2/-2.8) для опо­зна­вания (рис. 2в).&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF137_73_2.jpg|Рис. 2|300px]]  Рис. 2. Иллюстрации к критерию Джонсона: а) уровень обнаруже­ния объектов; б) уровень классификации объектов; в) уровень опо­знавания типа объекта.|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
Сле­до­ва­тель­но, ес­ли мы уста­но­вим, что в изо­бра­жении име­ют­ся тан­ки и ав­то­ма­ши­ны, то мы ре­шим за­да­чу об­на­ру­жения. Ес­ли нам уда­ст­ся от­де­лить изо­бра­жения тан­ков от изо­бра­жений ав­то­мо­би­лей, то мы ре­шим за­да­чу клас­си­фи­ка­ции. И, на­конец, ес­ли мы смо­жем ска­зать, что танк на изо­бра­жении яв­ля­ет­ся россий­ским т-72, а не аме­ри­кан­ским M1A2, мы ре­шим за­да­чу опо­зна­вания ти­па.&lt;br /&gt;
&lt;br /&gt;
===Зна­чи­мость кон­ту­ров===&lt;br /&gt;
&lt;br /&gt;
Из ис­сле­до­ваний зри­тель­но­го ана­ли­за­то­ра из­вест­но, что основ­ную ин­фор­ма­цию о зри­тель­ных об­раз­ах несут кон­ту­ры объ­ек­тов и рез­кие пе­ре­па­ды яр­ко­сти на границах по­следних. Про­стей­шей про­це­ду­рой для вы­де­ления кон­ту­ров объ­ек­тов яв­ля­ет­ся вы­чис­ление раз­но­стей зна­чений яр­ко­сти ме­ж­ду со­седними эле­мен­та­ми изо­бра­жения, что пред­став­ля­ет со­бой про­це­ду­ру диф­фе­рен­ци­ро­вания. Чем боль­ше бу­дут эти раз­но­сти, тем сильнее про­явят­ся кон­ту­ры объ­ек­тов в изо­бра­жении. Наи­боль­шим зна­чениям раз­но­стей бу­дут со­от­вет­ство­вать мак­си­му­мы гра­ди­ен­та яр­ко­сти. Эк­ви­ва­лен­том про­стран­ствен­но­му диф­фе­рен­ци­ро­ванию в плоско­сти изо­бра­жения бу­дет при­менение гра­ди­ент­но­го фильт­ра в частот­ной об­ласти. При­ме­ром та­ко­го фильт­ра мо­жет слу­жить фор­му­ла:&lt;br /&gt;
&lt;br /&gt;
 H(u,v) = u&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; + v&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где ''u, v'' – про­стран­ствен­ные часто­ты. Дей­ствие дан­но­го фильт­ра как раз и пред­став­ле­но на рис. 1а. Про­грамм­ную реа­ли­за­цию гра­ди­ент­но­го фильт­ра мы рас­смот­рим чуть ниже, со­вме­ст­но с вы­полнением про­це­ду­ры сравнения с эта­ло­ном, ко­то­рая по­лу­чи­ла на­звание со­гла­со­ван­ной фильт­ра­ции.&lt;br /&gt;
&lt;br /&gt;
===Со­гла­со­ван­ная фильт­ра­ция===&lt;br /&gt;
&lt;br /&gt;
Со­гла­со­ван­ный фильтр был впер­вые ис­поль­зо­ван для об­на­ру­жения сиг­на­лов в ра­дио­ло­ка­ции. В од­ной из пре­ды­ду­щих ста­тей цик­ла ([[LXF135:Perl|LXF135]]) мы рас­смот­ре­ли про­це­ду­ру фильт­ра­ции для по­вы­шения ка­че­ства фо­то­изо­бра­жения. Для это­го мы сфор­ми­ро­ва­ли фильтр ''H(u,v)'' и ум­но­жи­ли его на спектр фо­то­изо­бра­жения ''S(u,v)''. На фор­маль­ном уровне, с по­зи­ции тео­рии линей­ной фильт­ра­ции, как фильтр для по­вы­шения ка­че­ства, так и фильтр для со­гла­со­ван­ной фильт­ра­ции рав­но­цен­ны. Основ­ное от­ли­чие со­гла­со­ван­но­го фильт­ра со­сто­ит в том, что его им­пульс­ная ха­рак­те­ри­сти­ка ''h(x,y)'' долж­на быть со­гла­со­ва­на и со­пря­же­на с функ­ци­ей объ­ек­та ''s(x,y)'':&lt;br /&gt;
&lt;br /&gt;
 h(x,y) = s(x&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;-x, y&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;-y).  (1)&lt;br /&gt;
&lt;br /&gt;
Бу­дем пе­ре­ме­щать от­клик ''h(x,y)'' от­но­си­тель­но объ­ек­та и вы­чис­лять кор­ре­ля­цию ме­ж­ду дву­мя эти­ми функ­ция­ми. Оче­вид­но, что мак­си­мум кор­ре­ля­ции бу­дет достиг­нут в мо­мент их со­вме­щения. Та­кая про­це­ду­ра по­лу­чи­ла на­звание сверт­ки двух функ­ций. Функ­ция со­гла­со­ван­но­го фильт­ра рас­счи­ты­ва­ет­ся как пре­об­ра­зо­вание Фу­рье функ­ции от­кли­ка (1):&lt;br /&gt;
&lt;br /&gt;
 H(u,v) = S&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;(u,v)exp{-j(u·x&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; + v·y&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;)},  (2)&lt;br /&gt;
&lt;br /&gt;
где ''S(u,v)'' – спектр эта­ло­на (1), ''j'' – мнимая единица, а знак '''*''' обо­зна­ча­ет ком­плекс­ное со­пря­жение. Как мы ви­дим, функ­ция со­гла­со­ван­но­го фильт­ра яв­ля­ет­ся ком­плекс­ной, и по­это­му в про­грамм­ной реа­ли­за­ции мы долж­ны пре­ду­смот­реть пе­ре­мно­жение ком­плекс­ных чи­сел. Ниже пред­став­лен про­грамм­ный код, реа­ли­зую­щий со­гла­со­ван­ную фильт­ра­цию с по­мо­щью гра­ди­ент­но­го со­гла­со­ван­но­го фильт­ра. Вход­ное изо­бра­жение пред­ва­ри­тель­но за­но­сит­ся в дву­мер­ный мас­сив '''@re'''. Раз­мер­ность вход­но­го изо­бра­жения рав­на '''N × N''' то­чек и оп­ре­де­ля­ет­ся в про­грам­ме па­ра­мет­ром '''$N''', а раз­мер­ность эта­ло­на ''s(x,y)'' за­да­ет­ся па­ра­мет­ра­ми '''$sx''' по ши­рине и '''$sy''' по вы­со­те.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
 for($j=0;$j&amp;lt;$N; $j++){&lt;br /&gt;
 for($i=0;$i&amp;lt;$N; $i++){&lt;br /&gt;
    $im[$i][$j] = 0;&lt;br /&gt;
    $re1[$i][$j] = 0;&lt;br /&gt;
    $im1[$i][$j] = 0;&lt;br /&gt;
 }}&lt;br /&gt;
 &amp;amp;d2cdft( \@re,\@im,\$N,\$PI );&lt;br /&gt;
 for($j=0;$j&amp;lt;$sy; $j++){&lt;br /&gt;
 for($i=0;$i&amp;lt;$sx; $i++){&lt;br /&gt;
    $re1[$i][$j] = $s[$i][$j];&lt;br /&gt;
 }}&lt;br /&gt;
 &amp;amp;d2cdft( \@re1,\@im1,\$N,\$PI );&lt;br /&gt;
 $N2 = int($N/2);&lt;br /&gt;
 for($j=0;$j&amp;lt;$N; $j++){&lt;br /&gt;
    $u = $j;&lt;br /&gt;
    if($j &amp;gt; $N2) { $u = $j - $N;}&lt;br /&gt;
    for($i=0;$i&amp;lt;$N; $i++){&lt;br /&gt;
       $v = $i;&lt;br /&gt;
       if($i &amp;gt; $N2) { $v = $i - $N;}&lt;br /&gt;
       $gr = ($u**2 + $v**2)/$N;&lt;br /&gt;
       $Ure = $gr*( $re[$i][$j]*$re1[$i][$j] + $im[$i][$j]*$im1[$i][$j] );&lt;br /&gt;
       $im = $gr*( $im[$i][$j]*$re1[$i][$j] - $re[$i][$j]*$im1[$i][$j] );&lt;br /&gt;
       $re[$i][$j] = $Ure;&lt;br /&gt;
       $im[$i][$j] = $im;&lt;br /&gt;
 }}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
По­сле пре­об­ра­зо­вания Фу­рье вход­но­го изо­бра­жения '''@re''' эле­мен­ты мас­си­ва '''$re[$i][$j]''' и '''$im[$i][$j]''' бу­дут пред­став­лять со­бой ве­ще­ствен­ную и мнимую части спек­тра ис­ход­но­го изо­бра­жения. Пре­об­ра­зо­вание Фу­рье осу­ще­ств­ля­ет­ся с по­мо­щью под­про­грам­мы '''d2cdft()''' бы­ст­ро­го пре­об­ра­зо­вания Фу­рье, опи­сание ко­то­рой бы­ло да­но в пре­ды­ду­щих стать­ях цик­ла ([[LXF135:Perl|LXF135]]).&lt;br /&gt;
&lt;br /&gt;
Ком­плекс­ные эле­мен­ты мас­си­вов '''$re1[$i][$j]''' и '''$im1[$i][$j]''' со­гла­со­ван­но­го фильт­ра так­же по­лу­че­ны с по­мо­щью под­про­грам­мы '''d2cdft()''', ко­то­рая при­ме­ня­ет­ся к функ­ции эта­ло­на. Пе­ре­мно­жение эле­мен­тов мас­си­ва спек­тра ис­ход­но­го изо­бра­жения и эле­мен­тов со­гла­со­ван­но­го фильт­ра осу­ще­ств­ля­ет­ся по пра­ви­лу ум­но­жения двух ком­плекс­ных чи­сел. Ре­зуль­тат пе­ре­мно­жения ком­плекс­ных чи­сел ум­но­жа­ет­ся на зна­чения функ­ции гра­ди­ент­но­го фильт­ра '''$gr''', вы­чис­ляе­мой в ка­ж­дой точ­ке спек­тра как сум­мы квад­ра­тов про­стран­ствен­ных частот (транс­фор­мант) '''$u''' и '''$v'''.&lt;br /&gt;
&lt;br /&gt;
Что­бы по­лу­чить ре­зуль­ти­рую­щие кор­ре­ля­ци­он­ные от­кли­ки, необ­хо­ди­мо вы­полнить об­рат­ное пре­об­ра­зо­вание Фу­рье с по­мо­щью под­про­грам­мы '''d2cdfti()''' в со­от­вет­ствии с про­грамм­ным ко­дом:&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF137_74_1.jpg|Рис. 3|300px]] Рис. 3. Обнаруже­ние символов циф­ры 3: а) исходное изображение; б) результат согла­сованной фильтра­ции с двоичным эталоном цифры 3; в) сечение корреля­ционного поля.|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
 &amp;amp;d2cdfti( \@re,\@im,\$N,\$PI );&lt;br /&gt;
 $max = 0;&lt;br /&gt;
 for($j=0;$j&amp;lt;$N; $j++){&lt;br /&gt;
 for($i=0;$i&amp;lt;$N; $i++){&lt;br /&gt;
      if( $re[$i][$j] &amp;gt; $max){ $max = abs($re[$i][$j]);}&lt;br /&gt;
 }}&lt;br /&gt;
 for($j=0;$j&amp;lt;$N; $j++){&lt;br /&gt;
 for($i=0;$i&amp;lt;$N; $i++){&lt;br /&gt;
      $out[$i][$j] = abs(255*($re[$i][$j]/$max));&lt;br /&gt;
 }}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Дву­мер­ные мас­си­вы '''@re''' и '''@im''', на вхо­де под­про­грам­мы '''d2cdfti()''', яв­ля­ют­ся ре­зуль­та­том ум­но­жения спек­тра вход­но­го изо­бра­жения на со­гла­со­ван­ный фильтр, как это бы­ло по­ка­за­но в пре­ды­ду­щем фраг­мен­те ко­да. На вы­хо­де под­про­грам­мы '''d2cdfti()''' дву­мер­ный мас­сив '''@re''' бу­дет пред­став­лять со­бой ре­зуль­тат кор­ре­ля­ции эта­ло­на с вход­ным изо­бра­жением. Вы­ход­ное кор­ре­ля­ци­он­ное по­ле запи­сы­ва­ет­ся в мас­сив '''@out''', эле­мен­ты ко­то­ро­го '''$out[$i][$j]''' нор­ми­ру­ют­ся к мак­си­маль­но­му зна­чению '''$max''' и пред­став­ля­ют­ся в ви­де чи­сел от 0 до 255. В ка­че­стве при­ме­ра рас­смот­рим об­на­ру­жение сим­во­лов на но­мер­ных зна­ках ав­то­мо­би­лей. На рис. 3 пред­став­ле­но ис­ход­ное изо­бра­жение и ре­зуль­та­ты об­на­ру­жения циф­ры 3 на но­мер­ном зна­ке ав­то­ма­ши­ны с по­мо­щью со­гла­со­ван­ной гра­ди­ент­ной фильт­ра­ции, про­грамм­ную реа­ли­за­цию ко­то­рой мы рас­смот­ре­ли. Эта­ло­ном для об­на­ру­жения слу­жит дво­ич­ное изо­бра­жение циф­ры 3.&lt;br /&gt;
&lt;br /&gt;
Раз­мер­ность ис­ход­но­го изо­бра­жения на рис. 3а со­став­ля­ет '''1024 × 1024''' от­сче­тов. Раз­мер­ность эта­ло­на рав­на '''sx=19''' от­сче­там по ши­рине и '''sy=40''' от­сче­там по вы­со­те. От­ме­тим, что пи­ки мак­си­му­мов кор­ре­ля­ции бу­дут сме­ще­ны от­но­си­тель­но объ­ек­тов на по­ло­ви­ну раз­ме­ров эта­ло­на, то есть на ве­ли­чи­ну '''sx/2''' по ши­рине и '''sy/2''' по вы­со­те.&lt;br /&gt;
&lt;br /&gt;
Сде­ла­ем ак­цент на од­ном важ­ном мо­мен­те со­гла­со­ван­ной фильт­ра­ции. Фильтр (2) яв­ля­ет­ся про­стран­ствен­но-ин­ва­ри­ант­ным, или, ина­че го­во­ря, его дей­ствие спра­вед­ли­во для все­го вход­но­го изо­бра­жения. Это вы­те­ка­ет из фор­му­лы (1) для сверт­ки, в ко­то­рой опе­ра­ция сверт­ки вход­но­го изо­бра­жения ''s(x,y)'' с от­кли­ком ''h(x,y)'' осу­ще­ств­ля­ет­ся по всей плоско­сти при пе­ре­ме­щении эта­ло­на вдоль осей ''x&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;‑x'' и y&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;‑y. По этой при­чине со­гла­со­ван­ный фильтр обес­пе­чит об­на­ру­жение сра­зу несколь­ких (мно­же­ства) объ­ек­тов, рас­по­ло­жен­ных про­из­воль­ным об­ра­зом во вход­ном изо­бра­жении.&lt;br /&gt;
&lt;br /&gt;
===Во­дя­ные зна­ки===&lt;br /&gt;
&lt;br /&gt;
Про­бле­ма со­блю­дения ав­тор­ских прав при раз­ме­щении фо­то­гра­фий в се­ти Ин­тернет или за­да­ча по­иска изо­бра­жений с по­мо­щью по­иско­вых систем так или ина­че тре­бу­ют со­постав­ления мно­же­ства фо­то­изо­бра­жений с эта­ло­ном или опи­санием изо­бра­жения. В этом слу­чае, со­гла­со­ван­ная фильт­ра­ция мо­жет рас­смат­ри­вать­ся как один из ин­ст­ру­мен­тов ре­шения по­доб­ных за­дач.&lt;br /&gt;
&lt;br /&gt;
Наи­бо­лее по­пу­ляр­ные по­иско­вые систе­мы в на­стоя­щее вре­мя пре­достав­ля­ют воз­мож­ность по­иска изо­бра­жений на осно­ве их тек­сто­во­го опи­сания, со­дер­жа­ще­го­ся в тэ­гах ко­да HTML-до­ку­мен­та. Со­от­вет­ствен­но, сте­пень ре­ле­вант­но­сти по­иско­вым за­про­сам мо­жет не со­от­вет­ство­вать изо­бра­жениям, пре­достав­ляе­мым в вы­да­че ре­зуль­та­тов по­иска. Поль­зо­ва­те­лям при­хо­дит­ся про­смат­ри­вать мно­же­ство страниц, что­бы най­ти тре­буе­мое изо­бра­жение. &lt;br /&gt;
&lt;br /&gt;
Бо­лее про­дви­ну­тые (но менее из­вест­ные) ре­сур­сы пред­ла­га­ют сер­ви­сы, ис­поль­зую­щие ме­то­ды рас­по­зна­вания об­ра­зов, на­прав­лен­ные на клас­си­фи­ка­цию объ­ек­тов в изо­бра­жении. Од­на­ко по­иск циф­ро­вых фо­то­гра­фий по объ­ек­там, при­сут­ствую­щим в сним­ках, по­ка да­лёк от удов­ле­тво­ри­тель­но­го ре­шения, ес­ли в ка­че­стве оп­ти­му­ма взять наш зри­тель­ный ана­ли­за­тор. И ви­ной это­му не столь­ко ал­го­рит­мы рас­по­зна­вания, сколь­ко слож­ность са­мой про­бле­мы ма­шин­но­го рас­по­зна­вания об­ра­зов.&lt;br /&gt;
&lt;br /&gt;
Одним из ком­про­мис­сов в ре­шении за­да­чи по­иска фо­то­гра­фий в се­ти Ин­тернет мо­жет по­слу­жить спо­соб клас­си­фи­ка­ции изо­бра­жений с ис­поль­зо­ванием ви­ди­мых во­дя­ных зна­ков. Нанесение их на изо­бра­жение уже сей­час при­ме­ня­ет­ся во мно­гих ре­сур­сах ми­ро­вой се­ти. Как пра­ви­ло, ви­ди­мой мет­кой слу­жит ад­рес сай­та в се­ти Ин­тернет, ло­го­тип ре­сур­са или неко­то­рая от­вле­чен­ная мет­ка ти­па зна­ка '''©'''. При­ме­ром нанесения про­зрач­ных ме­ток мо­гут слу­жить кар­ты по­иско­вой систе­мы Google, в ото­бра­жае­мое по­ле ко­то­рых встраи­ва­ют­ся во­дя­ные зна­ки с про­зрач­ной осно­вой. По­про­бу­ем и мы реа­ли­зо­вать по­доб­ный под­ход. При этом сна­ча­ла встро­им ви­ди­мые во­дя­ные зна­ки в про­из­воль­ное изо­бра­жение, а за­тем по­пы­та­ем­ся об­на­ру­жить их с по­мо­щью про­грам­мы, при­ве­ден­ной вы­ше. Про­грамм­ный код для встраи­вания сим­во­ла '''©''' в фо­то­изо­бра­жение бу­дет та­ким:&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF137_75_1.jpg|Рис. 4|300px]] Рис. 4. Фо­то­изо­бра­же­ние со встро­ен­ны­ми ви­ди­мы­ми зна­ка­ми ©.|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
 $op = .075;&lt;br /&gt;
 $dh0 = 64;&lt;br /&gt;
 $dw0 = 64;&lt;br /&gt;
 $dh = 128;&lt;br /&gt;
 $dw = 128;&lt;br /&gt;
 $L = $N/128;&lt;br /&gt;
 for($h=0;$h&amp;lt;$L; $h++){&lt;br /&gt;
    $m = $h*$dh + $dh0;&lt;br /&gt;
    for($w=0;$w&amp;lt;$L; $w++){&lt;br /&gt;
       $n = $w*$dw + $dw0;&lt;br /&gt;
       for($j=0;$j&amp;lt;$sy;$j++){&lt;br /&gt;
          for($i=0;$i&amp;lt;$sx;$i++){&lt;br /&gt;
             $sum = $re[$i+$n][$j+$m] + $op*$re1[$i][$j];&lt;br /&gt;
             if($sum &amp;gt; 255){ $sum = 255;}&lt;br /&gt;
              $re[$i+$n][$j+$m]=$sum;&lt;br /&gt;
          }}&lt;br /&gt;
 }}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вход­ное и вы­ход­ное изо­бра­жения по­ме­ща­ют­ся в дву­мер­ный мас­сив '''@re'''. Па­ра­метр '''$op''' оп­ре­де­ля­ет непро­зрач­ность во­дя­но­го зна­ка от­но­си­тель­но ис­ход­но­го фо­то­изо­бра­жения и ра­вен в дан­ном слу­чае '''7,5 %'''. Па­ра­мет­ры '''$dh0''' и '''$dw0''' да­ют на­чаль­ные сме­щения (от­сту­пы) по вы­со­те и ши­рине фо­то­изо­бра­жения, со­от­вет­ствен­но. Зна­чения па­ра­мет­ров '''$dh''' и '''$dw''' за­да­ют шаг встраи­вания во­дя­ных зна­ков по вы­со­те и ши­рине сним­ка. Па­ра­метр '''$L''' оп­ре­де­ля­ет чис­ло встраи­вае­мых ме­ток как по вы­со­те, так и по ши­рине фо­то­изо­бра­жения. С по­мо­щью па­ра­мет­ров '''$sy''' и '''$sx''' за­да­ют­ся раз­ме­ры встраи­вае­мо­го зна­ка '''©''', а так же раз­ме­ры эта­ло­на '''©''' на эта­пе об­на­ру­жения. Зна­чение '''255''' слу­жит ог­раничи­те­лем на слу­чай воз­мож­но­го пре­вы­шения зна­чения яр­ко­сти. На рис. 4 пред­став­лен ре­зуль­тат встраи­вания про­зрач­но­го зна­ка '''©'''. Во­дя­ные зна­ки рав­но­мер­но раз­ме­ще­ны по по­лю изо­бра­жения, об­ра­зуя мат­ри­цу, имею­щую во­семь ря­дов и во­семь столб­цов.&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF137_75_2.jpg|Рис. 5|300px]] Рис. 5. Ре­зуль­та­ты об­на­ру­же­ния зна­ков '''©''' с по­мо­щью со­гла­со­ван­ной фильт­ра­ции: а) по­ле кор­ре­ля­ции; б) од­но из се­че­ний по­ля кор­ре­ля­ции.|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
На рис. 5 пред­став­ле­ны ре­зуль­та­ты об­на­ру­жения иско­мых сим­во­лов '''©'''. В ка­че­стве эта­ло­на ис­поль­зо­ва­лось дво­ич­ное изо­бра­жение зна­ка '''©'''.&lt;br /&gt;
&lt;br /&gt;
Ана­лиз по­лу­чен­ных ре­зуль­та­тов по­зво­ля­ет нам сде­лать вы­вод, что при про­зрач­но­сти во­дя­ных зна­ков, рав­ной '''92,5 %''', ошиб­ки об­на­ру­жения (ошиб­ки I ро­да) от­сут­ству­ют, а так­же от­сут­ству­ют ошиб­ки лож­но­го об­на­ру­жения, то есть II ро­да. Ес­ли мы бу­дет уве­ли­чи­вать про­зрач­ность во­дя­ных зна­ков, тем са­мым умень­шая их ви­ди­мость, то неми­нуе­мо поя­вят­ся ошиб­ки лож­но­го об­на­ру­жения, а за­тем и ошиб­ки I ро­да. Уро­вень возник­но­вения оши­бок за­ви­сит от кон­крет­но­го вход­но­го изо­бра­жения. Для фо­то­изо­бра­жения на рис. 4 ошиб­ки II ро­да на­чи­на­ют по­яв­лять­ся при ве­ли­чине про­зрач­но­сти во­дя­ных зна­ков, рав­ной 95 %, а ошиб­ки I ро­да – при 97 %.&lt;br /&gt;
&lt;br /&gt;
В нашей ста­тье мы про­де­мон­ст­ри­ро­ва­ли воз­мож­но­сти ''Perl'' по ре­шению при­клад­ных за­дач об­на­ру­жения объ­ек­тов. От­ме­тим, что циф­ро­вые ме­то­ды в це­лом не обес­пе­чи­ва­ют вы­со­кой ско­ро­сти рас­че­та кор­ре­ля­ции дву­мер­ных мас­си­вов из-за боль­шого объ­е­ма вы­чис­лений. И чем боль­ше раз­мер вход­ных изо­бра­жений, тем ниже эта ско­рость. Имен­но по­это­му в систе­мах на­ви­га­ции крыла­тых ра­кет при­ме­ня­ют­ся оп­ти­че­ские кор­ре­ля­то­ры, упо­мя­нутые в начале.  Но гиб­кость и опе­ра­тив­ность про­грам­ми­ро­ва­ния на ''Perl'', в со­че­та­нии с мощью ма­те­ма­ти­че­ских мо­ду­лей ''Perl'', позволяют соз­давать&lt;br /&gt;
высокоэф­фек­тив­ные ал­го­рит­мы об­ра­бот­ки ви­део­дан­ных.&lt;/div&gt;</summary>
		<author><name>Mike2014</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF135:Perl</id>
		<title>LXF135:Perl</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF135:Perl"/>
				<updated>2014-04-22T08:47:28Z</updated>
		
		<summary type="html">&lt;p&gt;Mike2014: ссылка на автора&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;: '''''Math::FFT''' Perl'' и ма­те­ма­ти­че­ские пре­об­ра­зо­ва­ния «вы­тя­нут» без­на­деж­ные с виду сним­ки&lt;br /&gt;
&lt;br /&gt;
==''Perl'': По­вы­сим ка­че­ст­во фо­то==&lt;br /&gt;
&lt;br /&gt;
{{Цикл/Perl}} [[Категория:Учебники]]&lt;br /&gt;
&lt;br /&gt;
: '''Часть 2''': Боль­шин­ст­во, на­вер­ное, возь­мет для этих це­лей гра­фи­че­ский ре­дак­тор, но [http://www.smirnov.sp.ru/ '''Ми­ха­ил Смир­нов'''] про­де­ла­ет все сам, с по­мо­щью ''Perl'' и из­ряд­ной до­ли ма­те­ма­ти­ки.&lt;br /&gt;
&lt;br /&gt;
Наи­бо­лее важ­ной ха­рак­те­ри­сти­кой циф­ро­вой фо­то- и ви­део­техники яв­ля­ет­ся раз­ре­шаю­щая спо­соб­ность пре­об­ра­зо­ва­те­лей све­та в элек­три­че­ский сиг­нал. Чем она луч­ше, тем бо­лее мел­кие де­та­ли мы мо­жем на­блю­дать в изо­бра­жении. В со­вре­мен­ных бы­то­вых циф­ро­вых фо­то- и ви­деоуст­рой­ствах та­ки­ми пре­об­ра­зо­ва­те­ля­ми яв­ля­ют­ся по­лу­про­воднико­вые при­бо­ры с за­ря­до­вой свя­зью (ПЗС), ко­то­рые не так уж дав­но при­шли на сме­ну фо­то­плен­ке и ва­ку­ум­ным пре­об­ра­зо­ва­те­лям све­та. Основ­ное пре­иму­ще­ство ПЗС пе­ред фо­то­плен­кой со­сто­ит в воз­мож­но­сти ре­ги­ст­ри­ро­вать зна­чи­тель­но боль­ший диа­па­зон внешней осве­щен­но­сти или, ина­че го­во­ря, по­лу­чать зна­чи­тель­но боль­шее ко­ли­че­ство гра­да­ций по­лу­то­нов в изо­бра­жении. Пре­иму­ще­ство пе­ред ва­ку­ум­ной техникой, пре­ж­де все­го, ха­рак­те­ри­зу­ет­ся прак­ти­че­ски сто­про­цент­ным исклю­чением гео­мет­ри­че­ских иска­жений. Сла­бым ме­стом пер­вых ПЗС-раз­ра­бо­ток яв­ля­лось низ­кое оп­ти­че­ское раз­ре­шение, что бы­ло свя­за­но с круп­ным раз­ме­ром фо­то­чув­стви­тель­ных яче­ек ПЗС. Чем мень­ше гео­мет­ри­че­ский раз­мер яче­ек и чем боль­ше ко­ли­че­ство та­ких яче­ек в чи­пе ПЗС, тем луч­шее оп­ти­че­ское раз­ре­шение мож­но по­лу­чить. Ко­ли­че­ство яче­ек по го­ри­зон­та­ли и вер­тика­ли оп­ре­де­ля­ют раз­мер циф­ро­во­го изо­бра­жения в пик­се­лях по ши­рине и вы­со­те.&lt;br /&gt;
&lt;br /&gt;
В пер­вых раз­ра­бот­ках, осо­бен­но фо­то­техники, при­ме­ня­лась про­це­ду­ра искусствен­но­го уве­ли­чения ко­ли­че­ства пик­се­лей с по­мо­щью ин­тер­по­ля­ции. Эта про­це­ду­ра по­лу­чи­ла на­звание «элек­трон­но­го зу­ма», при­менение ко­то­ро­го мо­жет соз­да­вать толь­ко ил­лю­зию улуч­шения ка­че­ства изо­бра­жения. Вме­сте с тем, та­кая чи­сло­вая ха­рак­те­ри­сти­ка, как ко­ли­че­ство пик­се­лей, да­ет лишь об­щее пред­став­ление о ка­че­стве и ре­аль­ном оп­ти­че­ском раз­ре­шении. Что­бы бо­лее точ­но ра­зо­брать­ся в этом во­про­се, нуж­но при­влечь к рас­смот­рению функ­цио­наль­ную ха­рак­те­ри­сти­ку – пе­ре­да­точ­ную функ­цию ПЗС.&lt;br /&gt;
&lt;br /&gt;
===Немно­го тео­рии===&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF135_68_1.jpg|300px|Рис. 1]] Рис. 1. Функ­ция пе­ре­да­чи мо­ду­ля­ции ка­ме­ры на ПЗС.|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
Пе­ре­да­точ­ная ха­рак­те­ри­сти­ка уст­рой­ства на ПЗС – сканера, циф­ро­во­го фо­то­ап­па­ра­та или ви­део­ка­ме­ры – пол­но­стью опи­сы­ва­ет­ся функ­ци­ей пе­ре­да­чи мо­ду­ля­ции (ФПМ), ко­то­рая ха­рак­те­ри­зу­ет па­дение кон­тра­ста си­ну­сои­даль­ных со­став­ляю­щих сиг­на­ла изо­бра­жения в об­ласти про­стран­ствен­ных частот. При оцен­ке пе­ре­да­точ­ной ха­рак­те­ри­сти­ки этих уст­ройств од­но­вре­мен­но бу­дет учи­ты­вать­ся и ФПМ оп­ти­че­ско­го объ­ек­ти­ва, ко­то­рый фо­ку­си­ру­ет изо­бра­жение в плоско­сти чи­па ПЗС. В оп­ти­ке про­стран­ствен­ные часто­ты оп­ре­де­ля­ют­ся как чис­ло линий на мил­ли­метр, то есть ве­ли­чи­ной [1/мм]. В ка­че­стве при­ме­ра на рис. 1 пред­став­ле­на ти­пич­ная кри­вая ФПМ ка­ме­ры на ПЗС.&lt;br /&gt;
&lt;br /&gt;
ФПМ ха­рак­те­ри­зу­ет связь ме­ж­ду ис­ход­ным объ­ек­том и его изо­бра­жением. Рас­смот­рим в ка­че­стве объ­ек­та си­ну­сои­даль­ное рас­пре­де­ление кон­тра­ста, по­ка­зан­ное на рис. 2а. Часто­та си­ну­сои­ды рав­на 20 1/мм, то есть на од­ном мил­ли­мет­ре ук­ла­ды­ва­ет­ся 20 пе­рио­дов си­ну­сои­ды.&lt;br /&gt;
&lt;br /&gt;
На рис. 2б и 2в пред­став­ле­ны се­чения си­ну­сои­даль­но­го объ­ек­та. Раз­мах си­ну­сои­ды на рис. 2б ха­рак­те­ри­зу­ет кон­траст объ­ек­та на вхо­де уст­рой­ства. На вы­хо­де оп­ти­ко-элек­трон­но­го уст­рой­ства изо­бра­жение си­ну­сои­ды бу­дет ха­рак­те­ри­зо­вать­ся се­чением, по­ка­зан­ным на рис. 2в. Та­ким об­ра­зом, вид­но, что ФПМ на часто­те 20 1/мм по­ка­зы­ва­ет па­дение сиг­на­ла си­ну­сои­ды с ве­ли­чи­ны 1.0 на вхо­де уст­рой­ства до ве­ли­чи­ны при­мер­но 0.18 на его вы­хо­де.&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF135_69_1.jpg|300px|Рис. 2]] Рис. 2. При­мер син­те­за изо­бра­же­ния.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:LXF135_69_2.jpg|300px|Рис. 3]] Рис. 3. Край по­лу­плос­ко­сти: а) тес­то­вое изо­бра­же­ние края по­лу­плос­ко­сти, б) се­че­ние края по­лу­плос­ко­сти, в) функ­ция рас­сея­ния ли­нии, г) ФПМ уст­рой­ст­ва на ПЗС, д) де­фо­ку­си­ро­воч­ная кри­вая.|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
Для по­лу­чения зна­чений ФПМ на всех про­стран­ствен­ных часто­тах по­тре­бу­ет­ся мно­же­ство си­ну­сои­даль­ных объ­ек­тов с раз­лич­ны­ми часто­та­ми. Од­на­ко в этом нет необ­хо­ди­мо­сти, ес­ли восполь­зо­вать­ся объ­ек­том в ви­де про­тя­жен­но­го рез­ко­го скач­ка кон­тра­ста, по­лу­чив­ше­го на­звание «края по­лу­плоско­сти». Изо­бра­жение края по­лу­плоско­сти по­ка­за­но на рис. 3а. Что­бы по­лу­чить иско­мую ФПМ, необ­хо­ди­мо вы­полнить диф­фе­рен­ци­ро­вание края по­лу­плоско­сти (по нор­ма­ли к краю), а за­тем сде­лать пре­об­ра­зо­вание Фу­рье.&lt;br /&gt;
&lt;br /&gt;
По­сле­до­ва­тель­ность и ре­зуль­та­ты пре­об­ра­зо­ваний ил­лю­ст­ри­ру­ют­ся на рис. 3. На рис. 3б по­ка­за­но од­но из се­чений края по­лу­плоско­сти. Что­бы снизить влияние шу­мов ПЗС, пе­ред диф­фе­рен­ци­ро­ванием пред­ва­ри­тель­но вы­пол­ня­ет­ся усреднение се­чений края по­лу­плоско­сти. Сум­ми­ро­вание m се­чений края по­лу­плос­ко­сти обес­пе­чи­ва­ет по­вы­шение от­но­шения сиг­нал-шум в ко­рень из ''m'' раз. Ре­зуль­тат диф­фе­рен­ци­ро­вания усреднен­но­го се­чения края по­лу­плоско­сти по­ка­зан на рис. 3в – по­лу­чен­ное на­ми рас­пре­де­ление на­зы­ва­ет­ся функ­ци­ей рас­сеяния линии. Для оп­ре­де­ления ФПМ оста­ет­ся вы­полнить пре­об­ра­зо­вание Фу­рье функ­ции рас­сеяния и за­тем вы­чис­лить мо­дуль от по­лу­чен­ных ком­плекс­ных ко­эф­фи­ци­ен­тов Фу­рье (рис. 3г). Что­бы оценить ошиб­ку, ко­то­рую вно­сит циф­ро­вая оп­ти­ко-элек­трон­ная систе­ма, по­тре­бу­ет­ся вы­полнить вы­чи­тание по­лу­чен­ной на­ми ФПМ ''H(v)'' из так на­зы­вае­мой ди­фрак­ци­он­ной ФПМ ''Ĥ(v)'', ко­то­рая име­ет мак­си­маль­но дости­жи­мую часто­ту ''vm'':&lt;br /&gt;
&lt;br /&gt;
 U(v) = Ĥ(v) – H(v)&lt;br /&gt;
&lt;br /&gt;
''v'' – про­стран­ствен­ная часто­та. Пре­дель­ная часто­та ди­фрак­ци­он­ной ФПМ оп­ре­де­ля­ет­ся про­стой фор­му­лой ''vm = F/λD'', где ''F'' – фо­кусное рас­стояние объ­ек­ти­ва; ''D'' – диа­метр объ­ек­ти­ва; ''λ'' – дли­на вол­ны све­та, обыч­но принима­ет­ся рав­ной 660 на­но­мет­рам (оран­же­вый цвет).&lt;br /&gt;
&lt;br /&gt;
Ди­фрак­ци­он­ная ФПМ (крас­ная линия на рис. 3г) пред­став­ля­ет со­бой на­клон­ную пря­мую, рав­ную 1 на ну­ле­вой часто­те ''v = 0'' и рав­ную 0 на ди­фрак­ци­он­ной часто­те ''vm''. При­мер раз­но­ст­ной&lt;br /&gt;
ФПМ ''U(v)'' по­ка­зан на рис. 3д. Кри­вая на рис. 3д ха­рак­те­ри­зу­ет ве­ли­чи­ну ошиб­ки пе­ре­да­чи кон­тра­ста, ко­то­рая обу­слов­ле­на ре­аль­ной оп­ти­ко-элек­трон­ной систе­мой на ПЗС. Во мно­гих слу­ча­ях по­доб­ная ошиб­ка свя­за­на с рас­фо­ку­си­ров­кой объ­ек­ти­ва (по­те­рей рез­ко­сти). И дей­стви­тель­но, рас­пре­де­ление на рис. 3д на­по­ми­на­ет де­фо­ку­си­ро­воч­ную кри­вую.&lt;br /&gt;
&lt;br /&gt;
Раз­лич­ные ва­ри­ан­ты на­строй­ки фо­ку­са объ­ек­ти­ва бу­дут, в той или иной сте­пени, при­во­дить к по­те­ре рез­ко­сти. Чем сильнее рас­стро­ен объ­ек­тив, тем боль­ше бу­дут зна­чения раз­но­ст­ной функ­ции&lt;br /&gt;
''U(v)'' и тем ху­же оп­ти­че­ское раз­ре­шение. При этом по пи­ку кри­вой мож­но оценить про­стран­ствен­ную часто­ту ''v'', на ко­то­рой ФПМ име­ет наи­боль­ший гра­ди­ент па­дения кон­тра­ста. Ес­ли не при-нимать в рас­чет шу­мы ка­ме­ры на ПЗС, то наи­боль­шее раз­ре­шение оп­ти­ко-элек­трон­ной систе­мы оп­ре­де­ля­ет­ся со­от­но­шением ''vL=1/2L'', где ''L'' – линей­ный раз­мер ячей­ки ПЗС. Для ре­аль­ных систем уро­вень шу­ма на вы­со­ких часто­тах бу­дет пре­вы­шать сиг­нал изо­бра­жения, и ре­аль­ное пре­дель­ное раз­ре­шение ''vr'' бу­дет зна­чи­тель­но ниже ''vL''.&lt;br /&gt;
&lt;br /&gt;
При­мер ко­да для по­лу­чения иско­мой ФПМ по­ка­зан ниже. Ис­ход­ная мат­ри­ца изо­бра­жения '''B(x,y)''' края по­лу­плоско­сти со­дер­жит­ся в дву­мер­ном мас­си­ве '''@B'''. На­чаль­ная и конеч­ная стро­ки сум­ми­ро­вания за­да­ют­ся па­ра­мет­ра­ми '''$row1''' и '''$row2''', со­от­вет­ствен­но.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
 for($j=$row1;$j&amp;lt;$row2; $j++){&lt;br /&gt;
 for($i=0;$i&amp;lt;$N; $i++){&lt;br /&gt;
		 $g[$i] +=$B[$i][$j];&lt;br /&gt;
 }}	&lt;br /&gt;
 $Nrr=$row2-$row1-1;&lt;br /&gt;
 @g=map($_/$Nrr, @g);&lt;br /&gt;
 for($i=1;$i&amp;lt;$N; $i++){&lt;br /&gt;
   $PSF[$i] = $g[$i] - $g[$i-1];&lt;br /&gt;
 }&lt;br /&gt;
 use Math::FFT;&lt;br /&gt;
 for($i=0;$i&amp;lt;$N;$i++){&lt;br /&gt;
		 $data-&amp;gt;[2*$i]=$PSF[$i];&lt;br /&gt;
		 $data-&amp;gt;[2*$i+1]=0;&lt;br /&gt;
 }&lt;br /&gt;
 $fft = new Math::FFT($data);&lt;br /&gt;
 $coeff = $fft-&amp;gt;cdft();&lt;br /&gt;
 for($i=0;$i&amp;lt;$N;$i++){				&lt;br /&gt;
   $H[$i] = sqrt ( $coeff-&amp;gt;[2*$i]**2 + $coeff-&amp;gt;[2*$i+1]**2 );&lt;br /&gt;
 }	&lt;br /&gt;
 @H=map($_/$H[0], @H);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ре­зуль­тат диф­фе­рен­ци­ро­вания за­но­сит­ся в мас­сив '''@PSF''', ко­то­рый пред­став­ля­ет со­бой функ­цию рас­сеяния линии. Для вы­полнения пре­об­ра­зо­вания Фу­рье восполь­зу­ем­ся ма­те­ма­ти­че­ской биб­лио­&lt;br /&gt;
те­кой ''Perl'' '''Math::FFT''', в ко­то­рой реа­ли­зо­ван ал­го­ритм бы­ст­ро­го пре­об­ра­зо­вания. Од­но­мер­ное пре­об­ра­зо­вание Фу­рье в этой биб­лио­те­ке вы­пол­ня­ет­ся с по­мо­щью под­про­грам­мы '''cdft()'''.&lt;br /&gt;
&lt;br /&gt;
Ре­зуль­тат пре­об­ра­зо­вания Фу­рье за­но­сит­ся в мас­сив ко­эф­фи­ци­ен­тов '''$coeff''', где ко­эф­фи­ци­ен­ты с чет­ным ин­дек­сом со­от­вет­ству­ют ре­аль­ной части, а ко­эф­фи­ци­ен­ты с нечет­ным ин­дек­сом – мнимой части ком­плекс­но­го чис­ла, со­от­вет­ствен­но. Ре­зуль­ти­рую­щая ФПМ за­но­сит­ся в мас­сив '''@H''', зна­чения ко­то­ро­го нор­ми­ру­ют­ся к пер­во­му зна­чению мас­си­ва '''$H[0]''', со­от­вет­ствую­ще­му по­сто­ян­ной со­став­ляю­щей изо­бра­жения. Та­ким об­ра­зом, '''$H[0]=1''', а все осталь­ные зна­чения ФПМ мень­ше единицы.&lt;br /&gt;
&lt;br /&gt;
На рис. 3г, вме­сте с вы­чис­лен­ной на­ми ФПМ, крас­ной линией по­ка­за­на ди­фрак­ци­он­ная оп­ти­че­ская функ­ция. Та­ким об­ра­зом, чем бли­же ФПМ на­ше­го уст­рой­ства к ди­фрак­ци­он­ной функ­ции, тем с бо­лее вы­со­ким ка­че­ством мы смо­жем по­лу­чать на­ши фо­то­изобра­жения.&lt;br /&gt;
&lt;br /&gt;
===Улуч­шение ка­че­ства===&lt;br /&gt;
&lt;br /&gt;
Вы­вод, по­лу­чен­ный на­ми в пре­ды­ду­щем раз­де­ле, по­зво­ля­ет сфор­му­ли­ро­вать под­ход для улуч­шения ка­че­ства фо­то­изо­бра­жений, а имен­но: ком­пен­си­ро­вать па­дение ФПМ на тех часто­тах, где оно вы­ра­жа­ет­ся наи­бо­лее силь­но, и при­бли­зить тем са­мым ФПМ к ди­фрак­ци­он­но­му пре­де­лу. В циф­ро­вой об­ра­бот­ке изо­бра­жений та­кие восста­нав­ли­ваю­щие фильт­ры по­лу­чи­ли на­звание об­рат­ных или ин­верс­ных. Ма­те­ма­ти­че­ски это вы­ра­жа­ет­ся доста­точ­но про­сто, а имен­но: спектр ис­ход­но­го фо­то­изо­бра­жения ''S(v)'' необ­хо­ди­мо ум­но­жить на функ­цию, об­рат­ную ФПМ уст­рой­ства на ПЗС, ко­то­рую мы ранее восста­но­ви­ли из изо­бра­жения края по­лу­плоско­сти. В пред­по­ло­жении, что мощ­ность шу­ма прене­б­ре­­жи­мо ма­ла, спектр восста­нов­лен­но­го изо­бра­жения ра­вен от­но­шению ''S&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;(v) = S(v)/H(v)'', то есть функ­ция иде­аль­но­го фильт­ра ''Q(v) = 1/H(v)''. Принимая во внимание шу­мы, ко­то­рые вно­сят­ся лю­бой ре­аль­ной систе­мой, необ­хо­ди­мо най­ти ре­шение для ''Q(v)'' на тех часто­тах ''v &amp;gt; v&amp;lt;sub&amp;gt;r&amp;lt;/sub&amp;gt;'', где шум пре­вы­ша­ет сиг­нал. Пре­дель­ная часто­та ''v&amp;lt;sub&amp;gt;r&amp;lt;/sub&amp;gt;'' оценива­ет­ся как часто­та, на ко­то­рой дис­пер­сия (энер­гия) шу­ма на­чи­на­ет пре­вы­шать зна­чения ФПМ. Один из ва­ри­ан­тов оп­ти­маль­но­го фильт­ра име­ет вид&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF135_70_1.jpg|300px|Рис. 4]] Рис. 4. Оп­ти­маль­ный ли­ней­ный фильтр для улуч­ше­ния фо­то­изо­бра­же­ний.|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
  Q(v)= [1 + H(v&amp;lt;sub&amp;gt;r&amp;lt;/sub&amp;gt;)&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;]•H(v)/[H(v&amp;lt;sub&amp;gt;r&amp;lt;/sub&amp;gt;)&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; + H(v)&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;] (1)&lt;br /&gt;
&lt;br /&gt;
На рис. 4 по­ка­зан ре­зуль­тат рас­че­та фильт­ра по фор­му­ле (1). Ин­верс­ные оп­ти­маль­ные фильт­ры, ис­поль­зую­щие восста­нов­лен­ные ФПМ, обес­пе­чи­ва­ют по­вы­шение кон­тра­стности на тех про­стран­ствен­ных часто­тах, на ко­то­рых это па­дение обу­слов­ле­но ре­аль­ной оп­ти­ко-элек­трон­ной систе­мой. Это основ­ное от­ли­чие восста­нав­ли­ваю­щих фильт­ров от «сле­пых» фильт­ров вы­со­ких частот или опе­ра­то­ров ти­па Со­бе­ля для под­чер­ки­вания границ, при­ме­няе­мых в распространен­ных про­грамм­ных па­ке­тах.&lt;br /&gt;
&lt;br /&gt;
Ал­го­ритм улуч­шения ка­че­ства фо­то­изо­бра­жения с по­мо­щью ин­верс­ной фильт­ра­ции вклю­ча­ет сле­дую­щие эта­пы. На пер­вом эта­пе осу­ще­ств­ля­ет­ся пре­об­ра­зо­вание Фу­рье ис­ход­но­го фо­то­изо­бра­жения ''B(x,y)'' и по­лу­чение спек­тра ''S(v&amp;lt;sub&amp;gt;x&amp;lt;/sub&amp;gt;,v&amp;lt;sub&amp;gt;y&amp;lt;/sub&amp;gt;)''. На вто­ром эта­пе фор­ми­ру­ет­ся ин­верс­ный фильтр ''Q(v&amp;lt;sub&amp;gt;x&amp;lt;/sub&amp;gt;,v&amp;lt;sub&amp;gt;y&amp;lt;/sub&amp;gt;)'', зна­чения ко­то­ро­го ум­но­жа­ют­ся на спектр ''S(v&amp;lt;sub&amp;gt;x&amp;lt;/sub&amp;gt;,v&amp;lt;sub&amp;gt;y&amp;lt;/sub&amp;gt;)''. На треть­ем эта­пе вы­пол­ня­ет­ся об­рат­ное пре­об­ра­зо­вание Фу­рье про­из­ве­дения ''S1(v&amp;lt;sub&amp;gt;x&amp;lt;/sub&amp;gt;,v&amp;lt;sub&amp;gt;y&amp;lt;/sub&amp;gt;) = S(v&amp;lt;sub&amp;gt;x&amp;lt;/sub&amp;gt;,v&amp;lt;sub&amp;gt;y&amp;lt;/sub&amp;gt;)•Q(v&amp;lt;sub&amp;gt;x&amp;lt;/sub&amp;gt;,v&amp;lt;sub&amp;gt;y&amp;lt;/sub&amp;gt;)'', ре­зуль­та­том ко­то­ро­го бу­дет яв­лять­ся восста­нов­лен­ное изо­бра­жение ''B1(x,y)''.&lt;br /&gt;
&lt;br /&gt;
Пер­вый и тре­тий эта­пы реа­ли­зу­ют­ся с по­мо­щью стан­дарт­ных под­про­грамм од­но­мер­но­го пре­об­ра­зо­вания Фу­рье мо­ду­ля ''Perl'' '''Math::FFT'''. Дву­мер­ное пре­об­ра­зо­вание Фу­рье по­лу­ча­ет­ся с по­мо­щью по­сле­до­ва­тель­но­го при­менения од­но­мер­но­го пре­об­ра­зо­вания, на­при­мер, к функ­ции изо­бра­жения ''B(x,y)'' сна­ча­ла по стро­кам, а за­тем по столб­цам мат­ри­цы. От­ме­тим, что пре­об­ра­зо­ванию под­вер­га­ют­ся RGB-ком­понен­ты цвет­но­го изо­бра­жения по от­дель­но­сти. В на­ших при­ме­рах ис­поль­зу­ет­ся ком­понен­та '''Blue''' ис­ход­но­го RGB-изо­бра­жения. Клю­че­вым эта­пом пре­об­ра­зо­вания яв­ля­ет­ся вто­рой этап, обес­пе­чи­ваю­щий раз­вер­ты­вание од­но­мер­ной функ­ции фильт­ра в дву­мер­ный мас­сив и ум­но­жение зна­чений фильт­ра на спектр ис­ход­но­го изо­бра­жения. Фраг­мент про­грамм­ной реа­ли­за­ции та­ко­го ал­го­рит­ма фильт­ра­ции пред­став­лен ниже:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
 $N2=$N/2;&lt;br /&gt;
 for($i=0;$i&amp;lt;$N2;$i++) {&lt;br /&gt;
 $FILTER[$i] = (1.+ $MTF[$nf]**2)*$MTF[$i]/($MTF[$nf]**2 +&lt;br /&gt;
 $MTF[$i]**2);&lt;br /&gt;
 }&lt;br /&gt;
 for($j=0;$j&amp;lt;$N; $j++){&lt;br /&gt;
 for($i=0;$i&amp;lt;$N; $i++){ &lt;br /&gt;
 		 $w2[$i][$j]=0;&lt;br /&gt;
 }}&lt;br /&gt;
 &amp;amp;d2cdft(\@B,\@w2,\$N,\$PI);&lt;br /&gt;
 for($k=0;$k&amp;lt;$N; $k++){&lt;br /&gt;
 $k1=$k;&lt;br /&gt;
 		 if($k &amp;gt; $N2) { $k1=$k-$N;}&lt;br /&gt;
 		 $x=$k1**2;&lt;br /&gt;
 for($j=0;$j&amp;lt;$N; $j++){&lt;br /&gt;
 $j1=$j;&lt;br /&gt;
 		 if($j &amp;gt; $N2) { $j1=$j-$N;}&lt;br /&gt;
 		 $R = sqrt ( $x +$j1**2 );&lt;br /&gt;
 	 $Q = &amp;amp;parv(\$R,\@Xc,\@FILTER,\$N2);&lt;br /&gt;
 $Re[$k][$j] *=$Q;&lt;br /&gt;
 $Im[$k][$j] *=$Q;&lt;br /&gt;
 }}&lt;br /&gt;
 &amp;amp;d2cdfti(\@Re,\@Im,\$N,\$PI);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вход­ное фо­то­изо­бра­жение со­дер­жит­ся в дву­мер­ном мас­си­ве '''@B'''. Пря­мое и об­рат­ное дву­мер­ное пре­об­ра­зо­вание Фу­рье вы­пол­ня­ют­ся с по­мо­щью под­про­грамм '''d2cdft()''' и '''d2cdfti()''', со­от­вет­ствен­но. Ис­ход­ная функ­ция ФПМ, по­лу­чен­ная на­ми вы­ше, на­хо­дит­ся в мас­си­ве '''@MTF'''. Функ­ция фильт­ра, рас­счи­тан­ная по фор­му­ле (1), за­но­сит­ся в од­но­мер­ный мас­сив '''@FILTER'''. Для по­лу­чения дву­мер­ной функ­ции фильт­ра ''Q(v&amp;lt;sub&amp;gt;x&amp;lt;/sub&amp;gt;,v&amp;lt;sub&amp;gt;y&amp;lt;/sub&amp;gt;)'' ис­поль­зу­ет­ся под­про­грам­ма линей­ной ин­тер­по­ля­ции '''parv()''', ко­то­рая обес­пе­чи­ва­ет вы­чис­ление про­ме­жу­точ­ных зна­чений фильт­ра в плоско­сти про­стран­ствен­ныхчастот ''(v&amp;lt;sub&amp;gt;x&amp;lt;/sub&amp;gt;,v&amp;lt;sub&amp;gt;y&amp;lt;/sub&amp;gt;)''. Па­ра­метр '''R''' яв­ля­ет­ся те­ку­щим ра­диу­сом, а вспо­мо­га­тель­ный мас­сив '''@Xc''' пред­став­ля­ет со­бой мас­сив ар­гу­мен­та вход­ной функ­ции фильт­ра, и, в ча­ст­но­сти, мо­жет быть за­дан как без­раз­мер­ная функ­ция с единич­ным ша­гом:&lt;br /&gt;
&lt;br /&gt;
 for($j=0;$j&amp;lt;$N2; $j++){$Xc[$j]=$j;}&lt;br /&gt;
&lt;br /&gt;
Вы­ход­ные зна­чения восста­нов­лен­но­го спек­тра ''S1'' фо­то­изо­бра­жения за­но­сят­ся в мас­си­вы ре­аль­ной '''@Re''' и мнимой '''@Im''' части ком­плекс­но­го спек­тра ''S1'', со­от­вет­ствен­но. Ре­зуль­ти­рую­щее восста­нов­лен­ное изо­бра­жение, по­сле вы­полнения об­рат­но­го пре­об­ра­зо­вания Фу­рье с по­мо­щью под­про­грам­мы '''d2cdfti()''', по­ме­ща­ет­ся в дву­мер­ный мас­сив '''@Re'''. На рис. 5 по­ка­за­но ис­ход­ное и восста­нов­лен­ное фо­то­изо­бра­жения, по­лу­чен­ные с по­мо­щью циф­ро­вой фо­то­ка­ме­ры в стан­дарт­ном ре­жи­ме съем­ки.&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF135_71_1.jpg|400px|Рис. 5]] Рис. 5. Ре­зуль­тат ком­пен­са­ции ФПМ фо­то­ка­ме­ры для стан­дарт­но­го ре­жи­ма съем­ки: а) ис­ход­ное фо­то­изо­бра­же­ние (Blue), б) ре­зуль­тат вос­ста­нов­ле­ния.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:LXF135_71_2.jpg|400px|Рис. 6]] Рис. 6. Ре­зуль­тат ком­пен­са­ции ФПМ фо­то­ка­ме­ры для ре­жи­ма съем­ки мак­ро: а) ис­ход­ное фо­то­изо­бра­же­ние (Blue), б) ре­зуль­тат вос­ста­нов­ле­ния.|Ширина=400px}}&lt;br /&gt;
&lt;br /&gt;
Как пра­ви­ло, в этом ре­жи­ме съем­ки циф­ро­вые фо­то­гра­фии по­лу­ча­ют­ся вполне удов­ле­тво­ри­тель­но­го ка­че­ства. Ча­ще все­го понижен­ное ка­че­ство циф­ро­во­го фо­то свя­за­но с ре­жи­мом мак­ро­съем­ки. На рис. 6 по­ка­за­но ис­ход­ное и восста­нов­лен­ное фо­то­изо­бра­жения, ко­то­рые бы­ли по­лу­че­ны в этом режиме.&lt;br /&gt;
&lt;br /&gt;
С точ­ки зрения на­груз­ки на про­цес­сор, при вы­полнении про­це­дур улуч­шения ка­че­ства наи­бо­лее за­трат­ной яв­ля­ет­ся про­це­ду­ра ин­тер­по­ля­ции. Для умень­шения вре­мени об­ра­бот­ки фо­то­изо­бра­жения мож­но за­ранее сфор­ми­ро­вать дву­мер­ную мат­ри­цу фильт­ра ''Q(v&amp;lt;sub&amp;gt;x&amp;lt;/sub&amp;gt;,v&amp;lt;sub&amp;gt;y&amp;lt;/sub&amp;gt;)'' и хранить его на диске. Для пе­ре­мно­жения мат­риц спек­тра ис­ход­но­го фо­то­изо­бра­жения ''S(v&amp;lt;sub&amp;gt;x&amp;lt;/sub&amp;gt;,v&amp;lt;sub&amp;gt;y&amp;lt;/sub&amp;gt;)'' и мат­ри­цы фильт­ра ''Q(v&amp;lt;sub&amp;gt;x&amp;lt;/sub&amp;gt;,v&amp;lt;sub&amp;gt;y&amp;lt;/sub&amp;gt;)'' мож­но восполь­зо­вать­ся па­ке­том (мо­ду­лем) ''Perl'' '''PDL'''. Основ­ное досто­ин­ство па­ке­та '''PDL''' – вы­со­кая ско­рость сло­жения и пе­ре­мно­жения мат­риц боль­шой раз­мер­но­сти и ком­пакт­ное хранение мас­си­вов дан­ных с пла­ваю­щей за­пя­той. На­при­мер, ска­ляр­ное про­из­ве­дение двух мат­риц ве­ще­ствен­ных чи­сел с пла­ваю­щей за­пя­той и раз­мер­но­стью 2048 × 2048 со­став­ля­ет око­ло 1 се­кун­ды, а сло­жение та­ких мат­ри­ц зай­мет до­ли се­кун­ды. Дву­мер­ный мас­сив чи­сел с пла­ваю­щей за­пя­той раз­мер­но­стью 1024 × 1024, принимая тип дан­ных '''PDL''', бу­дет занимать все­го 4 МБ опе­ра­тив­ной па­мя­ти. Па­кет '''PDL''' по­зво­ля­ет ла­конич­но запи­сы­вать ма­те­ма­ти­че­ские опе­ра­то­ры для ра­бо­ты с мат­ри­ца­ми в ви­де од­ной стро­ки – на­при­мер, код для ска­ляр­но­го ум­но­жения двух мат­риц '''$a''' и '''$b''' бу­дет иметь вид&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
 use PDL;&lt;br /&gt;
 $c = $a * $b;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Со­от­вет­ст­вен­но, код для пе­ре­мно­же­ния дву­мер­но­го ком­плекс­но­го спек­тра изо­бра­же­ния на дву­мер­ный фильтр за­пи­шет­ся в ви­де&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
 $re = pdl[@Re];&lt;br /&gt;
 $im = pdl[@Im];&lt;br /&gt;
 $q = pdl[@Q];&lt;br /&gt;
 $re = $q*$re;&lt;br /&gt;
 $im = $q*$im;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ува­жае­мый чи­та­тель, ес­ли вас по­на­ча­лу оза­да­чи­ли «пре­об­ра­зо­ва­ние Фу­рье» и реа­ли­за­ция ма­те­ма­ти­че­ских фор­мул, то от­не­си­тесь к ним как к «чер­но­му ящи­ку». Глав­ная поль­за при­ме­не­ния '''Math::FFT''' для оцен­ки ка­че­ст­ва со­сто­ит в том, что с по­мо­щью не­боль­шой про­грам­мы на ''Perl'' у вас поя­ви­лась воз­мож­ность объ­ек­тив­но срав­ни­вать оп­ти­че­ское раз­ре­ше­ние со­вре­мен­ных фо­то- и ви­део­сис­тем во всей по­ло­се ви­део­час­тот, а не ори­ен­ти­ро­вать­ся толь­ко на один па­ра­метр раз­ре­ше­ния – ко­ли­че­ст­во ме­га­пик­се­лей.&lt;/div&gt;</summary>
		<author><name>Mike2014</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF134:Perl</id>
		<title>LXF134:Perl</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF134:Perl"/>
				<updated>2014-04-18T08:42:38Z</updated>
		
		<summary type="html">&lt;p&gt;Mike2014: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;: '''''GD и Perl''''' Соз­дай­те ди­на­ми­че­ские изо­бра­же­ния в ва­ших сце­на­ри­ях для Web, и не толь­ко&lt;br /&gt;
&lt;br /&gt;
==''Perl'': Создаем изо­бра­же­ния==&lt;br /&gt;
&lt;br /&gt;
{{Цикл/Perl}}&lt;br /&gt;
&lt;br /&gt;
: '''Часть 1''': Язык, соз­дан­ный для об­ра­бот­ки тек­стов, мо­жет не­пло­хо справ­лять­ся и с гра­фи­кой. [http://www.smirnov.sp.ru/ '''Ми­ха­ил Смир­нов'''] объ­яс­нит, что к че­му.&lt;br /&gt;
&lt;br /&gt;
Как из­вест­но, язык про­грам­ми­ро­вания ''Perl'' иде­аль­но при­спо­соб­лен для мно­го­чис­лен­ных при­ло­жений по об­ра­бот­ке тек­ста. Од­на­ко воз­мож­но­сти ''Perl'' этим не ис­чер­пы­ва­ют­ся. При­менение гра­фи­че­ских мо­ду­лей в ''Perl'' по­зво­лит вам бы­ст­ро ри­со­вать изо­бра­жения, со­стоя­щие из линий, ок­руж­но­стей и тек­ста, манипу­ли­ро­вать цве­том, вы­ре­зать и встав­лять дру­гие изо­бра­жения, вы­пол­нять за­лив­ку, со­хра­нять на диске фай­лы изо­бра­жений в раз­лич­ных фор­ма­тах, манипу­ли­ро­вать ви­део­дан­ны­ми этих фай­лов. Наи­боль­ший ин­те­рес пред­став­ля­ет ис­поль­зо­вание гра­фи­че­ских мо­ду­лей ''Perl'' в web-при­ло­жениях. Гра­фи­че­ская биб­лио­те­ка ''GD'' име­ет ин­туи­тив­но по­нят­ный ин­тер­фейс, по­зво­ляю­щий бы­ст­ро и ком­пакт­но реа­ли­зо­вать поль­зо­ва­тель­ский код про­грамм на ''Perl'' да­же на­чи­наю­щим про­грам­ми­стам.&lt;br /&gt;
&lt;br /&gt;
Эф­фек­тив­ность ис­поль­зо­вания гра­фи­че­ско­го мо­ду­ля ''GD'' объ­яс­ня­ет­ся про­сто: биб­лио­те­ка ''GD'' напи­са­на на язы­ке ''C'' и со­вмести­ма со все­ми основ­ны­ми плат­фор­ма­ми (Linux, Windows, ...). Ин­тер­фейс ме­ж­ду ''Perl'' и биб­лио­те­кой ''GD'' обес­пе­чи­ва­ет мо­дуль ''GD.pm'', ко­то­рый ис­поль­зу­ет ''GD'' как ба­зис для соз­дания гра­фи­че­ских клас­сов в ''Perl. GD.pm'' яв­ля­ет­ся са­мо­за­гру­жае­мым ин­тер­фейс­ным мо­ду­лем, с по­мо­щью ко­то­ро­го мож­но соз­да­вать изо­бра­жения на ле­ту, мо­ди­фи­ци­ро­вать су­ще­ствую­щие фай­лы изо­бра­жений и син­те­зи­ро­вать но­вые.&lt;br /&gt;
&lt;br /&gt;
===При­вет, ''GD''!===&lt;br /&gt;
&lt;br /&gt;
Биб­лио­те­ка ''GD'' по­зво­ля­ет соз­да­вать цвет­ные ри­сун­ки, ис­поль­зуя боль­шое ко­ли­че­ство гра­фи­че­ских при­ми­ти­вов, и вы­во­дить их в раз­лич­ных гра­фи­че­ских фор­ма­тах. Мо­дуль ''GD'' оп­ре­де­ля­ет три основ­ных клас­са: &lt;br /&gt;
* класс изо­бра­жений '''GD::Image''', ко­то­рый пред­на­зна­чен для за­хва­та ви­део­дан­ных изо­бра­жения и вы­пол­ня­ет вы­зов ме­то­дов гра­фи­че­ских при­ми­ти­вов;&lt;br /&gt;
* класс шриф­тов '''GD::Font''', ко­то­рый бе­рет ста­ти­че­ские шриф­ты и ис­поль­зу­ет их для воспро­из­ве­дения тек­ста в гра­фи­че­ском ви­де;&lt;br /&gt;
* класс при­ми­ти­вов по­ли­го­на '''GD::Polygon''', при­ме­няе­мый для со­хранения спи­ска вер­шин мно­го­угольников при ри­со­вании сто­рон по­ли­го­на и обес­пе­чи­ваю­щий их воспро­из­ве­дение в ви­де изо­бра­жения.&lt;br /&gt;
&lt;br /&gt;
Обоб­щен­ный под­ход ис­поль­зо­вания гра­фи­че­ско­го ин­тер­фей­са ''GD'' вы­гля­дит сле­дую­щим об­ра­зом. На пер­вом эта­пе, при вы­зо­ве (инициа­ли­за­ции) ме­то­да '''GD::Image::new(Wx,Hy)''', соз­да­ет­ся но­вое пустое изо­бра­жение, ши­ри­на и вы­со­та ко­то­ро­го за­да­ют­ся па­ра­мет­ра­ми '''Wx''' и '''Hy'''. В ре­зуль­та­те вы­зо­ва ме­то­да бу­дут воз­вра­ще­ны ви­део­дан­ные изо­бра­жения. Дру­гие ме­то­ды клас­са по­зво­ля­ют инициа­ли­зи­ро­вать изо­бра­жение из уже су­ще­ствую­щих фай­лов, ко­то­рые необ­хо­ди­мо пред­ва­ри­тель­но про­чи­тать с диска.&lt;br /&gt;
&lt;br /&gt;
На вто­ром эта­пе, при вы­зо­ве ме­то­да '''colorAllocate()''' вы­пол­ня­ет­ся до­бав­ление цве­та к цве­то­вой таб­ли­це изо­бра­жения. Вход­ны­ми па­ра­мет­ра­ми вы­зо­ва яв­ля­ет­ся трой­ка основ­ных цве­тов: крас­ный, зе­ле­ный и синий, ко­то­рые за­да­ют­ся це­лы­ми чис­ла­ми в диа­па­зоне зна­чений от 0 до 255. Ме­тод воз­вра­ща­ет ин­декс цве­та цве­то­вой таб­ли­цы изо­бра­жения.&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF134_76_1.jpg|300px|Рис. 1.]] Рис. 1. При­мер ри­со­ва­ния про­стых объ­ек­тов.|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
По­сле это­го, на треть­ем эта­пе, мож­но сде­лать неко­то­рый ри­су­нок, ис­поль­зуя на­бор гра­фи­че­ских при­ми­ти­вов клас­са '''GD::Image''' и на­бор ме­то­дов клас­са '''GD::Polygon'''. По­ли­го­ны (мно­го­угольники) соз­да­ют­ся с по­мо­щью ме­то­да '''new()''', а до­бав­ление но­вых вер­шин по­ли­го­на воз­ло­же­но на ме­тод '''addPt()'''.&lt;br /&gt;
&lt;br /&gt;
И, на­конец, когда ри­су­нок го­тов, вы мо­же­те пре­об­ра­зо­вать его, на­при­мер, в гра­фи­че­ский фор­мат GIF, с по­мо­щью ме­то­да '''gif()'''. Ме­тод бу­дет воз­вра­щать дво­ич­ное со­дер­жи­мое изо­бра­жения в фор­ма­те GIF. Обыч­но по­лу­чен­ный ре­зуль­тат вы­во­дит­ся в брау­зер или со­хра­ня­ет­ся на диске в ви­де GIF-фай­ла. В ка­че­стве при­ме­ра при­ве­дем скрипт, ко­то­рый ри­су­ет про­стые фи­гу­ры, манипу­ли­ру­ет ими са­ми­ми и их цве­том, а так­же ри­су­ет текст с по­мо­щью ста­ти­че­ских шриф­тов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
 #!/perl/bin/perl&lt;br /&gt;
 use GD;&lt;br /&gt;
 $im = new GD::Image(425,250); #--Ини­циа­ли­за­ция изо­бра­же­ния&lt;br /&gt;
 $black = $im-&amp;gt;colorAllocate(0, 0, 0); #--Соз­да­ем цве­то­вую па­лит­ру&lt;br /&gt;
 $red = $im-&amp;gt;colorAllocate(255, 0, 0);&lt;br /&gt;
 $blue = $im-&amp;gt;colorAllocate(0,0,255);&lt;br /&gt;
 $yellow = $im-&amp;gt;colorAllocate(255,250,0);&lt;br /&gt;
 $bg = $im-&amp;gt;colorAllocate(240,240,240);&lt;br /&gt;
 $gray = $im-&amp;gt;colorAllocate(128,128,128);&lt;br /&gt;
 $im-&amp;gt;fill(0,0,$bg); #--Де­ла­ем за­лив­ку фо­на&lt;br /&gt;
 $im-&amp;gt;rectangle(0,0,424,249,$black); #--Ри­су­ем гра­ни­цы изо­бра­же­ния&lt;br /&gt;
 $poly = new GD::Polygon; #--Ини­циа­ли­за­ция по­ли­го­на&lt;br /&gt;
 $poly-&amp;gt;addPt(5,50);&lt;br /&gt;
 $poly-&amp;gt;addPt(25,25);&lt;br /&gt;
 $poly-&amp;gt;addPt(100,50);&lt;br /&gt;
 $poly-&amp;gt;addPt(70,95);&lt;br /&gt;
 $poly-&amp;gt;addPt(30,100);&lt;br /&gt;
 $im-&amp;gt;filledPolygon($poly,$blue); #--Соз­да­ние по­ли­го­на&lt;br /&gt;
 $poly-&amp;gt;offset(100,100); #--Сме­ще­ние по­ли­го­на&lt;br /&gt;
 $im-&amp;gt;polygon($poly,$red); #--Ри­су­ем толь­ко кон­тур&lt;br /&gt;
 $poly-&amp;gt;map($poly-&amp;gt;bounds,190,10,390,150); #--Из­ме­не­ние мас­шта­ба по­ли­го­на в 2 раза&lt;br /&gt;
 $im-&amp;gt;filledPolygon($poly,$yellow);&lt;br /&gt;
 $im-&amp;gt;arc(180,50,95,75,0,360,$blue); #--Ри­су­ем эл­лип­сы и ду­ги&lt;br /&gt;
 $im-&amp;gt;arc(280,190,90,50,290,180,$blue);&lt;br /&gt;
 $im-&amp;gt;arc(380,190,50,90,0,360,$blue);&lt;br /&gt;
 $im-&amp;gt;fill(380,190,$red);&lt;br /&gt;
 $im-&amp;gt;filledRectangle(10, 130, 50, 240, $gray); #--Ри­су­ем че­ты­рех­уголь­ник&lt;br /&gt;
 $im-&amp;gt;rectangle(10,130,50,240,$black);&lt;br /&gt;
 $string=”LINUX FORMAT”;&lt;br /&gt;
 $im-&amp;gt;string(gdMediumBoldFont,260,25,$string,$blue); #--За­да­ем ста­ти­че­ские шриф­ты&lt;br /&gt;
 $im-&amp;gt;string(gdSmallFont,170,235,”Copyright 2010”,$black);&lt;br /&gt;
 print “Content-Type: image/gif\n\n”;&lt;br /&gt;
 binmode STDOUT;&lt;br /&gt;
 print $im-&amp;gt;gif(); #--Пре­об­ра­зо­ва­ние дан­ных в фор­мат GIF и вы­вод&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
По­ка­зан­ный вы­ше код по­зво­ля­ет web-про­грам­ми­сту по­зна­ко­мить­ся на прак­ти­ке с основ­ны­ми коман­да­ми для ри­со­вания и мо­жет по­слу­жить осно­вой для са­мо­стоя­тель­но­го соз­дания бо­лее серь­ез­ных про­грамм. По­лу­чен­ный ре­зуль­тат мож­но по­смот­реть на рис. 1.&lt;br /&gt;
&lt;br /&gt;
===Основ­ные ме­то­ды===&lt;br /&gt;
&lt;br /&gt;
В ие­рар­хии ин­тер­фей­сов ''GD'' наи­боль­шее рас­про­странение по­лу­чи­ли два ти­па вер­сий для ра­бо­ты с растро­вой гра­фи­кой. Пер­вый тип под­дер­жи­ва­ет манипу­ли­ро­вание и пре­об­ра­зо­вание изо­бра­жений в фор­ма­те GIF. Вто­рой тип ин­тер­фей­сов ''GD'' по­зво­ля­ет ра­бо­тать с та­ки­ми по­пу­ляр­ны­ми гра­фи­че­ски­ми фор­ма­та­ми, как PNG и JPEG.&lt;br /&gt;
&lt;br /&gt;
Для за­кре­п­ления по­лу­чен­ных вы­ше прак­ти­че­ских на­вы­ков рас­смот­рим несколь­ко «тео­ре­ти­че­ских» мо­мен­тов инициа­ли­за­ции основ­ных ме­то­дов ''GD''. Вы­зов ме­то­да '''GD::Image::new(Wx,Hy)''' воз­вра­ща­ет но­вое пустое изо­бра­жение, на­при­мер:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
 $myImage = new GD::Image(100,100) || die;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ме­тод соз­да­ет пустой бланк изо­бра­жения раз­ме­ром 100 × 100 то­чек. Ес­ли раз­мер опу­щен, он бу­дет со­став­лять 64 × 64 то­чек. Ме­тод '''GD::Image::newFromGif(FILE)''' соз­да­ет изо­бра­жение на осно­ве дан­ных фай­ла в фор­ма­те GIF, пред­ва­ри­тель­но про­чи­тан­но­го с диска. Па­ра­метр '''FILE''' пред­став­ля­ет со­бой ука­за­тель фай­ла (де­ск­рип­тор). Де­ск­рип­тор фай­ла ука­зы­ва­ет­ся как один из па­ра­мет­ров функ­ции '''open()'''. Ес­ли от­кры­тие фай­ла бы­ло успеш­ным, то вы­зов воз­вра­ща­ет инициа­ли­зи­ро­ван­ное изо­бра­жение, ко­то­рое за­тем мо­жет быть под­верг­ну­то раз­лич­ным манипу­ля­ци­ям. На­при­мер:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
 open (MyGIF,”images/ballon.gif”) || die;&lt;br /&gt;
 $myImage = newFromGif GD::Image(MyGIF) || die;&lt;br /&gt;
 close MyGIF;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''MyGIF''' здесь – ука­за­тель фай­ла. Вы­зов ме­то­да '''GD::Image::gif''' воз­вра­ща­ет ви­део­дан­ные изо­бра­же­ния в фор­ма­те GIF. За­тем их мож­но вы­вес­ти в брау­зер и/или за­пи­сать в файл. На­при­мер:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
 open (MyGIF,”&amp;gt;images/ballon.gif”);&lt;br /&gt;
 binmode(MyGIF);&lt;br /&gt;
 print MyGIF $im-&amp;gt;gif;&lt;br /&gt;
 close (MyGIF);&lt;br /&gt;
 print “Content-Type: image/gif\n\n”;&lt;br /&gt;
 binmode STDOUT;&lt;br /&gt;
 print $im-&amp;gt;gif;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ме­тод '''GD::Image::colorAllocate(R,G,B)''' пред­на­зна­чен для за­дания и управ­ления цве­том с по­мо­щью RGB-спе­ци­фи­ка­ции – цве­то­вых ком­понент R (крас­ный), G (зе­ле­ный) и B (синий), и в ре­зуль­та­те воз­вра­ща­ет ин­декс цве­то­вой таб­ли­цы. При­мер за­дания жел­то­го цве­та:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
 $yellow = $myImage-&amp;gt;colorAllocate(255,255,0);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
По­лу­чен­ные ин­дек­сы впо­след­ствии мож­но ис­поль­зо­вать для за­дания об­ще­го фо­на изо­бра­жения или для за­лив­ки фи­гур оп­ре­де­лен­ным цве­том. Ме­тод '''GD::Image::getPixel(x,y)''' воз­вра­ща­ет индекс цве­то­вой таб­ли­цы под оп­ре­де­лен­ной точ­кой изо­бра­жения с ко­ор­ди­на­та­ми (x,y). Вы­зов это­го ме­то­да мо­жет быть ском­биниро­ван с функ­ци­ей '''rgb()''', ес­ли вам по­тре­бу­ет­ся восста­но­вить спи­сок RGB-ком­понент под вы­бран­ной точ­кой. На­при­мер:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
 $index = $myImage-&amp;gt;getPixel(20,100);&lt;br /&gt;
 ($r,$g,$b) = $myImage-&amp;gt;rgb($index);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ме­тод '''GD::Image::transparent(colorIndex)''' от­ме­ча­ет ин­декс '''colorIndex''' как про­зрач­ный. Уча­ст­ки изо­бра­жения, на­ри­со­ван­ные этим цве­том, бу­дут неви­ди­мы. Ме­тод при­ме­ня­ет­ся для соз­дания про­зрач­ных фо­нов изо­бра­жений в Web. Про­зрач­ным в изо­бра­жении мо­жет быть толь­ко один цвет. Ниже, на­при­мер, им бу­дет бе­лый:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
 open(myGIF,”transptest.gif”);&lt;br /&gt;
 $im = newFromGif GD::Image(myGIF);&lt;br /&gt;
 $white = $im-&amp;gt;colorClosest(255,255,255); &lt;br /&gt;
 $im-&amp;gt;transparent($white);&lt;br /&gt;
 print $im-&amp;gt;gif;&lt;br /&gt;
 close myGIF;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Коман­ды ри­со­вания===&lt;br /&gt;
&lt;br /&gt;
Эти коман­ды хо­тя и не занима­ют в ие­рар­хии ме­то­дов ''GD'' осо­бо­го по­ло­жения, но вы­де­ля­ют­ся сво­ей вы­ра­жен­ной функ­цио­наль­но­стью. Ин­туи­тив­ная про­сто­та команд (ме­то­дов) по­зво­лит вам бы­ст­ро на­ри­со­вать це­лый ряд при­ми­ти­вов или за­про­грам­ми­ро­вать про­из­воль­ный ри­су­нок. Рас­смот­рим ряд наи­бо­лее упот­реб­ляе­мых ме­то­дов.&lt;br /&gt;
&lt;br /&gt;
Ме­тод '''GD::Image::setPixel(x,y,color)''' соз­да­ет точ­ку с ко­ор­ди­на­та­ми (x,y) с оп­ре­де­лен­ным цве­то­вым ин­дек­сом '''color'''. Он ниче­го не воз­вра­ща­ет. Систе­ма ко­ор­ди­нат на­чи­на­ет­ся в верхнем ле­вом уг­лу и за­кан­чи­ва­ет­ся в нижнем пра­вом. Нетруд­но пред­ста­вить, что растро­вый пе­ре­бор ко­ор­ди­нат при на­ли­чии функ­цио­наль­ной за­ви­си­мо­сти цве­то­во­го ин­дек­са '''color'' от ко­ор­ди­нат (x,y) мо­жет ис­поль­зо­вать­ся для син­те­за изо­бра­жений. Реа­ли­зу­ем при­мер ко­да для фор­ми­ро­вания дву­мер­но­го рас­пре­де­ления функ­ции '''w=sin(x,y)''':&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF134_77_1.jpg|300px|Рис. 2.]] Рис. 2. При­мер син­те­за изо­бра­же­ния.|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
 $im = new GD::Image($X,$Y);&lt;br /&gt;
 $arg=$period*4*$pi*$pi;&lt;br /&gt;
 for($j=0;$j&amp;lt;$Y; $j++){&lt;br /&gt;
  $y = ($j-$Y/2)/$Y;&lt;br /&gt;
  $phy = $y*$y;&lt;br /&gt;
 for($i=0;$i&amp;lt;$X; $i++){&lt;br /&gt;
  $x = ($i-$X/2)/$X;&lt;br /&gt;
  $phx = $x*$x;&lt;br /&gt;
  $w = int($a0 + $amp*sin($arg*($pi - $phx - $phy)));&lt;br /&gt;
  $gray = $im-&amp;gt;colorResolve($w,$w,$w);&lt;br /&gt;
 $im-&amp;gt;setPixel($i,$j,$gray);&lt;br /&gt;
 }}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ме­тод '''colorResolve(r,g,b)''' воз­вра­ща­ет ин­декс цве­та, ко­то­рый точ­но со­от­вет­ству­ет ука­зан­ным крас­ным, зе­ле­ным и си­ним ком­понен­там. Ес­ли та­кой цвет не на­хо­дит­ся в цвет­ной таб­ли­це, то ме­тод до­бав­ля­ет цвет в таб­ли­цу и воз­вра­ща­ет его ин­декс. На рис. 2 пред­став­лен ре­зуль­тат син­те­за изо­бра­жения, соз­дан­но­го в со­от­вет­ствии свы­ше при­ве­ден­ным ко­дом.&lt;br /&gt;
&lt;br /&gt;
Ме­тод '''GD::Image::rectangle(x1,y1,x2,y2,color)''' ри­су­ет че­ты­рех­угольник, сто­ро­ны ко­то­ро­го име­ют оп­ре­де­лен­ный цвет '''color'''. Ко­ор­ди­на­ты (x1,y1) и (x2,y2) яв­ля­ют­ся верхним ле­вым и пра­вым нижним уг­ла­ми, со­от­вет­ствен­но. При­мер ри­со­вания квад­ра­та раз­ме­ром 90 × 90 то­чек:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
 $myImage-&amp;gt;rectangle(10,10,100,100,$blue);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ме­тод '''GD::Image::polygon(polygon,color)''' ри­су­ет мно­го­уголь­ник с за­дан­ным цве­том '''color''', при этом чис­ло вер­шин не долж­но быть ме­нее трех. Ес­ли по­след­няя вер­ши­на по­ли­го­на не соз­да­на, ме­тод бу­дет за­крыт. При­мер ри­со­ва­ния тре­уголь­ни­ка:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
 $poly = new GD::Polygon;&lt;br /&gt;
 $poly-&amp;gt;addPt(50,0);&lt;br /&gt;
 $poly-&amp;gt;addPt(99,99);&lt;br /&gt;
 $poly-&amp;gt;addPt(0,99);&lt;br /&gt;
 $myImage-&amp;gt;polygon($poly,$blue);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ме­тод '''GD::Image::line(x1,y1,x2,y2,color)''' ри­су­ет линию с оп­ре­де­лен­ным цве­том '''color''' от точ­ки с ко­ор­ди­на­та­ми (x1,y1) до точ­ки с ко­ор­ди­на­та­ми (x2,y2). При­мер ри­со­вания диа­го­наль­ной синей линии от точ­ки с ко­ор­ди­на­та­ми (7,7) до точ­ки с ко­ор­ди­на­та­ми (154,154):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
 $myImage-&amp;gt;line(7,7,154,154,$blue);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ме­тод ри­со­вания '''line()''' очень часто при­ме­ня­ет­ся для по­строения гра­фи­ков функ­ции од­ной пе­ре­мен­ной. Фраг­мент ко­да скрип­та, реа­ли­зую­щий основ­ной цикл фор­ми­ро­вания линии гра­фи­ка, а так­же оси абс­цисс и зна­чений пе­ре­мен­ной по оси абс­цисс, пред­став­лен ниже:&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF134_78_1.jpg|300px|Рис. 3.]] Рис. 3. При­мер по­строе­ния гра­фи­ка функ­ции од­ной пе­ре­мен­ной.|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
 $f=0;&lt;br /&gt;
 for($i=0;$i&amp;lt;$N-1;$i++){&lt;br /&gt;
 $im-&amp;gt;line($x,$y[$i],$x+$dx,$y[$i+1],$blue);&lt;br /&gt;
 $im-&amp;gt;line($x,$yh,$x+$dx,$yh,$black);&lt;br /&gt;
 $im-&amp;gt;string(gdTinyFont, $x, $yh+2, $f, $blue);&lt;br /&gt;
 $f +=5;&lt;br /&gt;
 $x=$x+$dx;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При­мер ри­со­вания гра­фи­ка функ­ции од­ной пе­ре­мен­ной по­ка­зан на рис. 3.&lt;br /&gt;
&lt;br /&gt;
С по­мо­щью ме­то­да '''GD::Image::arc(cx,cy,Wx,Hy,start,end,color)''' мож­но ри­со­вать ду­ги и эл­лип­сы. Ко­ор­ди­на­ты (cx,cy) яв­ля­ют­ся цен­тром эл­лип­са (ду­ги), а па­ра­мет­ры (Wx,Hy) яв­ля­ют­ся ши­ри­ной и вы­со­той эл­лип­са, со­от­вет­ствен­но. Часть эл­лип­са по­кры­ва­ет­ся ду­гой, дли­на ко­то­рой управ­ля­ет­ся па­ра­мет­ра­ми '''start''' и '''end'''. Эти па­ра­мет­ры за­да­ют­ся в уг­ло­вой ме­ре от 0 до 360 гра­ду­сов. При­мер ри­со­вания пол­но­го эл­лип­са:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
 $myImage-&amp;gt;arc(100,100,50,35,0,360,$blue);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ме­тод '''GD::Image::fill(x,y,color)''' слу­жит для за­лив­ки об­ластей изо­бра­жения с за­дан­ным цве­том '''color'''. Цвет бу­дет рас­про­стра­нять­ся по изо­бра­жению, на­чи­ная от точ­ки (x,y) до границ объ­ек­та,&lt;br /&gt;
на ко­то­рых по­яв­ля­ет­ся раз­но­ст­ный цвет. При­мер за­лив­ки синим цве­том, на­чи­ная с точ­ки с ко­ор­ди­на­та­ми x=50 и y=40:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
 $myImage-&amp;gt;rectangle(10,10,100,100,$black);&lt;br /&gt;
 $myImage-&amp;gt;fill(50,40,$blue);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ко­пи­ро­вание===&lt;br /&gt;
&lt;br /&gt;
Коман­ды ко­пи­ро­вания изо­бра­жений вы­де­ля­ют­ся сво­ей функ­цио­наль­но­стью и важ­ны с точ­ки зрения соз­дания эф­фек­тив­но­го ко­да при ри­со­вании мно­же­ства по­вто­ряю­щих­ся уча­ст­ков изо­бра­жения. При напи­сании ко­да про­грам­мы этот ме­тод по­зво­лит за­помнить неко­то­рую об­ласть изо­бра­жения ана­ло­гич­но то­му, как это де­ла­ет­ся с обыч­ны­ми мас­си­ва­ми дан­ных в ''Perl''.&lt;br /&gt;
&lt;br /&gt;
Ме­тод '''GD::Image::copy(sourceImage,dstX,dstY,srcX,srcY,Wx,Hy)''' пред­на­зна­чен для ко­пи­ро­вания пря­мо­уголь­ных об­ластей от од­но­го изо­бра­жения к дру­го­му. Изо­бра­жение-источник за­да­ет­ся с по­мо­щью па­ра­мет­ра '''sourceImage'''. Па­ра­мет­ры (srcX,srcY) за­да­ют верхний ле­вый угол пря­мо­угольника в изо­бра­жении-источнике, а (Wx, Hy) ука­зы­ва­ют ши­ри­ну и вы­со­ту об­ласти ко­пи­ро­вания. Па­ра­мет­ры (dstX,dstY) управ­ля­ют ко­ор­ди­на­та­ми точ­ки, в ко­то­рой бу­дет на­чи­нать­ся на­ло­жение ко­пии на изо­бра­жение-по­лу­ча­тель. Вы­зов ме­то­да воз­вра­ща­ет дан­ные изо­бра­жения-по­лу­чате­ля. При­мер ко­пи­ро­вания об­ласти '''$srcImage''' раз­ме­ром 25 × 25 то­чек в об­ласть '''$myImage''' с на­ча­лом в точ­ке (10,10) по­ка­зан ниже:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
 $myImage = new GD::Image(100,100);&lt;br /&gt;
 $srcImage = new GD::Image(50,50);&lt;br /&gt;
 $myImage-&amp;gt;copy($srcImage,10,10,0,0,25,25);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С изо­бра­зи­тель­ной точ­ки зрения, бо­лее ин­те­рес­ным ме­то­дом яв­ля­ет­ся ме­тод '''GD::Image::copyMerge(sourceImage,dstX,dstY,srcX,srcY,Wx,Hy,opaque)''', ко­то­рый от­ли­ча­ет­ся от пре­ды­ду­ще­го все­го лишь одним па­ра­мет­ром '''opaque'''. Он мо­жет при­го­дить­ся для соз­дания кол­ла­жей. С по­мо­щью па­ра­мет­ра opaque в диа­па­зоне зна­чений от 0 до 100 за­да­ет­ся сте­пень про­зрач­но­сти од­но­го изо­бра­жения от­но­си­тель­но дру­го­го, на­при­мер:&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF134_79_1.jpg|300px|Рис. 4.]] Рис. 4. При­мер слия­ния двух изо­бра­же­ний с эф­фек­том про­зрач­но­сти.|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
 $image1-&amp;gt;copyMerge($image2,$left,$top,0,0,$wx,$hy, 60);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На рис. 4 по­ка­зан при­мер слияния с эф­фек­том про­зрач­но­сти двух изо­бра­жений од­но­го раз­ме­ра. При этом про­зрач­ность вто­ро­го изо­бра­жения от­но­си­тель­но пер­во­го со­став­ля­ет 60 %. &lt;br /&gt;
&lt;br /&gt;
===Вы­во­дим текст===&lt;br /&gt;
&lt;br /&gt;
Ин­те­рес web-про­грам­ми­стов к ри­со­ванию тек­ста свя­зан со мно­же­ством за­дач, возникаю­щих при соз­дании гра­фи­че­ских эле­мен­тов web-страниц: от слу­чай­но­го на­бо­ра сим­во­лов в за­да­че ав­то­ри­за­ции поль­зо­ва­те­ля (соз­дание так на­зы­вае­мой Captcha), до ри­со­вания во­дя­ных зна­ков в изо­бра­жениях.&lt;br /&gt;
&lt;br /&gt;
Ин­тер­фейс ''GD'' под­дер­жи­ва­ет минималь­ный на­бор ста­ти­че­ских шриф­тов и по­зво­ля­ет ри­со­вать сим­во­лы и стро­ки тек­ста в гра­фи­че­ском ви­де. Вы­вод мо­жет вы­пол­нять­ся как в го­ри­зон­таль­ном на­прав­лении, так и в вер­тикаль­ном. Доступ­ны­ми для ри­со­вания шриф­та­ми яв­ля­ют­ся сле­дую­щие: TinyFont, SmallFont, Medium­BoldFont, LargeFont и GiantFont. Ка­ж­дый из этих шриф­тов мо­жет быть им­пор­ти­ро­ван как гло­баль­ная кон­стан­та или как па­кет объ­ек­тов клас­са '''GD::Font''', на­при­мер: '''GD::Font::gdTinyFont'''.&lt;br /&gt;
&lt;br /&gt;
Непо­сред­ствен­но для ри­со­вания при­ме­ня­ет­ся два основ­ных ме­то­да: '''string()''' и '''stringUp()'''. Ме­тод '''string(font,x,y,string,color)''' ри­су­ет стро­ку тек­ста, на­чи­ная с по­зи­ции (x,y), в за­дан­ном цве­те и вы­бран­ном шриф­те. Ме­тод '''stringUp(font,x,y,string,color)''' ри­су­ет текст с по­во­ро­том на 90 гра­ду­сов в на­прав­лении, про­ти­во­по­лож­ном вра­щению ча­со­вой стрел­ки.&lt;br /&gt;
&lt;br /&gt;
Рас­смот­рен­ные вы­ше шриф­ты име­ют весь­ма ог­раничен­ный диа­па­зон раз­ме­ров, и при этом толь­ко средний шрифт по­зво­ля­ет вы­де­лять сим­во­лы как жир­ные. Дру­гой су­ще­ствен­ный недоста­ток ста­ти­че­ских шриф­тов – это ог­раничение по лока­ли­за­ции исклю­чи­тель­но ла­тиницей.&lt;br /&gt;
&lt;br /&gt;
Ис­поль­зо­вание ди­на­ми­че­ских шриф­тов TrueType обес­пе­чи­ва­ет при ри­со­вании тек­ста прак­ти­че­ски неог­раничен­ные воз­мож­но­сти, и пре­ж­де все­го, лока­ли­за­цию под лю­бой тип ко­ди­ров­ки, при­ме­няе­мый в web-про­грам­ми­ро­вании. Ме­тод для вы­зо­ва шриф­тов име­ет вид '''GD::Image-&amp;gt;stringTTF()'''. Раз­но­об­ра­зие же су­ще­ствую­щих шриф­тов снима­ет ог­раничения на их доступ­ность. Один из ва­ри­ан­тов вы­зо­ва ме­то­да '''stringTTF()''' име­ет вид:&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF134_79_2.jpg|300px|Рис. 5.]] Рис. 5. При­мер ри­со­ва­ния тек­ста ди­на­ми­че­ски­ми шриф­та­ми.|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
 $image-&amp;gt;stringTTF($fgcolor,$fontname,$ptsize,$angle,$x,$y,$str),&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где ар­гу­мен­ты коман­ды – это: &lt;br /&gt;
* ин­декс цве­та '''fgcolor''' для ри­со­вания стро­ки тек­ста,&lt;br /&gt;
* путь '''fontname''' к вы­бран­но­му фай­лу шриф­та (.ttf),&lt;br /&gt;
* же­лае­мый раз­мер '''ptsize''' шриф­та,&lt;br /&gt;
* угол по­во­ро­та '''angle''' в ра­диа­нах,&lt;br /&gt;
* де­кар­то­вы ко­ор­ди­на­ты x,y на­ча­ла ри­со­вания,&lt;br /&gt;
* стро­ка тек­ста '''str'''.&lt;br /&gt;
&lt;br /&gt;
На рис. 5 по­ка­зан ре­зуль­тат ри­со­вания стро­ки тек­ста несколь­ки­ми ки­рил­ли­че­ски­ми шриф­та­ми: buaril.ttf, bukursv.ttf, buroman.ttf, butimit.ttf, pushkin.ttf, butimes.ttf.&lt;br /&gt;
&lt;br /&gt;
===Фор­ма­ты PNG и JPEG===&lt;br /&gt;
&lt;br /&gt;
Как бы­ло от­ме­че­но вы­ше, вто­рой тип ин­тер­фей­сов ''GD'' пре­достав­ля­ет воз­мож­ность ис­поль­зо­вать гра­фи­че­ские фор­ма­ты PNG и JPEG. Для ра­бо­ты с гра­фи­че­ским фор­ма­том PNG при­ме­ня­ет­ся ме­тод '''GD::Image-&amp;gt;newFromPng($file)''', ко­то­рый с по­мо­щью де­ск­рип­то­ра фай­ла мо­жет соз­да­вать изо­бра­жения в этом фор­ма­те. Ес­ли от­кры­тие фай­ла бы­ло успеш­ным, то вы­зов воз­вра­ща­ет инициа­ли­зи­ро­ван­ное изо­бра­жение, на­при­мер:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
 open (myPNG,”test.png”) || die;&lt;br /&gt;
 $myImage = newFromPng GD::Image(\*myPNG) || die;&lt;br /&gt;
 close myPNG;&lt;br /&gt;
 print “Content-type: image/png\n\n”;&lt;br /&gt;
 binmode STDOUT;&lt;br /&gt;
 print $im-&amp;gt;png();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Су­ще­ст­ву­ет дру­гой ва­ри­ант вы­зо­ва с не­по­сред­ст­вен­ным ука­за­ни­ем фай­ла изо­бра­же­ния:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
 $myImage = newFromPng GD::Image('test.png')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для ра­бо­ты с фор­ма­том JPEG при­ме­ня­ет­ся ме­тод '''GD::Image-&amp;gt;newFromJpeg($file)'''. Этот ме­тод бу­дет соз­да­вать изо­бра­жение в фор­ма­те JPEG по­сле чтения фай­ла с диска в том же фор­ма­те:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
 $quality=75;&lt;br /&gt;
 $image = GD::Image-&amp;gt;newFromJpeg($file);&lt;br /&gt;
 print “Content-type: image/jpeg\n\n”;&lt;br /&gt;
 binmode STDOUT;&lt;br /&gt;
 print $image-&amp;gt;jpeg($quality);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
От­ли­чи­тель­ная осо­бен­но­сть ме­то­да '''jpeg()''' – на­ли­чие па­ра­мет­ра ка­че­ства '''$quality''', за­дава­емого как це­лое в диа­па­зоне зна­чений от 0 до 100. Чем боль­ше его зна­чение, тем выше ка­че­ство изо­бра­жения, и, есте­ствен­но, боль­ше раз­мер фай­ла на диске. Ес­ли он не за­дан, по умол­чанию бу­дет вы­бра­но сред­нее ка­че­ст­во.&lt;/div&gt;</summary>
		<author><name>Mike2014</name></author>	</entry>

	</feed>