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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.04.2010, 09:28   #21
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...что за ошибку выдает, и где массив <p> и <tab>
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 15.04.2010, 14:09   #22
ArtInt
Форумчанин
 
Аватар для ArtInt
 
Регистрация: 06.03.2009
Сообщений: 583
По умолчанию

Сравни код Автор Barbichette:
http://www.delphisources.ru/pages/so...e-effects.html
Не стыдно чего-то не знать, стыдно не стремиться к знаниям.
ArtInt вне форума Ответить с цитированием
Старый 21.04.2010, 03:53   #23
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
По умолчанию

ArtInt, я именно оттуда и взял этот исходник). Проблема в том, что там алгоритм работает, а у меня нет
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 21.04.2010, 09:27   #24
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Что, до сих пор не разобрался? Кинь исходник тогда, я посмотрю и попробую исправить. Недавно работал над программой где квантизацию использовал, пока не забыл вроде.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 21.04.2010, 14:07   #25
ArtInt
Форумчанин
 
Аватар для ArtInt
 
Регистрация: 06.03.2009
Сообщений: 583
По умолчанию

artemavd
А инициализацию Bitmap и Image делаете?
Там в "оригинальном" исходнике. Сначала, когда создается форма, то:

Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
 Image1.Parent.DoubleBuffered:=true;
//загрузил заранее, поэтому коммент
// Image1.Picture.LoadFromFile('image.bmp');
 bt:=tbitmap.Create;
 bt.Assign(image1.Picture.Bitmap);
 bt.PixelFormat:=pf32bit;

end;
А уже после жмем по кнопке с кодом:

Код:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
 rw,w,h,i,j,k,l:integer;
 gc,g:integer;
 p:pbytearray;
 tab:array of integer;
begin
 image1.Picture.Bitmap.Assign(bt);
 w:=image1.Picture.Bitmap.Width;
 h:=image1.Picture.Bitmap.Height;
 rw := (((w * 32) + 31) and not 31) div 8;

 p:=image1.Picture.Bitmap.ScanLine[h-1];
 w:=w+1; h:=h+1; setlength(tab,w*h);

 //passe l'image en niveau de gris et sauve le tout dans tab
 for j:=0 to h-1 do
 for i:=0 to w-1 do
 if (i=w-1) or (j=h-1) then tab[i+w*j]:=0
 else
 begin
  k:=i*4+j*rw;
  // 30% de rouge, 59% de vert, 11% de bleu
  l:=(76*p[k+2]+151*p[k+1]+29*p[k+0]) div 256;
  tab[i+w*j] :=l;
 end;

 // effectue l'algo de Floyd-Steinberg dans tab
 for j:=0 to h-2 do
 for i:=0 to w-2 do
  begin
   k:=i+j*w;
   gc:=tab[k];
   if gc<128 then g:=0 else g:=255;
   gc:=gc-g;
   tab[k]:=g;
   tab[k+1]:=tab[k+1]+gc*7 div 16;
   tab[k-1+w]:=tab[k-1+w]+gc*3 div 16;
   tab[k+0+w]:=tab[k+0+w]+gc*5 div 16;
   tab[k+1+w]:=tab[k+1+w]+gc*1 div 16;
  end;

 // transfert tab dans le bitmap
 for j:=0 to h-2 do
 for i:=0 to w-2 do
  begin
   k:=i*4+j*rw;
   p[k+2]:=tab[i+w*j];
   p[k+1]:=tab[i+w*j];
   p[k+0]:=tab[i+w*j];
  end;
end;
При этом bt: TBitmap - глобальная,
подключен модуль jpeg,
изображение в Image 24 бита bmp формата.

И все отлично работает.

Чтобы остальные фильтры работали, прописываем глобальные контстанты, которые регулируют "глубину".

Думаю ошибка в том, что не учитывали данные при создании формы (в оригинальном исходнике).
Не стыдно чего-то не знать, стыдно не стремиться к знаниям.
ArtInt вне форума Ответить с цитированием
Старый 21.04.2010, 14:33   #26
ArtInt
Форумчанин
 
Аватар для ArtInt
 
Регистрация: 06.03.2009
Сообщений: 583
По умолчанию

Можно дальше "извращаться". Например, создадим функцию
Код:
  public
    { Public declarations }
    function Floyd(MyBitmap: TBitmap): TBitmap;
  end;
на вход необработанный битмап, на выходе обработанный
Код:
function TForm1.Floyd(MyBitmap: TBitmap): TBitmap;
var
 rw,w,h,i,j,k,l:integer;
 gc,g:integer;
 p:pbytearray;
 tab:array of integer;
