Как стать автором
Обновить
43
0
Алексей Григорьев @alexeygrigorev

Пользователь

Отправить сообщение
А про OnWebinar кто-нибудь может рассказать? Этим можно пользоваться бесплатно? А скачивать видео из архивов? Что-то непонятно.
Ого, очень классно, завидую прям. А в Нижнем такие мероприятия проводятся, кто-нибудь знает?
В любом случае — буду качать видео. Спасибо за хорошую новость.
Одна из лучших статей о БФ за последнее время. Хоть и неделя БФ закончилась в воскресенье.
Честно признаюсь, если бы не знал, что такое 2НФ, то вряд ли бы понял, прочитав статью
Вроде бы неделя уже закончилась
Вот его реализация на java — с более-менее подробными комментариями, готовый к компилированию код:
pastebin.com/WaLgEEzr
Вот реализованный мной несколько лет назад алгоритм заливки (он тут как вспомогательный)
Основное его предназначение — вычисление центра масс всех найденных объектов на изображении. Для обработки я всё изображение переводил в ч/б массив (массив булеанов), а затем выделял в нем объекты. Под цветное изображение труда не будет переделать.

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 с исходником? (Я имею ввиду не исходник вашего перевода, а чисто исходник с картинкой.) Судя по описанию, достаточно рутинная работа — но картинки красивые.
познавательная*
Спасибо, хорошая, позновательная статья — как раз для изучения питона.
А на чем картинки создавались, позвольте поинтересоваться? Красивые получаются.
12 ...
14

Информация

В рейтинге
Не участвует
Откуда
Kraków, Malopolskie, Польша
Дата рождения
Зарегистрирован
Активность