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

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

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

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

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

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

Приветствую!
Задача такая:
1.Разбить изображение на блоки 8 на 8.
2.Посчитать среднюю яркость в каждом блоке.
3.Присвоить каждому блоку значение 0 или 1 в зависимости от порога, если больше, то 0, если меньше, то 1.
(Причем сделать это наглядной картинкой, на которой будут эти 0 и 1 )
4.Сохранить полученные последовательности построчно.
нужно сделать так, чтобы в дальнейшем можно было выбирать нужную строку. Например, изображение разбито на 1о строк, а мне нужна 4я и 7я.
5.Сравнить выбранные строки с хранящимися аналогичными последовательностями в базе данных. (искать совпадения)
Swordaria вне форума Ответить с цитированием
Старый 18.05.2012, 15:30   #2
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Swordaria

Задача такая:

Задача клёвая. А нам она зачем? Распечатать и в туалете повесить?
Rififi вне форума Ответить с цитированием
Старый 18.05.2012, 15:34   #3
Swordaria
Пользователь
 
Регистрация: 10.05.2012
Сообщений: 11
По умолчанию

ну здесь вроде "помощь студентам"?
Swordaria вне форума Ответить с цитированием
Старый 18.05.2012, 15:43   #4
Niro
Форумчанин
 
Аватар для Niro
 
Регистрация: 23.09.2010
Сообщений: 682
По умолчанию

Цитата:
"помощь студентам"
Вы же предлагаете решить за Вас
Задавайте конкретные вопросы, выкладывайте наработки, идеи, и Вам помогут
Проще всего признать свою ошибку.
Гораздо труднее еЁ осознать и исправить.
Niro вне форума Ответить с цитированием
Старый 18.05.2012, 15:48   #5
Swordaria
Пользователь
 
Регистрация: 10.05.2012
Сообщений: 11
По умолчанию

Код:
const
norm=64;
 Mad :array [1..8,1..8] of real = ((1,1,1,1,1,1,1,1),(1,1,1,1,1,1,1,1),(1,1,1,1,1,1,1,1),(1,1,1,1,1,1,1,1),(1,1,1,1,1,1,1,1),(1,1,1,1,1,1,1,1),(1,1,1,1,1,1,1,1),(1,1,1,1,1,1,1,1));
var
  i, xmin, ymin: Integer;
  j, Q_ver, Q_gor: Integer;
  ii,jj:byte;
  R,G,B:byte;
  rezy : byte;
  y : byte;
  k : integer;
  m : integer;

  sum, min:integer;
  rez:real;
begin
for i := 1 to Image1.width do
  for j := 1 to Image1.height  do
  begin
    rez:=0;
     for jj := 1 to 8 do
    for ii := 1 to 8 do

        begin
       r := getRvalue(Image1.Canvas.Pixels[i+ii-2,j+jj-2]);
       g := getGvalue(Image1.Canvas.Pixels[i+ii-2,j+jj-2]);
       b := getBvalue(Image1.Canvas.Pixels[i+ii-2,j+jj-2]);
       y:=round(0.59*g+0.3*r+0.11*b);
       rez:=rez+y*mad[ii,jj];
        end;
        rezy:=round(rez/norm);
        image8.Canvas.Pixels[i,j]:=rgb(rezy,rezy,rezy);
  end;


end;
я сделала так, но от этого картинка становится просто мутной.
Мне нужно понять для начала как сделать, чтобы в каждом блоке отдельно считалась яркость?
Swordaria вне форума Ответить с цитированием
Старый 18.05.2012, 15:50   #6
Swordaria
Пользователь
 
Регистрация: 10.05.2012
Сообщений: 11
По умолчанию

