Программная система обробки та аналізу изображений
На розробку системи було обрано середовище програмування Borland Delphi виробництва фірми Borland International® USA, California. Delphi є середу, підтримує візуальне проектування додатків для Windows. У цьому інтерфейс користувача створюється шляхом комбінування і редагування стандартних компонентів (форм (вікон), меню, полів введення, статичних текстів, списків різної форми, екранних кнопок… Читати ще >
Программная система обробки та аналізу изображений (реферат, курсова, диплом, контрольна)
Содержание Введение 3.
Технічні параметри 4.
Можливості системи. 4.
Апаратне забезпечення. 4.
Програмне забезпечення. 4.
Описание структури системи та принципу її 5.
Опис методу 6.
Опис програми 7.
Структура бази щодо зберігання еталонних символів 9.
Текст програми 12.
Нині, зі зростанням числа персональних комп’ютерів, величезне кількість інформації запроваджується з паперових носіїв на магнітні диски комп’ютерів. Зрозуміло це надзвичайно стомлива робота. І було б добре мати у розпорядженні програмне засіб, який би здатне сприймати вхідний зображення документа, що кажучи є картинкою, і перетворювати їх у текст, відкидаючи у своїй все лишнии деталі зображення (такі як лінії розмітки, обрамлення тощо.).
Це питання хвилює багато фірм для розробки програмного забезпечення й у світі розроблено кілька програм для розпізнавання машинопису. Але це лише початковий етап по дорозі вирішення цієї завдання. Дані програмні продукти розпізнають текст з досить великий ймовірністю помилки за умови неякісного зображення. Про те, щоб розпізнавати рукописний текст поки що й годі й говорить.
Метою розробки даної програмної системи є детальне вивчення цього питання та створення алгоритму, що дозволяє перетворювати графічне зображення у текст. Єдина відмінність даної системи від розроблених раніше те, що розпізнавати доведеться ієрогліфи. Ці знаки мають суттєва відмінність від звичної нам кирилиці і латинських символів. Вже саме те, що вони складаються з багатьох різних візерунків відкидає ідею будувати розпізнаванню апроксимировании зображення символу з допомогою який або функції. Хоча тут можна спробувати використовувати фрактальные перетворення, з допомогою яких можна описати будь-яке як завгодно складне зображення. Але теорія, яка описувала застосування даних перетворень є комерційною таємницею та недоступна. Технічні параметры.
Можливості системы.
Система забезпечує введення сканированного зображення тексти з графічного файла, записаного у одному з форматів: PCX, BMP, WMF, JPEG, GIF. Розмір зображення ні перевищувати 3000×3000 точок. Режим сканування може бути обраний те щоб розміри окремого символу (ієрогліфа) не перевищував 30 пікселів і він щонайменше 5 пікселів. Допускається нахил рядків до горизонталі лише на 6°. Відстань між окремими рядками тексту повинно бути менше 1/5 максимальної висоти ієрогліфа. Система забезпечує поділ введеного тексту деякі рядки — і на окремі символи. Результатом роботи є підставою візуальне поділ тексту на рядки — і символи, і навіть текстовий файл, у якому координати кожного виділеного символу тексту гаразд виділення. При поділі символів система використовує правило начерки ієрогліфів, відповідно до яким окремий ієрогліф вписується на більш більш-менш правильний квадрат. Отже, не гарантується, що тексти, накреслення символів яких немає відповідають даному правилу, будуть розбиватися на символи корректно.
Також у ролі доповнення до опрацювання зображення система здатна виділяти окремо вертикальні і горизонтальні лінії. Ця можливість можна використовувати для аналізу зображення окремим линиям.
Зроблено пробні експерименти по афинным перетворенням. Ці перетворення на майбутньому обіцяють дати чимало корисного у сфері обробки изображений.
Апаратне обеспечение.
Робота системи требуется:
1. IBM — сумісний персонального комп’ютера з процесором не ниже.
Intel80486sx33, обсягом ОЗУ щонайменше 4 Мб.
2. Сканер будь-якого типа.
Програмне обеспечение.
1. Операційна оболонка Windows 95, або Windows NT чи Windows версии.
3.1 чи 3.11 в поєднанні з MS-DOS версії не нижче 3.30.
2. Програмне забезпечення для сканера, що забезпечує можливість сканированного зображення на одному з форматів PCX, JPG,.
BMP, WMF.
Опис структури системи та принципу її работы.
Як середовища і розробити даної системи обрано операційна оболонка Microsoft Windows. Це пов’язано з тим, що Windows підтримує роботи з графічними зображеннями лише на рівні розробника додатків. Тим самим із роботи виключається питання кодування свої кошти роботи з графікою. Природно швидкість роботи системи з стандартними графічними засобами багато нижче, ніж безпосередня запис в видеопамять, але цьому етапі роботи питання упирається над скорость.
На розробку системи було обрано середовище програмування Borland Delphi виробництва фірми Borland International® USA, California. Delphi є середу, підтримує візуальне проектування додатків для Windows. У цьому інтерфейс користувача створюється шляхом комбінування і редагування стандартних компонентів (форм (вікон), меню, полів введення, статичних текстів, списків різної форми, екранних кнопок тощо.), наявних у стандартної бібліотеці візуального конструктора. Середовище візуального програмування обрано вона забезпечує можливість максимально простого, швидкого й якісного створення стандартних фрагментів программы[1].
У порівняні з іншими системами візуального програмування (Visual FoxPro, DBase for Windows, Microsoft Visual Basic, Microsoft Visual З++, Gupta SQLWindows тощо.) Delphi має такі преимущества.
. Всі перелічені системи є інтерпретаторами, тобто до виконання створених у них програм потрібно завантаження модуля інтерпретатора мови, або псевдокомпиляторами, які формують програму вигляді EXE-модуля, що містить псевдокод программы.
(належним чином закодований текст) і модуль інтерпретації, виконує цей псевдокод. У Delphi™ результатом генерації проекту є програма мовою Object Pascal™, який компілюється компілятором Borland Pascal 8.0™ в EXE — модуль, або DLL — бібліотеку. EXE — модуль містить процесорний код і то, можливо запущено безпосередньо з Windows™. DLL-библиотеку може використати будь-який Windows™ — додаток, зокрема написане іншою языке.
Насправді ж компіляція забезпечує значно більше швидкодію і дає виграш з пам’яті і дисковому простору (якщо врахувати ресурси, споживані модулем інтерпретації в інтерпретує системах).
. На відміну від створення низки систем (Visual FoxPro™, DBase for Windows™,.
Microsoft® Visual Basic™) Delphi™ забезпечує можливість візуального конструювання як інтерфейсу, а й низки стандартних модулів програми, не відображуваних на екрані. З іншого боку, Delphi™ має стандартні кошти створення власних як екранних та невидимих компонентів, що дозволяє необмежено розширювати набір об'єктів, використання є можливе будь-якому проекті, і нічим не відрізняється від використання стандартних об'єктів бібліотеки Delphi™.
. У Delphi™ доступні тексти програми, породженої візуальним конструктором, причому зміни у них впливають до можливості подальшого опрацювання їх конструктором. Це дає можливості робити необхідну корекцію роботи об'єктів програми, якщо вона забезпечується візуальним конструктором.
Отже, Delphi відповідає вимогам зручності, швидкості і якості розробки. З іншого боку, використання мови Pascal дозволяє забезпечити прийнятну швидкість виконання перетворень, потребують великого об'єму обчислень з допомогою дійсною компіляції й можливості безпосередньої роботи з пам’яттю компьютера.
Спочатку створити алгоритм кодування символу, який би дозволяв осущесвлять його однозначну ідентифікацію (рис. 1).
[pic] рис. 1.
Так було в ньому планувалося білі пикселы кодувати 0, а чорні - 1 і вивчати ні як окремі а групою, тобто. група білих пікселів — це 0, далі група чорних — 1 тощо. Через війну, символ, укладений у прямокутну (рис. 1) рамку дає наступний код:
010 1 010.
1 010 101 010.
010 1 010.
1 010 101 010.
010 1 010.
1 010 0101.
010 010.
Але практично виявилося, що це спосіб не адресований розв’язуваної завдання, т.к. він дуже прив’язаний до накресленню символу. При зміні розміру символу або за трохи відмінному накресленні його код змінюється дуже істотно. При збільшенні розміру символу з’являються додаткові рядки, отже, і додаткові символи коду. Отже однозначне декодування символу при в даних обставинах видається возможным.
Але цей досвід не пройшов задарма. Було зроблено відповідні висновки, а именно:
. Не можна прив’язуватися до накресленню символу, тобто. до окремим пикселам.
. Потрібно аналізувати зображення за пикселам, а, по окремих елементах, таких як лінії, кружечки, крючечки.
. Альтернативою попередньому висновку є визначення щільності зображення на окремих його частях.
Опис метода.
У розроблюваній системі використовується саме третій метод, тобто. визначення щільності зображення на окремих його частях.
Суть його ось у чому:. Спочатку по всьому зображенні виділяється область, що обмежує окремий символ.. Потім ця галузь ділиться на 9 рівних частин (рис. 2).
[pic] рис. 2.
. У кожному з 9 квадратів підраховується число чорних пікселів і ділиться на площа даного квадрата, тобто. визначається щільність заповнення у кожному квадраті.. Усі 9 певних плотностей перетворюються на формат Х. ХХХ і далі в рядок типу Х. ХХХ Х.ХХХ Х. ХХХ Х.ХХХ Х. ХХХ Х.ХХХ Х. ХХХ Х.ХХХ.
Х.ХХХ.
Перетворення в рядок виробляється ще зручного зберігання даних базі даних (структура бази описано на додатку), оскільки це як зручніше, ніж робити у базі 9 полів для зберігання 9 значень плотности.
Декодування символу виробляється аналогічним чином, лише отримані дані порівнюються зі значеннями збереженими у базі данных.
Опис программы.
Усі операції здійснюються у вигляді головного меню програми. Головне меню складається з таких пунктов:
1) Файл.
. Відкрити файл Відкривається вікно вибору файла. Можливі маски для вибору (BMP, PCX, JPG.
). Якщо обраний файл є правильною графічним файлом, то зберігали у ньому зображення виводиться у вікно програми.. Виділити линии.
Перед користувачем з’являється діалогове вікно, у якому їй дається вибрати які лінії виділяти (вертикальні чи горизонтальні). 1) Операции.
. Очистить.
Той файл, який відкрили відкривається знову і всі лінії які у процесі роботи удаляются.
. Визначити щільність (навчання) Цей пункт меню призначений на навчання системи. У вікні повинен перебуває еталонний текст. З допомогою «мишки» виділяється потрібний символ і вибирається даний пункт. Після цього користувачеві дають можливість вказати унікальний код для обраного символу. Певна щільність і код записуються до бази данных.
. Распознать.
Цей пункт протилежний попередньому. З допомогою «мишки» виділяється потрібний символ і вибирається даний пункт. Відбувається визначення щільності обраного символу і далі у базі здійснюється пошук записи, що має полі з еталонною рядком більш подібно з щільністю виділеного символа.
Порівняння відбувається наступним образом:
Визначається і складаються між собою різниці між плотностями еталонного і виділеного символами кожному за квадрата. Той еталонний символ, яка має отримана сума виявиться найменшої вважається еквівалентом для виділеного. 1) Преобразования.
Ці перетворення є експериментальними і є метою поставленого завдання. Отримані результати за більш глибокому дослідженні можна подальшому використовуватимуться обробки изображений.
. Афинное преобразование.
. Узоры.
Ці дві пункту будують зображення користуючись афинными перетвореннями з різними коефіцієнтами. Залежно від результатів цих коефіцієнтів зображення виходять различными.
. Ліст папоротника.
Знову-таки виходячи з афинных перетвореннях будується лист папороті. Дане перетворення має величезну практичного значення, оскільки щодо складне зображення (лист папороті) будується з допомогою однієї формули. 1) Вихід Вихід із программы.
Приложение Структура бази щодо зберігання еталонних символов.
|Код символу |Еталонна рядок | | | |.
Код символу — однозначно ідентифікує бережене символ. Позаяк у базі зберігаються еталони ієрогліфів, котрим у російському алфавіті немає прикладу начерки, то тут для заміни розпізнаного символу потрібно ще зберігати та її еталонне зображення. Та оскільки метою даної роботи є підставою не заміна розпізнаних символів на еталонні, лише співвіднесення з еталоном, то тут для економії дискового простору вирішено зберігати не еталонне зображення символу, лише його унікальний код, з допомогою якого однозначно ідентифікувати символ.
Еталонна рядок — рядок, яка містить у собі все 9 плотностей виділеної области.
[pic].
[pic].
Текст программы.
{$I CdBase. inc} {$I CdComp. inc} unit Main;
interface.
uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, Reg_imag, Menus, Options, CmplSign, DBTables, DB;
type TMainForm = class (TForm).
MainMenu: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
Image: TMultiImage;
N3: TMenuItem;
NFileOpen: TMenuItem;
OpenDialog: TOpenDialog;
NSelect: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
Onemore1: TMenuItem;
N8: TMenuItem;
N9: TMenuItem;
DataTable: TTable;
N10: TMenuItem;
DataTableOpis: TStringField;
DataTableID: TFloatField; procedure N2Click (Sender: TObject); procedure NFileOpenClick (Sender: TObject); procedure NSelectClick (Sender: TObject); procedure FormCreate (Sender: TObject); procedure ImageMouseDown (Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); procedure ImageMouseUp (Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); procedure ImageMouseMove (Sender: TObject; Shift: TShiftState; X,.
Y: Integer); procedure N4Click (Sender: TObject); procedure N7Click (Sender: TObject); procedure Onemore1Click (Sender: TObject); procedure N8Click (Sender: TObject); procedure N9Click (Sender: TObject); procedure N5Click (Sender: TObject); procedure N10Click (Sender: TObject); private.
DetectRectX, DetectRectY: real; { Кут, під яким виділяти лінії } xStart, xEnd, yStart, yEnd: word;
BegSelect: boolean; procedure DefGradient (var Gx, Gy: real; x, y: word); procedure SetRect; procedure DefPlotn; procedure AfinConvert; procedure OneMore; procedure Mandel; procedure Paporotnik; function GetDensity: string; public.
{ Public declarations } end;
var MainForm: TMainForm;
implementation {$R *.DFM}.
procedure TMainForm. N2Click (Sender: TObject); begin Application. Terminate; end;
procedure TMainForm. NFileOpenClick (Sender: TObject); begin if OpenDialog. Execute then begin.
Image.ImageName := OpenDialog. FileName;
NSelect.Enabled := True; end else NSelect. Enabled := False; end;
procedure TMainForm. NSelectClick (Sender: TObject); var Result: word; begin OptionForm := nil; try.
OptionForm := TOptionForm. Create (Self); with OptionForm do begin.
RectXEdit.Text := FloatToStr (DetectRectX);
RectYEdit.Text := FloatToStr (DetectRectY);
X1Edit.Text := IntToStr (xStart);
X2Edit.Text := IntToStr (xEnd);
Y1Edit.Text := IntToStr (yStart);
Y2Edit.Text := IntToStr (yEnd);
Result := ShowModal;
DetectRectX := StrToInt (RectXEdit.Text);
DetectRectY := StrToInt (RectYEdit.Text); xStart := StrToInt (X1Edit.Text); xEnd := StrToInt (X2Edit.Text); yStart := StrToInt (Y1Edit.Text); yEnd := StrToInt (Y2Edit.Text); end; { with } finally.
OptionForm.Free; end; { try } if Result = mrOK then SetRect; end;
{ Визначення градієнтів Gx і Gy у точці [x, y] } procedure TMainForm. DefGradient (var Gx, Gy: real; x, y: word); var a, b, з, d, e, g, h, і: byte; begin with Image. Canvas do begin if Pixels[x-1,y-1] = clBlack then a := 0 else a := 1; if Pixels[x, y-1] = clBlack then b := 0 else b := 1; if Pixels[x+1,y-1] = clBlack then з := 0 else з := 1; if Pixels[x-1,y] = clBlack then d := 0 else d := 1; if Pixels[x+1,y] = clBlack then e := 0 else e := 1; if Pixels[x-1,y+1] = clBlack then g := 0 else g := 1; if Pixels[x, y+1] = clBlack then h := 0 else h := 1; if Pixels[x+1,y+1] = clBlack then і := 0 else і := 1;
{ Градієнт по X }.
Gx := g + 2*h + і - a — 2*b — з; if Gx < 0 then Gx := 0; if Gx = 0 then Gx := 0.1;
{ Градієнт по Y }.
Gy := з + 2*e + і - a — 2*d — g; if Gy < 0 then Gy := 0; end; { with Image } end;
procedure TMainForm. SetRect; var x, y: word; Gx, Gy, Qx, Qy: real; OutF: TextFile; S1, S2: string; begin AssignFile (OutF, «tangs.000 »); Rewrite (OutF); { Сканируем все зображення } with Image. Canvas do begin for y := yStart+1 to yEnd-1 do begin for x := xStart+1 to xEnd-1 do begin.
DefGradient (Gx, Gy, x, y); { Визначити градієнт у точці [x, y] }.
{if Gx+Gy > 0 then Pixels[x, y+200] := clRed;}.
Qx := ArcTan (Gy/Gx);
Qx := Round (Qx*180/Pi);
{ Qx := Round (90*Gx/4);
Qy := Round (90*Gy/4);}.
Str (Qx:2:0, S1); { Str (Qy:2:0, S2); }.
Write (OutF, S1+{ «» +S2+} «| «);
{ if (Q = Pi/3) then Pixels[x, y+200] := clRed;} if (Qx > { DetectRectX}80) and (Qx < 100){ and (Q > DetectRect*Pi/180) }then.
Pixels[x, y+200] := clRed; end; { for x }.
WriteLn (OutF, «End Line »); end; { for y } end; { with Image. Canvas } CloseFile (OutF); end;
procedure TMainForm. DefPlotn; var і, j, x, y, dx, dy, Range, x1, y1: word; Count: word; begin x := xStart; y := yStart; dx := Round ((xEnd-xStart+1) divx 3); dy := Round ((yEnd-yStart+1) divx 3); x1 := x; y1 := y; { Три квадрата за вертикаллю } for і := 1 to 3 do begin if і = 2 then Range := (yEnd-yStart+1) — 2*dy else Range := dy;
{ Три квадрата за горизонталлю } for j := 1 to 3 do begin if j = 2 then Range := (xEnd-xStart+1) — 2*dx else Range := dx;
{ Сканируем всередині квадрата по y } for y := y1 to y1+Range do begin.
{ Сканируем всередині квадрата по x } for x := x1 to x1+Range do begin.
{ Підраховуємо число не білих пікселів } if Image.Canvas.Pixels[x, y] clWhite then Inc (Count); end; { for x } end; { for y } x1 := x1+dx; { Наступний квадрат за горизонталлю } end; { for j } y1 := y1+dy; { Наступний квадрат за вертикаллю } end; { for і } end;
procedure TMainForm. FormCreate (Sender: TObject); begin OpenDialog. FileName := «c:delphimydirdiplompictpict1.bmp »; Image. ImageName := OpenDialog. FileName; end;
procedure TMainForm. ImageMouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button = mbRight then begin.
Image.ImageName := OpenDialog. FileName;
Exit; end; BegSelect := True; with Image. Canvas do begin.
Pen.Mode := pmXor;
Pen.Color := clGreen;
Pen.Style := psDot;
Brush.Style := bsClear; xStart := X; yStart := Y; xEnd := X; yEnd := Y; end; { with } end;
procedure TMainForm. ImageMouseUp (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin BegSelect := False; with Image. Canvas do begin.
Pen.Mode := pmCopy;
Pen.Color := clBlack;
Pen.Style := psSolid;
Brush.Style := bsSolid; end; { with } end;
procedure TMainForm. ImageMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if not BegSelect then Exit; with Image. Canvas do begin.
Rectangle (xStart, yStart, xEnd, yEnd); xEnd := X; yEnd := Y;
Rectangle (xStart, yStart, xEnd, yEnd); end; { with } end;
procedure TMainForm. N4Click (Sender: TObject); begin Image. ImageName := OpenDialog. FileName; end;
{ Афинное перетворення } procedure TMainForm. AfinConvert; var dx, dy, Rand: word; A, B, З, D, E, F: real; x, y: word; і: longint; begin A := 0.5; B := 0.5; E := 0; З := 0.3; D := 0; F := 1;
dx := (xEnd-xStart+1) divx 2; xEnd := xStart +2*dx — 1; dy := (yEnd-yStart+1) divx 2; yEnd := yStart +2*dy — 1;
x := xStart+dx; y := yStart+dy; Randomize; for і := 1 to 50 000 do begin.
Rand := Random (10);
Case Rand of.
0.3: begin x := xStart + 1 + (x-xStart+1) divx 2; y := yStart + 1 + (y-yStart+1) divx 2; end;
4: begin x := xStart + dx + (x-xStart+1) divx 2; y := yStart + 1 + (y-yStart+1) divx 2; end;
5: begin x := xStart + 1 + (x-xStart+1) divx 2; y := yStart + dy + (y-yStart+1) divx 2; end;
6.9: begin x := xStart + dx + (x-xStart+1) divx 2; y := yStart + dy + (y-yStart+1) divx 2; end; end; { Case }.
Image.Canvas.Pixels[x, y] := clBlue; end; { for і } end;
procedure TMainForm. N7Click (Sender: TObject); begin AfinConvert; end;
procedure TMainForm. OneMore; var dx, dy, Rand, Kx, Ky: word; A, B, З, D, E, F: real; x, y, K: real; і: longint; begin Kx := 4; Ky := 4; dx := (xEnd-xStart+1) divx Kx; xEnd := xStart +Kx*dx — 1; dy := (yEnd-yStart+1) divx Ky; yEnd := yStart +Ky*dy — 1; x := xStart; y := yStart; for і := 1 to 100 000 do begin.
Rand := Random (Kx*Ky); if (Rand = 0) or (Rand = 3) or (Rand = 12) or (Rand = 15) then.
Continue;
K := (Rand — Kx*(Rand divx Kx)) *dx; x := K + xStart + 1 + (x-xStart+1) / Kx;
K := (Rand divx Kx)*dy; y := K + yStart + 1 + (y-yStart+1) / Ky;
Image.Canvas.Pixels[Round (x), Round (y)] := clBlue; end; { for і } end;
procedure TMainForm. Onemore1Click (Sender: TObject); begin OneMore; end;
procedure TMainForm. Mandel; var Z, Z0, З: TComplex; і, x, y: word; begin Z0 := TComplex. Create (0,0); Z := TComplex. Create (0,0); З := TComplex. Create (0,0); for y := yStart to yEnd do begin for x := xStart to xEnd do begin.
C.Assign (x, y);
Z.Mul (Z0);
Z.Plus (C); if (Z.Re < 2) and (Z.Im < 2) then.
Image.Canvas.Pixels[Z.Re, Z. Im] := clBlue;
Z.Assign (0,0); end; { for x } end; { for y } C. Free; Z. Free; Z0. Free; end;
procedure TMainForm. N8Click (Sender: TObject); begin Mandel; end;
procedure TMainForm. Paporotnik; const A: array[0.3, 0.2, 0.3] of integer =.
(((0,0,0,0); INSERT INTO `ref` (`id_predmet`, `name_predmet`, `id_ref`, `name_ref`, `text_ref`) VALUES (0,20,0,0); INSERT INTO `ref` (`id_predmet`, `name_predmet`, `id_ref`, `name_ref`, `text_ref`) VALUES (0,0,0,0)),.
((85,0,0,0); INSERT INTO `ref` (`id_predmet`, `name_predmet`, `id_ref`, `name_ref`, `text_ref`) VALUES (0,85,11,70); INSERT INTO `ref` (`id_predmet`, `name_predmet`, `id_ref`, `name_ref`, `text_ref`) VALUES (0,-10,85,0)),.
((31,-41,0,0); INSERT INTO `ref` (`id_predmet`, `name_predmet`, `id_ref`, `name_ref`, `text_ref`) VALUES (10,21,0,21); INSERT INTO `ref` (`id_predmet`, `name_predmet`, `id_ref`, `name_ref`, `text_ref`) VALUES (0,0,30,0)),.
((-29,40,0,0); INSERT INTO `ref` (`id_predmet`, `name_predmet`, `id_ref`, `name_ref`, `text_ref`) VALUES (10,19,0,56); INSERT INTO `ref` (`id_predmet`, `name_predmet`, `id_ref`, `name_ref`, `text_ref`) VALUES (0,0,30,0))); var b: array[1.15 000] of word; k, n, і: word; newX, newY, z, x, y: real; Color: longint; begin x := 0; y := 0; z := 0; Randomize; for k := 1 to 15 000 do begin b[k] := Random (10); if b[k] > 3 then b[k] := 1; end; { for k }.
і := 1; { b[i] := 1;} for і := 1 to 10 000 do begin newX := (a[b[i], 0,0]*x + a[b[i], 0,1]*y + a[b[i], 0,2]*z) / 100+ a[b[i], 0,3]; newY := (a[b[i], 1,0]*x + a[b[i], 1,1]*y + a[b[i], 1,2]*z) / 100+ a[b[i], 1,3]; z := (a[b[i], 2,0]*x + a[b[i], 2,1]*y + a[b[i], 2,2]*z) / 100+ a[b[i], 2,3]; x := newX; y := newY;
Color := Random (65 535);
Color := Color*100;
Image.Canvas.Pixels[Round (300-x+z), Round (350-y)] := clGreen; end; { for k } end;
procedure TMainForm. N9Click (Sender: TObject); begin Paporotnik; end;
function TMainForm. GetDensity: string; var і, j: byte; LenX, LenY, x, y, xOld, yOld, dx, dy: word; BlackCnt, TotCnt: word; P: real; { Щільність пікселів в квадраті } P. S, S1: string; begin { Визначаємо щільність о 9-й квадрантах } { виділеного діапазону } P. S := «»; LenX := xEnd-xStart+1; LenY := yEnd-yStart+1; xOld := xStart; yOld := yStart; for j := 1 to 3 do begin if j = 2 then dy := LenY-2*Round (LenY/3) else dy := Round (LenY/3); for і := 1 to 3 do begin if і = 2 then dx := LenX-2*Round (LenX/3) else dx := Round (LenX/3); {—————————————————————————————————}.
BlackCnt := 0; { У чорних пікселів в квадраті } for y := yOld to yOld+dy-1 do begin for x := xOld to xOld+dx-1 do begin if Image.Canvas.Pixels[x, y] clWhite then Inc (BlackCnt); end; { for x } end; { for y } {—————————————————————————————————}.
TotCnt := dx*dy;
P := BlackCnt/TotCnt; { Щільність пікселів в квадраті }.
Str (P:1:3, S1);
P.S := S+S1+ «»; xOld := xOld+dx; end; { for і } yOld := yOld+dy; end; { for j } Result := P. S; end; { TMainForm. GetDensity }.
procedure TMainForm. N5Click (Sender: TObject); var P. S: string; ID: word; begin P. S := GetDensity; ID := DataTable. RecordCount; DataTable. AppendRecord ([ID+1, P. S]); end;
procedure TMainForm. N10Click (Sender: TObject); var SValue: string[5]; P. S, DStr1, DStr2, OldS: string; Value, NewValue: real; і: byte; ID: word; begin P. S := GetDensity; OldS := P. S; DataTable. First; Value := 100; ID := 0; while not DataTable. EOF do begin.
NewValue := 0;
{—————————————————————————————-} for і := 1 to 9 do begin.
DStr1 := Copy (S, (i-1)*6+1, 5);
DStr2 := Copy (DataTableOpis.Value, (i-1)*6+1, 5);
NewValue := NewValue + Abs (StrToFloat (DStr2)-StrToFloat (DStr1)); end; { for і }.
{—————————————————————————————-} if NewValue < Value then begin.
Value := NewValue;
ID := DataTableID. AsInteger; end;
DataTable.Next; end; { while } ShowMessage (IntToStr (ID)); end; end.
———————————- [1] Відомо, що з створенні звичайними засобами («руками») інтерфейсу користувача для програм, що працюють у графічних середовищах, це йде більш 80% часу розробки приложения.