begin
// image1.Picture.Bitmap.Assign(bt);
 w:=MyBitmap.Width;
 h:=MyBitmap.Height;
 rw := (((w * 32) + 31) and not 31) div 8;

 p:=MyBitmap.ScanLine[h-1];
 w:=w+1; h:=h+1; setlength(tab,w*h);

 //passe l'image en niveau de gris et sauve le tout dans tab
 for j:=0 to h-1 do
 for i:=0 to w-1 do
 if (i=w-1) or (j=h-1) then tab[i+w*j]:=0
 else
 begin
  k:=i*4+j*rw;
  // 30% de rouge, 59% de vert, 11% de bleu
  l:=(76*p[k+2]+151*p[k+1]+29*p[k+0]) div 256;
  tab[i+w*j] :=l;
 end;

 // effectue l'algo de Floyd-Steinberg dans tab
 for j:=0 to h-2 do
 for i:=0 to w-2 do
  begin
   k:=i+j*w;
   gc:=tab[k];
   if gc<128 then g:=0 else g:=255;
   gc:=gc-g;
   tab[k]:=g;
   tab[k+1]:=tab[k+1]+gc*7 div 16;
   tab[k-1+w]:=tab[k-1+w]+gc*3 div 16;
   tab[k+0+w]:=tab[k+0+w]+gc*5 div 16;
   tab[k+1+w]:=tab[k+1+w]+gc*1 div 16;
  end;

 // transfert tab dans le bitmap
 for j:=0 to h-2 do
 for i:=0 to w-2 do
  begin
   k:=i*4+j*rw;
   p[k+2]:=tab[i+w*j];
   p[k+1]:=tab[i+w*j];
   p[k+0]:=tab[i+w*j];
  end;

  Result:=MyBitmap;
end; {Floyd}
Далее делаем кнопку:
Код:
procedure TForm1.BtnFloydClick(Sender: TObject);
begin
 Image1.Parent.DoubleBuffered:=true;
 bt:=tbitmap.Create;
 bt.Assign(image1.Picture.Bitmap);
 bt.PixelFormat:=pf32bit;


 Image1.Picture.Bitmap.Assign(Floyd(bt));

 bt.Free;
end;
Все работает, проверял.

P.S. В целом, важными строчками являются
Image1.Parent.DoubleBuffered:=true;
и
bt.PixelFormat:=pf32bit; - перевод в 32 битный пиксельный формат

так сам алгоритм построен для обработки такого формата, насколько мне стало понятно.
Код:
rw := (((w * 32) + 31) and not 31) div 8;
k:=i*4+j*rw;
Может, кстати можно переписать для 24 битного, если поменять численные значения.

P.S. Думаю, теперь разобрались, что было не учтено (32 битный формат).
Не стыдно чего-то не знать, стыдно не стремиться к знаниям.
ArtInt вне форума Ответить с цитированием
Старый 25.04.2010, 07:36   #27
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
Восклицание

Вот, все что удалось на данный момент сделать это загрузить изображение, которое мне надо и сделать из него черно-белое. Но, есть проблемы:
1. Не работает регулировка (та что в моем исходнике справа)
2. Не удается сделать так, чтобы по нажатию на остальные кнопки действия переносились на мое изображение.
Вот, все это не получается сделать. Какие мысли?
Вложения
Тип файла: zip Прога.zip (857.9 Кб, 11 просмотров)
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 25.04.2010, 13:17   #28
ArtInt
Форумчанин
 
Аватар для ArtInt
 
Регистрация: 06.03.2009
Сообщений: 583
По умолчанию

В трех соснах заблудился?

Исходник подправил, изображение другое поставил, чтобы меньше размер был.
Про ошибки:
- Инициализацию сделал, как отдельную процедуру.
- bt должен быть везде глобальный.

P.S. Кстати bt надо еще освободить, там в исходнике где-нибудь в Form1.Close можно дописать bt.Free;
Вложения
Тип файла: rar CratesMod1.rar (16.1 Кб, 15 просмотров)
Не стыдно чего-то не знать, стыдно не стремиться к знаниям.

Последний раз редактировалось ArtInt; 25.04.2010 в 13:26.
ArtInt вне форума Ответить с цитированием
Старый 25.04.2010, 14:47   #29
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
Восклицание

Цитата:
В трех соснах заблудился?
Аха, наверное
Ну, теперь по крайней мере цветное изображение переводится в черно-белое, но как теперь попробовать посчитать эти самые клетки? По какому принципу?)

Вопрос: А что если просто взять и "вырезать" задний фон с фотографии? То есть убрать его оставив только кружочки. Возможно ли такое сделать? Ведь кружочки практически одинакового цвета. И фон тоже. Значит может быть попытаться сделать какой-то своего рода поиск определенного цвета (!!!), например, цвета фона. И, когда данный цвет будет найден, то "залить" его например белым, тем самым убрав его! А что? По-моему идея, только вот как начать это реализовывать? Возникает снова вопрос: как найти определенный цвет??
Вложения
Тип файла: zip CratesMod1.zip (21.9 Кб, 13 просмотров)
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

