Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.05.2013, 23:03
TeRomani TeRomani вне форума
Прохожий
 
Регистрация: 18.12.2012
Сообщения: 28
Репутация: 10
По умолчанию Алгоритм Magic Wang (выделение пикселей похожих)

Доброго всем времени суток!

Коллеги, знает ли кто нибудь каким образом реализован алгоритм Magic Wang в графических редакторах (фотошоп, корел). интересует сам алгоритм, что там сравнивается и каким образом.

Пробовал переводить картинку в HSB и выделять по брайтнессу но все равно выходит далеко не так как в редакторах, пришел к выводу что скорее всего там сравнивается не пиксель за пикселем в рекурсии как пытался сделать я, а скорее всего какая-то область типа квадратика 3х3 или больше. и возможно какаято средняя яркость там считается.

В общем если кто сталкивался с подобной задачей подскажите как именно реализуется такой алгоритм.

Гугул перегулил весь, нашел много интересного но именно по этой теме ничего
Ответить с цитированием
  #2  
Старый 17.05.2013, 00:17
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от TeRomani
...Гугул перегулил весь, нашел много интересного но...
Тогда вам возможно уже и попадался такой вариант "волшебной палки", он возвращает регион со схожими пикселями.
Код:
type
 TFillItem = class(TObject) // Untested coordinates that will be added to a list.
  Xfill, Yfill : Word;
 end;
function CreateHRGN(Bitmap : TBitmap; X, Y : Word; RGN : HRGN) : HRGN;
var
 FillList : TList; // The untested list of coordinates.

function TColorToRGBTriple(Color : TColor) : TRGBTriple;
 type
  TRGBQuad = packed record
    case integer of
     0 : (Color : TColor);
     1 : (r, g, b, a : byte);
    end;
var
 RGBQuad : TRGBQuad;
begin
 RGBQuad.Color:= Color;
 Result.rgbtRed:= RGBQuad.r;
 Result.rgbtGreen:= RGBQuad.g;
 Result.rgbtBlue:= RGBQuad.b;
end; {TColorToRGBTriple}

function RGBTripleToTColor(RGBTriple : TRGBTriple) : TColor;
begin
 Result:= RGBTriple.rgbtBlue shl 16 + RGBTriple.rgbtGreen shl 8 +
 RGBTriple.rgbtRed;
end; {RGBTripleToTColor}

procedure FillBitmap(Bitmap : TBitmap; X, Y : integer; Depth : Word);
type
 TRGBArray = array[0..0] of TRGBTriple;
 pRGBArray = ^TRGBArray;
var
 pc: pRGBArray;
 RGNTemp : HRGN;
 FillItem : TFillItem;
begin
 {$ifopt R+} {$define RangeCheck} {$endif} {$R-}
  if (X>= 0) and (X < Bitmap.Width) and (Y>= 0) and (Y < Bitmap.Height)         then begin
 pc:= Bitmap.Scanline[Y];
 if (RGBTripleToTColor(pc[X]) <>clBlack) and (RGBTripleToTColor(pc[X])  <>clNavy) then begin
 if (Depth>10000) then begin // Recursive depth exceeded ... so pack up
  FillItem:= TFillItem.Create; // all our pending test coordinates and
  FillItem.Xfill:= X; // leave.
  FillItem.Yfill:= Y;
  FillList.Add(FillItem);
end else begin
  if (RGN = 0) then // No region - must be new ...
   RGN:= CreateRectRgn(X, Y, X+1, Y+1) // so make one ...
   else begin // otherwise combine it with
    RGNTemp:= CreateRectRgn(X, Y, X+1, Y+1); // this new selection.
    CombineRgn(RGN, RGN, RGNTemp, RGN_XOR);
    DeleteObject(RGNTemp); // Must remember to
   get rid of unwanted regions.
  end; {if}
 pc[X]:= TColorToRGBTriple(clNavy); // Leave a marker to say we've been here.
 FillBitmap(Bitmap, X-1, Y, Depth+1); // Left ...
 FillBitmap(Bitmap, X+1, Y, Depth+1); // Right ...
 FillBitmap(Bitmap, X, Y-1, Depth+1); // Up ...
 FillBitmap(Bitmap, X, Y+1, Depth+1); // Down ...
end; {if}
 end; {if}
 end; {if}
{$ifdef RangeCheck} {$R+} {$undef RangeCheck} {$endif}
end; {FillBitmap}

var
 Depth : Word;
begin
 Bitmap.PixelFormat:= pf24bit; // Need 24 bit...
 Depth:= 0; // Not started tree search ... so zero depth.
 FillList:= TList.Create; // Create our fill list.
 FillBitmap(Bitmap, X, Y, Depth); // Go and fill...

  while (FillList.Count>0) do begin // Hmm ... too many recursive levels ...
