KARTz.RU
кушаешь морковь – встанет вновь и вновь

Распечатать фотографию определителя аппликатуры

Июнь 23rd, 2010

Дано: определитель аппликатуры гитарных аккордов, фотоаппарат-цифромыльница, лазерный принтер.

Требуется: распечатать светокопию определителя аппилкатуры.

Основная проблема – неравномерная освещённость кадра. Готового велосипеда под руками не оказалось – пришлось писать свой.

Алгоритм очень неэффективен и очень прост. Загружаем картинку. Для каждой точки вычисляем среднюю яркость в квадрате, окружающем эту точку. Если яркость данной точки больше (с учётом смещения), в новой картинке делаем её белой. ??наче – чёрной. То есть порог срабатывания триггера непосредственно зависит от локальной освещённости. За счёт этого яркость картинки выравнивается.

??так, было (картикки кликабельны):

Стало:

Скрипт (написан на php с сипользованием библиотека gd2, ногами по почкам не бить, про алгоритмическую неэффективность уже говорил…):

<?php

$input=’C:\data\photo\djvu\1\uzc.jpg’;
$output=’C:\data\photo\djvu\1\uzc.gif’;
$dx=7;
$dy=7;
$shift=-5; //minus means more white

//error_reporting(0);
error_reporting(E_ALL);
set_time_limit(0);

if (!extension_loaded(‘gd2′)) {
dl( ‘php_gd2.’ . PHP_SHLIB_SUFFIX);
}

echo(‘Loading….’.»\r\n»);

$im1=imagecreatefromjpeg($input);
$xm=imagesx($im1);
$ym=imagesy($im1);

$im2=imagecreate($xm, $ym);
$white = imagecolorallocate($im2, 255, 255, 255);
$black = imagecolorallocate($im2, 0, 0, 0);

echo(‘Loaded’.»\r\n»);

$iii=array();

for ($i = 0; $i < $xm; $i++)
{
$iii[$i]=array();
for ($j = 0; $j < $ym; $j++)
{
$iii[$i][$j]=dyat($im1,$i,$j);
}
}

echo(‘Loaded1′.»\r\n»);

for ($i = 0; $i < $xm; $i++)
{
for ($j = 0; $j < $ym; $j++)
{
$x1=$i-$dx;
$x2=$i+$dx;
$y1=$j-$dy;
$y2=$j+$dy;
if($x1<0) { $x1=0; }
if($x2>=$xm) { $x2=$xm-1; }
if($y1<0) { $y1=0; }
if($y2>=$ym) { $y2=$ym-1; }
$cs=0;
$pn=0;
for ($i1 = $x1; $i1 <= $x2; $i1++)
{
for ($j1 = $y1; $j1 <= $y2; $j1++)
{
$cs += $iii[$i][$j];
}
}
$mc=$cs/(($x2-$x1+1)*($y2-$y1+1));
if($iii[$i][$j]>$mc+$shift)
{
imagesetpixel($im2, $i, $j, $white);
}
else
{
imagesetpixel($im2, $i, $j, $black);
}
echo(‘.’);
}
echo(floor(100*$i/$xm).»%\r\n»);
}

echo(‘Saving….’.»\r\n»);
imagegif($im2, $output);
echo(‘Done’.»\r\n»);
sleep(29000);

function dyat($im,$x,$y)
{
$rgb = imagecolorat($im, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
return(0.299*$r+0.587*$g+0.114*$b);
}

?>

Конец кода. Лиценция CC-BY-NC-ND.


Filed under: Без рубрики | Метки: ,
Июнь 23rd, 2010 06:16:17

Похожие посты:
no comments
Leave a Reply