Последний раз редактировалось artemavd; 25.04.2010 в 15:35.
artemavd вне форума Ответить с цитированием
Старый 26.04.2010, 13:50   #30
ArtInt
Форумчанин
 
Аватар для ArtInt
 
Регистрация: 06.03.2009
Сообщений: 583
По умолчанию

Вот код к размышлению, "выдран" из одной моей программы:

Код:
procedure TForm1.BtMyBWClick(Sender: TObject);
var
  MyJpeg: TJPEGImage;
  Bmp: TBitmap;
  x, y, color: integer;

begin
  if OpenPictureDialog1.Execute then
  begin

    MyJpeg := TJpegImage.create;
    // MyJpeg.LoadFromFile('turning1.jpeg');
    MYJpeg.LoadFromFile(OpenPictureDialog1.FileName);

  end; //OpenDialog
  Myjpeg.DIBNeeded; {преобразуем в битмап формат}

  Bmp := Tbitmap.Create;

  Bmp.Assign(Myjpeg);

  {все что по цвету меньше черного делаем белым}
  for Y := 0 to Bmp.Height - 1 do // Iterate
    for X := 0 to Bmp.Width - 1 do // Iterate
    begin
      Color := Bmp.Canvas.Pixels[x, y];
      //    Color:=(clRed(Color)+clGreen(Color)+clBlue(Color)) div 3;

      if Color > strtoint(Edit1.Text) then {8 000 000; 8700000}
        Bmp.Canvas.Pixels[x, y] := clWhite;
//      else
 //       Bmp.Canvas.Pixels[x, y] := clBlack;

      {делаем белым края, так как они обычно черные}
      if (y = 0) or (x = 0) or (y = Bmp.Height - 1) or (x = Bmp.Width - 1) then
        Bmp.Canvas.Pixels[x, y] := clWhite;

    end; //for x

  //  showmessage(inttostr(Color));
  image1.Picture.Bitmap.Assign(bmp);
  Bmp.Free;

  showmessage('ok');
end; {BtMyBW}
{
Можно кстати по-другому вводить коды цвета RGB, набери в справке TColor,
потом коды цвета границ можешь посмотреть в Photoshop или другой программе.

}

Как видишь из кода, там сначала загружается jpeg изображение, потом переводим его в битмап, после начинаем построчно (попиксельно) в цикле проходить данный битмап, и там сравнивать цвет. По окончании результат в Image1.
Скажу честно, не совсем понял в какой кодировке он цвет в этом случае распознает (кто понял, расскажите, если не трудно). Необходимый цвет для вычленения выяснял экспериментально, записывал значение Color в мемо и там смотрел, какие цвета необходимо закрасить в черный, а все остальные в белый.
Поэтому, если точно известно будет цвет границ, то можно из забить в массив или множество и потом условие
Код:
if (Color in [KolCvet])=true then Bmp.Canvas.Pixels[x, y] := clBlack else  Bmp.Canvas.Pixels[x, y] := clWhite;
Но сначала все таки изображение надо сбалансировать по цвету, контраст, осветление и так далее. Можно для начала попробать сделать это в фотошопе, потом пробовать переводить в черно-белое. Так как из-за того что изображение не сбалансированное, при переводе в черно-белый режим некоторые области полностью заливаются черным.

Насчет распознавания молекул, может и дурацкая мне мысль пришла, но что если пройтись в цикле по каждому пикселю и считать его центром окружности (так как молекула круглая), определить минимальный радиус и максимальный радиус молекулы. Если точка имеет черный цвет на конце радиуса (сделать для начала в четырех направлениях (далее в восьми), погрешность отклонения 1-2 пикселя например, выяснить экспериментально). Если в 90% направлениях есть одинаковый радиус значит это окружность (молекула).
Вычисляться наверное будет долговато, можно оформить в поток (сделать прогресс бар).
Просто мысли по поводу реализации, сработает или нет, точно сказать не могу, это надо экспериментировать.
Не стыдно чего-то не знать, стыдно не стремиться к знаниям.
ArtInt вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поле слияния в виде ряда заполненных клеток Nash1 Microsoft Office Word 5 17.07.2009 23:07
количество цифр и количество символов до первой гласной буквы 111111 Общие вопросы C/C++ 2 22.12.2008 12:15
Подсчёт непустых клеток mik Microsoft Office Excel 7 27.10.2007 13:40
ComboBox - убийца нервных клеток krem Компоненты Delphi 20 15.06.2007 22:07