with TFillItem(FillList[pred(FillList.Count)]) do begin // ... step through all the pending
 X:= Xfill; // coordinates.
 Y:= Yfill;
 Free; // Delete these coordinates, we're about to do them.
end; {with}
 FillList.Delete(pred(FillList.Count)); // Delete this entry from the list too.
 Depth:= 0;
 FillBitmap(Bitmap, X, Y, Depth); // Go and fill again ...
end; {while} // Keep on until the list's empty.
FillList.Free; // Free the list ... we're done.
Result:= RGN; // Return the region.
end;
Ответить с цитированием
  #3  
Старый 17.05.2013, 12:19
TeRomani TeRomani вне форума
Прохожий
 
Регистрация: 18.12.2012
Сообщения: 28
Репутация: 10
По умолчанию

помоему это просто реализация алгоритма перебора областей и т.д. пример рекурсивной функции, это я и сам могу

НО в этом коде нет того о чем я спрашивал, а именно, как сравниваются похожие пиксели, везде где я видел употребляется словосочетание HSB Tolerance т.е. подобные пиксели
Ответить с цитированием
  #4  
Старый 17.05.2013, 13:34
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

Там вроде тупо по цвету(оттенку) сравнение идет в задаваемом процентном соотношении, сегодня на работе попробую накатать примерчик, вечером скину.
Ответить с цитированием
  #5  
Старый 17.05.2013, 16:15
TeRomani TeRomani вне форума
Прохожий
 
Регистрация: 18.12.2012
Сообщения: 28
Репутация: 10
По умолчанию

вот еще прикол ну тут мое понимание вообще кончилось может кто пояснит в чем прикол посмотрите на условие и значение переменных и где курсор находиться т.е. компилятор проигнорил условие или я уже переработался и реально чето не понял
Изображения
Тип файла: jpg pricol.jpg (74.4 Кбайт, 12 просмотров)
Ответить с цитированием
  #6  
Старый 17.05.2013, 16:41
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от TeRomani
вот еще прикол ну тут мое понимание вообще кончилось может кто пояснит в чем прикол посмотрите на условие и значение переменных и где курсор находиться т.е. компилятор проигнорил условие или я уже переработался и реально чето не понял
Ну тут я уже ответил
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
TeRomani (17.05.2013)
  #7  
Старый 17.05.2013, 18:40
TeRomani TeRomani вне форума
Прохожий
 
Регистрация: 18.12.2012
Сообщения: 28
Репутация: 10
По умолчанию

Цитата:
Сообщение от Pilot_Red
Там вроде тупо по цвету(оттенку) сравнение идет в задаваемом процентном соотношении, сегодня на работе попробую накатать примерчик, вечером скину.

Да я так пробовал)) и по всем трем, и отдельно по каждой))) все-таки мне кажется что там не отдельные пиксели сравнивают а группы по 9 или как то еще
Ответить с цитированием
  #8  
Старый 22.05.2013, 14:09
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

Сорри, что задержался, выходные забористые вышли!
Если еще актуально, лови может быть тебе подойдет!
Алгоритм лохматый, неотесанный, т.е. можно оптимизировать в разы. Основная процедура SelectedReg(рекурсия)
З.Ы. выделенная область инвертируется
Вложения
Тип файла: rar Рабочий стол.rar (301.8 Кбайт, 9 просмотров)
Ответить с цитированием
  #9  
Старый 22.05.2013, 14:46
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Pilot_Red
Сорри, что задержался, выходные забористые вышли!
Если еще актуально, лови может быть тебе подойдет!
Алгоритм лохматый, неотесанный, т.е. можно оптимизировать в разы. Основная процедура SelectedReg(рекурсия)
З.Ы. выделенная область инвертируется
Прикольная штука

А Stack Overflow не может возникнуть?
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию

Последний раз редактировалось M.A.D.M.A.N., 22.05.2013 в 14:51.
Ответить с цитированием
  #10  
Старый 22.05.2013, 21:25
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Прикольная штука

А Stack Overflow не может возникнуть?

он меня заколебал Пока в настройках компилятора размер стека не увеличил. Вообще странно, писал прогу дя постраения фракталов, там у меня в процедуре было куева туча локаьных переменных, да и параметры я передовал нифига не через указатели, хоть бы заикнулся. А здесь процедурка небольшая а жрет трындец, даже не знаю в каком моменте .
При среднем изображении вроде нормально работает на больших не проверял

Последний раз редактировалось Pilot_Red, 22.05.2013 в 21:27.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:08.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter