Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.05.2012, 15:36   #11
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Swordaria Посмотреть сообщение
Спасибо!
Я попробовала все это дела запустить, и вот у меня ошибка в этой строчке
Код:
Lightness:=(r+g)/2;
[DCC Error] Unit1.pas(362): E2010 Incompatible types: 'Byte' and 'Extended'
[DCC Fatal Error] Project1.dpr(6): F2063 Could not compile used unit 'Unit1.pas'
Поменяйте дробное деление на целочисленное.
s-andriano вне форума Ответить с цитированием
Старый 19.05.2012, 16:06   #12
Swordaria
Пользователь
 
Регистрация: 10.05.2012
Сообщений: 11
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Я немного ошибся в старом коде.
Я ставил на bitmap самую правую и нижнюю точку каждого блока
Нужно вот так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
const
  norm = 64;
var
  bm: tbitmap;
  i, j, z, q: integer;
  R, G, b: byte;
  Y: integer;
  count: integer;
begin
  with Image1.Picture.Bitmap do
  begin
    bm := tbitmap.Create;
    bm.Width := Width div 8 + 1 mod (1 + Width mod 8);
    bm.height := height div 8 + 1 mod (1 + height mod 8);
    for i := 0 to bm.Width - 1 do
      for j := 0 to bm.height - 1 do
      begin
        caption := inttostr(i) + ' ' + inttostr(j);
        Y := 0;
        count := (min(8 * i + 8, Width - 1) - 8 * i) *
          (min(8 * j + 8, height - 1) - 8 * j);
        for z := 8 * i to min(8 * i + 8, Width - 1) do
          for q := 8 * j to min(8 * j + 8, height - 1) do
          begin
            R := canvas.pixels[z, q];
            G := canvas.pixels[z, q] shr 8;
            b := canvas.pixels[z, q] shr 16;
            Y := Y + round(0.59 * G + 0.3 * R + 0.11 * b);
          end;
        if Y / count > norm then
          bm.canvas.pixels[i, j] := clwhite
        else
          bm.canvas.pixels[i, j] := clblack;
      end;
    bm.savetofile('1.bmp');
    bm.free;
  end;
end;

ПС Я писал простенький цифро распознаватель. Распознает 1 рукописную цифру, иногда
И это уже достижение)
Хотя у меня скорей не распознаватель будет, а сравниватель)

а можно теперь сделать так... записать каждый пиксель как 0 или 1, у меня изображение ч.б. типа матрицы сделать?
Swordaria вне форума Ответить с цитированием
Старый 19.05.2012, 16:18   #13
Swordaria
Пользователь
 
Регистрация: 10.05.2012
Сообщений: 11
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
Поменяйте дробное деление на целочисленное.
Спасибо, помогло) Только результат похож на обычную бинаризацию..
Swordaria вне форума Ответить с цитированием
Старый 19.05.2012, 16:40   #14
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,427
По умолчанию

Цитата:
Сообщение от Swordaria Посмотреть сообщение
а можно теперь сделать так... записать каждый пиксель как 0 или 1, у меня изображение ч.б. типа матрицы сделать?
Во-первых, не злоупотребляйте цитированием, можно даже просто написать в виде обращения.
Во-вторых, в bm и получилась матрица (черный пиксель - 0, белый - 1).
Но можно создать динамический массив и писать в него:
Код:
procedure TForm1.Button2Click(Sender: TObject);
const
  norm = 64;
var
  bm: array of array of byte;
  i, j, z, q: integer;
  R, G, b: byte;
  Y: integer;
  count: integer;
  w, h: integer;
  ts: tstringlist;
  s: string;
begin
  with Image1.Picture.Bitmap do
  begin
    w := Width div 8 + 1 mod (1 + Width mod 8);
    h := height div 8 + 1 mod (1 + height mod 8);
    setlength(bm, w, h);
    for j := 0 to h - 1 do
      for i := 0 to w - 1 do
      begin
        caption := inttostr(i) + ' ' + inttostr(j);
        Y := 0;
        count := (min(8 * i + 8, Width - 1) - 8 * i) *
          (min(8 * j + 8, height - 1) - 8 * j);
        for z := 8 * i to min(8 * i + 8, Width - 1) do
          for q := 8 * j to min(8 * j + 8, height - 1) do
          begin
            R := canvas.pixels[z, q];
            G := canvas.pixels[z, q] shr 8;
            b := canvas.pixels[z, q] shr 16;
            Y := Y + round(0.59 * G + 0.3 * R + 0.11 * b);
          end;
        if Y / count > norm then
          bm[i, j] := 1
        else
          bm[i, j] := 0;
      end;
  end;
  ts := tstringlist.Create;
  for j := 0 to h - 1 do
  begin
    s := '';
    for i := 0 to w - 1 do
      s := s + inttostr(bm[i, j]);
    ts.Append(s);
  end;
  ts.savetofile('1.txt');
  setlength(bm, 0, 0);
  ts.free;
end;
В текстовом файле:
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 19.05.2012, 17:02   #15
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Цитата:
Rin, Эта процедура сделает все изображение либо белым, либо черным?
Не все изображение, а только пиксель.
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 20.05.2012, 11:50   #16
Swordaria
Пользователь
 
Регистрация: 10.05.2012
Сообщений: 11
По умолчанию

BDA, спасибо за совет и помощь))
Думаю, у меня будут еще вопросы)
Swordaria вне форума Ответить с цитированием
Старый 20.05.2012, 13:16   #17
Swordaria
Пользователь
 
Регистрация: 10.05.2012
Сообщений: 11
По умолчанию

BDA, получается то, что надо))
Правда тот вариант до исправления ошибки мне нравится больше)
А теперь можно сделать так, чтобы этот текстовый файл можно было сравнить с другим текстовым файлом, в котором много подобных картинок переведенных в 0 и 1, и найти совпадения? и чтоб выводилось сообщение, о том что совпадения есть.
Swordaria вне форума Ответить с цитированием
Старый 20.05.2012, 19:40   #18
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,427
По умолчанию

Цитата:
Правда тот вариант до исправления ошибки мне нравится больше)
Но тогда неправильно ведь считалось все.
Текстовый файл сделан всего лишь "для красоты", чтобы мы могли понять, что в массиве bm получилось то, что нужно.

Если не делать setlength(bm, 0, 0); и объявить bm глобально, а не в процедуре нажатия кнопки, то потом можно будет сравнивать его содержимое с заранее подготовленными массивами и рассчитывать процент совпадения.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 20.05.2012, 21:42   #19
Swordaria
Пользователь
 
Регистрация: 10.05.2012
Сообщений: 11
По умолчанию

BDA, а ты мне с этим можешь помочь?)
Я могу подготовить массивы.
Swordaria вне форума Ответить с цитированием
Старый 22.05.2012, 13:06   #20
Swordaria
Пользователь
 
Регистрация: 10.05.2012
Сообщений: 11
По умолчанию

А может создать БД и в ней искать совпадения?
Swordaria вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Казахский язык, Делфи. grom333 Общие вопросы Delphi 12 17.01.2012 23:24
как перевести на язык делфи Giku Помощь студентам 1 12.11.2011 18:21
Обработка типизированного файла со сведениями о книгах (язык C) Светлана18 Помощь студентам 1 26.04.2011 09:00
переведите с с++ на язык делфи cdznsdg Помощь студентам 2 17.03.2011 08:17
переведите программу с языка с++ на язык делфи... cdznsdg Помощь студентам 0 17.03.2011 01:14