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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.04.2010, 16:33   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
Вопрос Количество клеток мембраны

Пишу программу, которая должна сосчитать количество клеток на загруженном изображении. Да да, именно клеток. Суть задачи такова: есть некое изображение(фотография) клеток. Требуется: посчитать количество всех клеток. Это моя курсовая. Тема мне показалась очень интересной и перспективной. У меня есть несколько мыслей. А именно, например: когда изображение загружено, то создается некий "квадратик", который перемещается по изображению и "получает" в свои границы эти кружочки и каждый раз, когда какой то кружок попадает в его границы, то это считается как один кружок и так далее. Вот, примерно такая первая мысль по реализации пришла в голову. Если есть какие-то другие идеи, предложения, похожие проекты,то если не трудно, выложите исходники для ознакомленя. Заранее спасибо за ответы и помощь.
Изображения
Тип файла: jpg 000014.jpg (110.4 Кб, 209 просмотров)
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 13.04.2010, 16:59   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

1.найти кусочек клетки
2. если нашли то добавить счетчик иначе закончить
3. стереть клетку ОДНУ(ту у которой мы нашли кусочек)
4. повторить с п.1.

самая большая проблема как разделить две рядом расположенные клетки( или те которые накладываются).
здесь может помочь
1. ограничение на размер клетки (если они есть) удалять не более чем ...
2. выделение контуров и удаление внутри контура
3. разделение соседей по оттенку.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 13.04.2010, 17:47   #3
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
По умолчанию

Цитата:
3. стереть клетку ОДНУ(ту у которой мы нашли кусочек)
Как это стереть? Прям на изображении чтоли?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 13.04.2010, 18:37   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

стереть на рабочей копии(загруженной в память) изображения
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 13.04.2010, 19:07   #5
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Я думаю, что проще будет общаться с клетками, переведя изображение в BW режим (1), Далее осветляем фон (2) и выделяем края клеток, дабы оставить только окружности (3)
Изображения
Тип файла: jpg 1.jpg (89.1 Кб, 190 просмотров)
Тип файла: jpg 2.jpg (104.7 Кб, 190 просмотров)
Тип файла: jpg 3.jpg (521.5 Кб, 182 просмотров)
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 14.04.2010, 09:18   #6
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
По умолчанию

Цитата:
переведя изображение в BW режим (1)
Что такое BW режим?
А как будет выглядеть код осветления изображения? И по какому принципу выделять края клеток?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 14.04.2010, 09:28   #7
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Black & White (чб)
Осветление - это прибавление к цвету пикселя по n к каждому каналу ($A0A0A0 + $050505).
По принципу анализа соседних клеток - если цвета отличаются на ДельтаИкс, то выделяем край. На фото выделение края по Превитту.
http://ru.wikipedia.org/wiki/%D0%9F%...B8%D1%82%D1%82
Если Превитт не понравится, вот Собел:
http://ru.wikipedia.org/wiki/%D0%9E%...B5%D0%BB%D1%8F
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ

Последний раз редактировалось Alex Cones; 14.04.2010 в 09:32.
Alex Cones вне форума Ответить с цитированием
Старый 14.04.2010, 10:40   #8
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
По умолчанию

Alex Cones, попробую начать делать как Вы предложили. Вот, нарыл код, который цветное изображение переводит в чернобелое по алгоритму Флойда-Стейнберга и переделал его под себя:
Код:
procedure TForm1.Button2Click(Sender: TObject);
// algo de Floyd-Steinberg
var
 rw,w,h,i,j,k,l:integer;
 gc,g:integer;
 p:pbytearray;
 tab:array of integer;
 bt: TBitmap;
begin
 Image2.Picture.Bitmap.Assign(bt);
 w:=Image2.Picture.Bitmap.Width;
 h:=Image2.Picture.Bitmap.Height;
 rw := (((w * 32) + 31) and not 31) div 8;

 p:=Image2.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;
Компилируется и запускается без ошибок. Но когда нажимаю на кнопку, то появляется ошибка: "Cannot assign a TButton to a TBitmap" и показывается строка, которую я выделил в коде. В чем тут ошибка?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 14.04.2010, 10:44   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
показывается строка, которую я выделил в коде.
Опшибаешся.
Ошибка на строке Image2.Picture.Bitmap.Assign(bt) скорее всего.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.04.2010, 10:52   #10
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
По умолчанию

Ну, поставил бряк я на эту строчку
Код:
 Image2.Picture.Bitmap.Assign(bt)
, стрелочка установилась на моем бряке. Ну так а как исправить-то чтобы заработало? При этом изображение в Image2 портится.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Ответ


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