и это только часть программы, я не прошу все сделать за меня.
Можно хотя бы с алгоритмом помочь. А то я не знаю как все эти циклы разместить..
Swordaria вне форума Ответить с цитированием
Старый 19.05.2012, 01:59   #7
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Для того, чтобы узнать яркость нужно всего лишь преобразовать RGB в HSL. В частности вам нужно узнать яркость:
Код:
       r := getRvalue(Image1.Canvas.Pixels[i+ii-2,j+jj-2]);
       g := getGvalue(Image1.Canvas.Pixels[i+ii-2,j+jj-2]);
       b := getBvalue(Image1.Canvas.Pixels[i+ii-2,j+jj-2]);
// ищем mах и min. В результате в "r" будет max, а в "g" будет min.
 if r<b then  begin    r:=r+b;    b:=r-b;    r:=r-b;   end;
 if b<g then  begin    b:=b+g;    g:=b-g;    b:=b-g;   end;
 if r<b then  begin    r:=r+b;    b:=r-b;    r:=r-b;   end;
// высчитыаем яркость
Lightness:=(r+g)/2;
{ если у вас порог в интервале от 0 до 1, а не от 0 до 255, то 
Lightness:=(r+g)/510;}
if Lightness> norm then
 image8.Canvas.Pixels[i,j]:=clWhite;
else  image8.Canvas.Pixels[i,j]:=clBlack;
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 19.05.2012, 02:21   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,427
По умолчанию

Вот пример разделения на блоки.
Из изображения source.bmp получается 1.bmp (изображает яркость, а по сути, обычное преобразование в grayscale+изменение размера).

ПС Распознаватель текста/каптчи пишите?
Вложения
Тип файла: zip pr.zip (3.77 Мб, 13 просмотров)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 19.05.2012 в 02:28.
BDA вне форума Ответить с цитированием
Старый 19.05.2012, 14:11   #9
Swordaria
Пользователь
 
Регистрация: 10.05.2012
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Rin Посмотреть сообщение
Для того, чтобы узнать яркость нужно всего лишь преобразовать RGB в HSL. В частности вам нужно узнать яркость:
Код:
       r := getRvalue(Image1.Canvas.Pixels[i+ii-2,j+jj-2]);
       g := getGvalue(Image1.Canvas.Pixels[i+ii-2,j+jj-2]);
       b := getBvalue(Image1.Canvas.Pixels[i+ii-2,j+jj-2]);
// ищем mах и min. В результате в "r" будет max, а в "g" будет min.
 if r<b then  begin    r:=r+b;    b:=r-b;    r:=r-b;   end;
 if b<g then  begin    b:=b+g;    g:=b-g;    b:=b-g;   end;
 if r<b then  begin    r:=r+b;    b:=r-b;    r:=r-b;   end;
// высчитыаем яркость
Lightness:=(r+g)/2;
{ если у вас порог в интервале от 0 до 1, а не от 0 до 255, то 
Lightness:=(r+g)/510;}
if Lightness> norm then
 image8.Canvas.Pixels[i,j]:=clWhite;
else  image8.Canvas.Pixels[i,j]:=clBlack;
Спасибо!
Я попробовала все это дела запустить, и вот у меня ошибка в этой строчке
Код:
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'

Цитата:
Сообщение от BDA Посмотреть сообщение
Вот пример разделения на блоки.
Из изображения source.bmp получается 1.bmp (изображает яркость, а по сути, обычное преобразование в grayscale+изменение размера).

ПС Распознаватель текста/каптчи пишите?
Да, распознавание регистрационных номеров автомобилей.
Но мне нужно, чтобы в каждом блоке отдельно считалась яркость. Там так и есть(в Вашей программе)?
или там блок 8 на 8 превращается в одну точку средней яркости этих блоков?

Rin, Эта процедура сделает все изображение либо белым, либо черным?

Последний раз редактировалось Stilet; 20.05.2012 в 13:21.
Swordaria вне форума Ответить с цитированием
Старый 19.05.2012, 15:18   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,427
По умолчанию

Я немного ошибся в старом коде.
Я ставил на 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 рукописную цифру, иногда
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 19.05.2012 в 15:25.
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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