Подкарване на урок

dakata__92

Super Moderator
Здравейте намерих в нета един доста интересен код но немога да го подкарам. Някой може ли да ми помогне, кода е за частично разчитане на CAPTCHA. http://ejohn.org/blog/ocr-and-neural-nets-in-javascript/#postcomment Линка е това и не е реклама, а ето го и самия код.
[js]<script>
function convert_grey(image_data){
for (var x = 0; x < image_data.width; x++){
for (var y = 0; y < image_data.height; y++){
var i = x*4+y*4*image_data.width;
var luma = Math.floor(image_data.data * 299/1000 +
image_data.data[i+1] * 587/1000 +
image_data.data[i+2] * 114/1000);

image_data.data = luma;
image_data.data[i+1] = luma;
image_data.data[i+2] = luma;
image_data.data[i+3] = 255;
}
}
}
filter(image_data[0], 105);
filter(image_data[1], 120);
filter(image_data[2], 135);
function filter(image_data, colour){
for (var x = 0; x < image_data.width; x++){
for (var y = 0; y < image_data.height; y++){
var i = x*4+y*4*image_data.width;

// Turn all the pixels of the certain colour to white
if (image_data.data == colour) {
image_data.data = 255;
image_data.data[i+1] = 255;
image_data.data[i+2] = 255;

// Everything else to black
} else {
image_data.data = 0;
image_data.data[i+1] = 0;
image_data.data[i+2] = 0;
}
}
}
}
var i = x*4+y*4*image_data.width;
var above = x*4+(y-1)*4*image_data.width;
var below = x*4+(y+1)*4*image_data.width;

if (image_data.data == 255 &&
image_data.data[above] == 0 &&
image_data.data[below] == 0) {
image_data.data = 0;
image_data.data[i+1] = 0;
image_data.data[i+2] = 0;
}
cropped_canvas.getContext("2d").fillRect(0, 0, 20, 25);
var edges = find_edges(image_data);
cropped_canvas.getContext("2d").drawImage(canvas, edges[0], edges[1],
edges[2]-edges[0], edges[3]-edges[1], 0, 0,
edges[2]-edges[0], edges[3]-edges[1]);

image_data = cropped_canvas.getContext("2d").getImageData(0, 0,
cropped_canvas.width, cropped_canvas.height);
</script>[/js]
 

s_gerrard

Registered
Ами, кажи какво точно не разбираш, пък дано да ти помогна. Работил съм с малко с канвас. Като извикаш getImageData на даден канвас, това връща масив(след малко ще се опитам да ти обясня какво съдържа). Както знаеш, всеки пиксел има стойност за наситеността на червеното, зеленото и синьото(rgb). Също така и прозрачност(alpha). Това което ще съдържа масива е, както следва:

например масива е image_data

image_data[0] - red на първия пиксел
image_data[1] - green на първия пиксел
image_data[2] - blue на първия пиксел
image_data[3] - alpha на първия пиксел
image_data[4] - red на втория пиксел
image_data[5] - green на втория пиксел
image_data[6] - blue на втория пиксел
...

Това в първата функция превръща картинката в сива.

Код:
var i = x*4+y*4*image_data.width;
Това е red на текущия пиксел.

Код:
      var luma = Math.floor(image_data.data[i] * 299/1000 +
        image_data.data[i+1] * 587/1000 +
        image_data.data[i+2] * 114/1000);
С това намираме колко да бъде сивото и на red, green, blue. Няма някаква зависимост до колкото знам.

Код:
      image_data.data[i] = luma;
      image_data.data[i+1] = luma;
      image_data.data[i+2] = luma;
      image_data.data[i+3] = 255;

Ако разбра това, което обясних по-горе, трябва да схващаш, че i ще бъде red на текущия, i+1 - green и i+2 - blue, a i+3 - alpha(като я слагаме на 255 означава никаква прозрачност).

Отново казвам, кажи какво точно от кода искаш да знаеш, за да не обяснявам целия ред по ред. Дано с това малко да съм ти помогнал.
 

dakata__92

Super Moderator
Основно ме интересува дали работи във вида, в който е в момента и как мога да го направя така, че когато във форма се подаде линк към снимка(CAPTCHA) кода да я обработва и в текстово поле да изведе какво според него има на снимката. Мъдрих, но до сега не съм работил с такъв тип код и сега като се сблъсках с него и не мога да го подкарам да работи полудявам. Като цяло това за пикселите горе долу му схванах идеята предполагам така спрямо всеки пиксел и цветът, който съдържа трябва да се изведе текста да кажем , като ги подрежда. Просто "почистваш" снимката от ненужното.
 

s_gerrard

Registered
Абе и аз нещо не разбрах как става номера. Разбрах, че след това с filter() правят буквите бели, а фона черен, а след това чистят тези пиксели(правят ги черни), които са бели, но не са част от буквата(защото пиксел-а отгоре и отдолу са черни). След това не намирам функцията find_edges(), и от там ми се губят нещата. Говори и за някаква "neural network", което не разбрах какво е. А в демото има линкове към някакви скриптове, които вероятно са "neural network"-а, което явно върши гадната работа да разпознае буквата.
 

dakata__92

Super Moderator
Интересно, няма ли някъде из нета код, който върши същата идея, но бачкащ >? Иначе му гона логиката, че е свързън с някаква програма за обратоването на информацията от кода.
 

Горе