Ого, очень классно, завидую прям. А в Нижнем такие мероприятия проводятся, кто-нибудь знает?
В любом случае — буду качать видео. Спасибо за хорошую новость.
Вот реализованный мной несколько лет назад алгоритм заливки (он тут как вспомогательный)
Основное его предназначение — вычисление центра масс всех найденных объектов на изображении. Для обработки я всё изображение переводил в ч/б массив (массив булеанов), а затем выделял в нем объекты. Под цветное изображение труда не будет переделать.
procedure TRgbBmp.CalcMassCentre4(var BoolArr: TBoolArray);
var
// ...
begin
// ... инициализации
// Алгоритм заполнения произвольной области с затравкой
// Преобразован для нахождения центра масс -
// Координаты всех "залитых" точек суммируются и делятся на площадь
for i := 1 to FHeightMinus1 - 1 do
for j := 1 to FWidthMinus1 - 1 do
// Как только натыкаемся на непомеченный пиксель - запускаем алгоритм заливки
if TmpBoolArr[i, j] then
begin
SumX := 0;
SumY := 0;
N := 0;
Top := 0;
// Добавляем в стек текущие координаты
Stack[Top] := ToCoord(i, j);
// пока стек не пуст
while Top <> -1 do
begin
// извлекаем из стека координаты
Curr := Stack[Top];
Dec(Top);
// помечаем текущую точку
if TmpBoolArr[Curr.y, Curr.x] then
begin
TmpBoolArr[Curr.y, Curr.x] := False;
CoordAdd(Curr.y, Curr.x, SumY, SumX, N);
end;
// заливаем все пиксели слева
xl := Curr.x - 1;
while TmpBoolArr[Curr.y, xl] do
begin
TmpBoolArr[Curr.y, xl] := False;
CoordAdd(Curr.y, xl, SumY, SumX, N);
Dec(xl);
end;
// заливаем все пиксели справа
xr := Curr.x + 1;
while TmpBoolArr[Curr.y, xr] do
begin
TmpBoolArr[Curr.y, xr] := False;
CoordAdd(Curr.y, xr, SumY, SumX, N);
Inc(xr);
end;
Dec(xr);
// идем вниз и вверх
k := 1;
repeat
y := Curr.y + k;
x := xl + 1;
// добавляем еще одну строчку для следующей итерации
while x < xr do
begin
x0 := x;
while (TmpBoolArr[y, x]) and (x < xr) do
Inc(x);
if x0 <> x then
begin
Inc(Top);
Stack[Top] := ToCoord(y, x);
end;
while (not TmpBoolArr[y, x]) and (x < xr) do
Inc(x);
end;
// для верхней строки
k := k - 2;
until
k < -1;
end;
// Если объект маленький (3 и меньше пикселей), то его не учитываем
if N > 3 then
begin
MassCentre.Y := Trunc(SumY / N);
MassCentre.X := Trunc(SumX / N);
MasscentreArr[MassCentre.y, MassCentre.x] := True;
end;
end;
// ...
end;
Прошу прощения за делфи. Ну суть понятна, я думаю, комментарии есть. Что-то непонятно — обращайтесь, распишу
Один из алгоритмов заливки — «заливка с затравкой». Возьмет любой объект (хоть бублик), а не только прямоугольный. А границы мы узнаем, когда зальем — алгоритм изначально под это не приспособлен, но можно подправить. В итоге получается тоже самое, что и метод марок, только эффективние и без рекурсии.
Для подсчета количества объектов можно еще использовать алгоритм заливки (почти как метод марок, только нерекурсивный). Наткнулись на непомеченный пиксель — увеличиваем счетчик и заливаем всю область, что объект занимает, фоновым цветом.
Здорово, остальные главы из книги тоже будут опубликованы? Буду следить с интересом. Спасибо за хороший материал, вспомнил, как сам на олимпиадах участвовал.
Спасибо, латех знаю, но вот эти пакеты никогда не использовал. А можно .tex с исходником? (Я имею ввиду не исходник вашего перевода, а чисто исходник с картинкой.) Судя по описанию, достаточно рутинная работа — но картинки красивые.
В любом случае — буду качать видео. Спасибо за хорошую новость.
pastebin.com/WaLgEEzr
Основное его предназначение — вычисление центра масс всех найденных объектов на изображении. Для обработки я всё изображение переводил в ч/б массив (массив булеанов), а затем выделял в нем объекты. Под цветное изображение труда не будет переделать.
Прошу прощения за делфи. Ну суть понятна, я думаю, комментарии есть. Что-то непонятно — обращайтесь, распишу
А на чем картинки создавались, позвольте поинтересоваться? Красивые получаются.