Обработка изображений. Часть 2.

Продолжаем обсуждать цифровую обработку изображений.

Двумерная корреляция.

Пусть имеется картинка 132х132, 24 бита (журнал 1972 года не нашёл :-(


Нужно найти в ней фрагмент:

Расширим размер фрагмента до размера 132х132, и обнулим неиспользуемую часть изображения:


Теперь можно сделать двумерную взаимную корреляцию этих картинок. Как и в одномерном случае просто умножаем преобразование Фурье первой функции на комплексно сопряженное преобразование Фурье второй функции и делаем обратное преобразование Фурье:


Замечание: двумерные массивы коэффициентов Фурье надо умножать поэлементно! (А не как матрицы).
Для того, чтобы не вычислять 2D-Фурье на каждом цвете, картинки были переведены в градации серого по формуле: Y= 0.0721*B+ 0.7154*G+0.2125*R. Кроме того из каждой точки изображения надо вычесть среднее значение яркости по картинке.
Построим значение модуля функции взаимной корреляции:


Максимум модуля функции взаимной корреляции даст координаты Хо,Yo.
Построим в Surfer-8 все три картинки: исходные и модуль функции взаимной корреляции:


Видно, что координаты Хо,Yo определяют вектор сдвига фрагмента относительно нижнего левого угла основной картинки. Таким образом вектор сдвига имеет координаты {0;0} {Xo,Yo}, где {Xo,Yo} — координата максимума модуля функции взаимной 2D корреляции.

Приложение.


call FFTF_2D(H1,W1,U,UFFT) !В действительной части массива U (яркость-средняя по картинке)
call FFTF_2D(H1,W1,U2,UFFT2)       !FTF фрагмента
	do k=1,H1
	do  i=1,W1	
	UFFT3(i,k)=DCONJG(UFFT2(i,k))*UFFT(i,k)    !DCONJG функция комплексного сопряжения
	end do
	end do
call FFTB_2D(H1,W1,UFFT3,U3)    !Теперь в U3 - 2D функция взаимной корреляции
  • +6
  • 05 апреля 2016, 18:36
  • Santik

Комментарии (76)

RSS свернуть / развернуть
Только 1 формула :-)
0
журнал 1972 года не нашёл :-(


Да не проблема купить, у меня у знакомого висит такой в рамке на работе висит (он алгоритмами обработки изображений занимается) :)

Спасибо за статью. Хотя многие, в прошлой статье, были недовольны примерами кода на Фортране — мне наоборот не хватает в этой статье примера кода. Хоть на Фортране, хоть на псевдокоде… Мне код читать легче чем формулы.
0
Добавил в Приложение.
+1
Спасибо! Tще такой вопрос: Вы используете (как и прошлой статье) для перевода в градации серого формулу
Y= 0.0721*B+ 0.7154*G+0.2125*R
настолько я знаю, эти коэффициенты подобраны исходя из особенностей восприятия цветов человеческим глазом. Мы искажаем начальные данные для того, чтобы Ч/Б картинка нами воспринималась естественней.

Но для алгоритмов обработки разве не более правильно делать все коэффициенты одинаковыми (Y= (B + G + R) / 3)?
0
Не знаю :-) В данном примере мне кажется вообще можно одним любым цветом обойтись! Но в более общей задаче — я захочу определить своё лицо на групповом портрете, а эталон будет с более поздней фотографии. Цветопередача заведомо совпадать не будет. И свет будет не стой стороны падать… Я такими вопросами к сожалению не занимался. Где-то читал, что для идентификации по картинке всё здорово упрощают и оставляют только реперные точки (расстояние между глазами и т.п.)
0
В данном случае да, это, наверное, неважно. Но если, например, нам нужно выделить на изображении кластер точек по яркости, то используя данную формулу мы исказим реальные данные.

Данная формула (если я правильно понимаю) сделана в угоду человеческому восприятию

нам кажется, что зеленый круг «ярче» чем синий. Поэтому мы делаем разные коэффициенты в формуле. А на самом деле – их «яркость» одинакова.
0
нам нужно выделить на изображении кластер точек по яркости
1. Мы можем этот кластер точно по такой же формуле преобразовать.
2. Коррелируют функции с обнулённой постоянной составляющей. Так что с яркостью напрямую никто не работает.
0
У меня вот сейчас другая проблема. Я решил получить цветную функцию автокорреляции и не могу сообразить как это сделать быстро. Т.е. мне значения от 0 до 1 надо в RGB превратить, примерно так:
0
Если Вам именно такая палитра нужна – задать ее таблично. Если палитра не принципиальна, то можно как-то так.



По сути можно взять 3 синуса смещенных на 60 градусов, каждый из которых формирует свой канал, должна неплохая палитра получиться.
+1
при трех синусах не получится получить чистый цвет ни в одном месте. Так что думаю, это несколько хуже, чем предложенный вами на картинке
0
можно попробовать из двух значений синусов отнимать одно третье, самое меньшее из трех, а потом разницу умножать на √3
0
Проще оказалось шкалу взять из Surfer-8 (файл *.clr)

ColorMap 1 1
    0.000000   0   0   0
   14.285714  77  77  77
   35.960592 153   0 204
   60.591133   0   0 102
   80.295567  51 102 153
   85.714285   0 204 255
   90.640394   0 255   0
   93.596057 255 255   0
   97.536945 255 102   0
  100.000000 255   0   0

Тем более её можно по желанию быстро поменять.
А потом я подумал: А на фига всё это надо? и просто на исходной картинке в максимуме функции взаимной корреляции просто крестик поставил. Красный :-)
0
тогда уж лучше вот так Y=(B+R)/4 + G/2
0
Все уже придумано до нас — YUV, YCbCr… У Автора как раз применено нечто такое.
0
Y= 0.0721*B+ 0.7154*G+0.2125*R 

Наткнулся на интересную статью, которая проливает свет на эту формулу (возможно кому-то интересно)
+2
Для ответа на вопрос «А как правильно?» нужно задать вопрос «А для каких целей?»
0
Для ответа на вопрос «А как правильно?» ...
А я думаю никак неправильно. Все эти формулы в неявном виде используют свойства люминофора (матрицы), недаром же PAL-Secam vs NTFC неоднократно в этих статьях упоминается. А задача изначально — элементарная: Можно ли человека с помощью 3-х светофильтров RGB превратить в дальтоника на 100%? Нет! Можно лишь «слегка» приблизиться к этому эффекту — для чего разнообразные формулы и существуют.
0
Все верно. Вариации были и будут в зависимости от целей такой обработки.
0
мне интересно, существуют ли в природе такие эксперименты, когда изображение разделяют на три одинаковой яркости, потом каждое пропускают через светофильтры, а потом снова их проецируют в одно изображение. Сравнивать предлагают с оригинальным изображением, которое потеряло в яркости 2/3. При этом показывать различные цветные картинки. Неужели нашли те самые фильтры что человек бы сомневался в неодинаковости? Особенно касается красных и фиолетовых цветов. Но это одно. Здесь мы можем уловить только неодинаковости в видимом спектре. Другое — что эти фильтры пропускают невидимый спектр, который удачно отпечатывается на матрице.
Я вот замечаю, что на камеру, например, можно заснять ИК диод, это говорит о том, что ИК лучи подмешиваются в картинку и являются искажениями цветности.
0
про устройства отображения — это вообще другая песня. Я говорю именно верность восприятия цвета цифровым фотоаппаратом.
0
По этой теме стоит почитать Илью Борга и Алекса Тутубалина
0
 Неужели нашли те самые фильтры что человек бы сомневался в неодинаковости? 
Ну, цвет воспринимается субъективно (вспомните известный спор «какого цвета это платье?» и другие оптические иллюзии). Если в контексте матриц фотоаппарата — естественно они «видят» иначе чем мы, просто потом результат аппаратно/программно подгоняется под привычную для нас картинку.
0
«Осьминоги, как многие знают, способны менять цвет своей слизистой туши, чтобы наилучшим образом сливаться с фоном морского дна. Это очень разумно со стороны осьминога, но налицо научная загадка: дело в том, что осьминог не способен различать цвета. Причем не только глазом: в геноме этой твари вообще нет генов зрительных рецепторов, чувствительных к разным длинам волны света. Спрашивается, как ему удается подстраиваться под цвет фона, если у него в принципе нет способа этот цвет определить?
За проблему взялись два американца, отец и сын, физик и зоолог, Крис и Алекс Стаббсы. Вот в чем их идея: даже не имея рецепторов цветного зрения, осьминог все равно может различать цвета по разнице в коэффициенте преломления. Грубо говоря, когда осьминог фокусирует взгляд на красном, синий выглядит для него чуть-чуть расплывчато. При наличии навыка, таким способом вполне можно различать цвета на расстоянии менее метра от себя. Более того, странная форма зрачка каракатицы (нечто вроде буквы W), кажется, не имеет никакого другого смысла, кроме как усиливать этот эффект.» Сноб.
0
P.S. Мне лично такое объяснение кажется через чур «навороченным» :-) Если уж осьминог умеет менять цвет своей туши, почему бы ему не менять цвет глаз (стекловидного тела или что там у него)? «Быстродействие» такого цветного зрения будет не очень высоким (но для этого существуют механизмы запоминания и обработки). Зато уверен, что «разрешающая способность» в определении цвета — колоссальная. Возможно, человек по сравнению с осьминогом — просто дальтоник :-)
0
Вообще то это ещё в Сивухине, называется кривая видности
0
Но, да я по торопился. Статья немного не о том, и просто отличная.
0
Очень интересная тема, но я не понял как это работает. Фрагмент ведь нужно масштабировать и перемещать, что бы найти его на картинке? А мы тут взяли сходу и нашли вектор сдвига. Как? Кто-то может понятно объяснить физику процесса?
0
Для примера фрагмент был вырезан из исходной картинки. Поэтому ни вращать не масштабировать его не пришлось. В более общей задаче без многократного поворота, масштабирования и взаимной корреляции после каждого шага действительно не обойтись.
0
Да, я ошибся: масштабы совпадают. Но мы же расширили фрагмент до размера исходной картинки, и он оказался уже не в том месте, где был раньше. Вот этот момент меня интересует. То есть мы можем не перемещать его по всей площади в поиске совпадений, а просто сходу найти вектор сдвига?
0
То есть мы можем не перемещать его по всей площади в поиске совпадений, а просто сходу найти вектор сдвига?
В этом и преимущество использования преобразования Фурье. В одномерном случае тоже ведь можно определить взаимную корреляцию через сдвиг-суммирование. Но это долго.
+1
В этом и преимущество использования преобразования Фурье.
Тогда это очень круто! Постараюсь поэкспериментировать на реальных примерах, потом напишу здесь.
0
В свое время тоже пытался вникнуть во все это — диплом был (хоть и косвенно) связан с ПФ. Но знаний явно не было недостаточно. Эх, кто бы мне тогда вбил в голову весь этот матан и ЦОС! :(
С источниками информации и вовсе был напряг — тырнетаф тогда можно сказать и не было (один общий диал-ап канал на весь институт), на институтской же фидо-подписке тоже ничего толком не наловил. Благо декан дал личную книгу для ознакомления (как выяснилось, и без того редкую, единственную на весь город) за авторством Винограда, в которой был описан алгоритм Кули-Тьюки и, собственно, Винограда. Примеры там как раз на Фортране были, пришлось «портировать» на object pascal под Delphi. Но получилось у меня все как-то черезчур медленно и через упож… ((( Сейчас «весь интернет завален» алгоритмами и готовыми библиотеками, и считают его (Фурье) чуть не на утюгах и холодильниках (AVR, PIC вполне шустро справляются). А то, о чем у меня было только в планах написать в своей работе, сейчас уже внедрено и успешно работает: поиск дубликатов картинок на диске, каталогизаторы «песенок» по жанрам, гугле-«поиск_картинок» и т.д.
0
каталогизаторы «песенок» по жанрам
А вот с этим проблема. Я до сих пор не нашел ни одной программы, которая реально помогла бы мне навести порядок в фонотеке. Вы чем пользуетесь для этих целей?
0
Ничем не пользуюсь и даже не пробовал. ((( Знаю просто, что такие сервисы онлайн существуют. А также поиск исполнителя и названия по фрагменту.
0
Поиск и отслеживание изображения по шаблону
habrahabr.ru/post/116824/
0
По поводу количества операций не знаете ли, насколько использование FFT лучше лобового вычисления корреляции? Есть ли теоретический предел количества операций для вычисления корреляционной матрицы? Насколько к нему близок метод использующий FFT? Есть ли смысл изобретать велосипед вычисляющий корреляцию сначала для уменьшенных в 2,4,… раз изображений?
0
По поводу количества операций не знаете ли, насколько использование FFT лучше лобового вычисления корреляции?
Лобового, это через интеграл? Гораздо быстрее. Зависит от размера вектора, но ориентировочно с Фурье корреляция быстрее на порядок.
Есть ли теоретический предел количества операций для вычисления корреляционной матрицы?
Легче рассчитать для одномерного случая. Если коррелируем 2 вектора размерностью М и N, то через интегрирование надо М*N операций вида aX+b
Последнего вопроса я не понял. Уменьшать/увеличивать изображение можно с шагом 1 пиксель.
Фурье преобразование эталона (фрагмента) делается при этом только один раз. Дальше работа только с получившейся матрицей комплексного спектра. На каждом шаге надо делать элементарное преобразование этой матрицы, поэлементное умножение на спектр исходной картинки и ОБПФ.
0
Легче рассчитать для одномерного случая. Если коррелируем 2 вектора размерностью М и N, то через интегрирование надо М*N операций вида aX+b
А через FFT?

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

На самом деле может оказаться сложнее, результатом будет не одна область 4x4 пиксела а несколько и больших размеров. Но все же она будет меньше всего изображения. Логика следующая, «исходные изображения коррелируют» -> «уменьшенные изображения коррелируют».

Этим можно получить выигрыш по количеству операций, или метод через FFT делает все тоже самое неявно?
0
Уменьшить изображения, скажем в 4 раза, провести процедуру поиска координат фрагмента. Потом вернуться к полноразмерному изображению и повторить используя полученные знания о координатах с точностью 4 пиксела.
Если я правильно понял — тебе ближе алгоритм корреляции через интегрирование? :-)
Через FFT делается все тоже самое за один проход.
Основной принцип для функции f(t) — свертка/корреляция во временной области соответствует умножению векторов в частотной.
А свертка/корреляция во временной области — это на каждом шаге надо брать интеграл от двух функций, потом сдвигать сдвигать одну из функций, снова брать интеграл и т.д.
0
Ладно, нашел сам :)

Получается, N*N против N*log(N).

Если я правильно понял — тебе ближе алгоритм корреляции через интегрирование? :-)

Да FFT как-то не смог пока нигде применить. Прямой метод можно считать по мере поступления данных, а для FFT надо сразу все.
0
Да, интегральный метод корреляции — это метод реального времени. С FFT о реальном времени можно забыть. Часто любители FFT говорят о квазиреальном времени. На некоторых задачах это прокатывает.
0
Фигня это ваш фурье :)
0
Алгоритмом сайта мгновенно была «раскрыта тема сисек» — в спектре явно обнаружены пички от сосков 5-ти/6-ти сочных телок, всего 10/12 штук.
0
Хорошо если бы админстрация сайта консультировалась с автором перед тем, как из личного блога статьи перекидывать в коллективные. И еще в непонятный раздел. Тем более — это уже не первый случай… :-( Уйду в СамоБАН на месяц!!!
0
Фурье и Сиськи — созданы друг для друга!
0
гон
0
Да ладно?! А я повёлся…
0
А вот реальная реклама, когда 3МП кулпиксы вышли.
Отожгли французы.

+1
Из реальных мне вот эта больше всего понравилась.
0
Тут уже на грани пошлости
0
А надо в окна смотреть, а не на девок :-)
+1
0
Очень ко времени статья.

Но может все же лучше вместо фортрана использовать MATLAB ?

Поскольку цели у статьи я так понимаю образовательные, а в Матлабе
полный набор штатного инструментария для оттачивания именно теории,
а не мучений с кошерными библиотеками, и тем более работы с изображениями.
+1
Фортран Теплый, ламповый! Это все-таки классика! :)
А вообще для «разобраться» лучше схематическое описание (блок схема + картинки) — так гораздо нагляднее (теплее, ламповее), чем набор этих Ваших бездушных операторов в Матлабе.
Блин, вот прям снова сам заинтересовался всем этим… )))
0
MATLAB — это математика абстрагированная от предмета, её понимаешь, либо нет.
и результаты всегда можно и проверить и продолжить, т.к. есть фундантальность.

Фортран — числовая мясорубка/дробилка, и как в этом случае с
непонятными hand-made библиотеками,
и результатом, требующимb проверки.

так, если попонтоваться в тусе своей «научностью»,
побросаться словами типа все остальные — любители,
и навести туман, то может и прокатить…

Что касается "ламповости" — это про блондинку на экзамене,
которая свой «теплотой» и другими своими «весомыми» достоинствами
может «заработать» хороший балл на экзамене, но к изучаемому предмету
это — отношения точно не имеет )

Если не МАТЛАБ, то любой другой: Scilab, Octave, FreeMat и тд и тп
Сам выбор же Матлаба удобен т.к:
а) относительно доступен
б) море открытой документации и описаний
в) результат интерпретируем для DSP и FPGA железа.
0
Историческая справка:
MATLAB как язык программирования был разработан Кливом Моулером (англ. Cleve Moler) в конце 1970-х годов когда он был деканом факультета компьютерных наук в Университете Нью-Мексико. Целью разработки служила задача дать студентам факультета возможность использования программных библиотек Linpack и EISPACK без необходимости изучения Фортрана.
То есть МАТЛАБ изначально был создан для тупых студентов, не осиливших изучение ФОРТРАНа.
Достоинства МатЛаба, приведённые valio несколько надуманы, т.к. программирование, к примеру, на Си имеет ещё больше преимуществ :-)
Так что МатЛаб может и хорош для начального уровня, надо только успеть вовремя с него соскочить и пересесть на более распространённый Си. Кто этого не сделает — навсегда останется рабом МАТЛАБа, со всеми вытекающими последствиями (Фортранофобия, и пр.)
-1


То есть МАТЛАБ изначально был создан для тупых студентов, не осиливших изучение ФОРТРАНа

За ради д’Артаньянства, как это принято здесь, расскажу еще одну киндервудную историю из детства: В 10-м классе откопал у отца такую книжку и «выучил» по ней FORTRAN IV, помню как меня тогда жутко раздуло и расперло: Я стал ПРОГРАММИСТОМ(терминов кодер и говнокодер тогда еще не было) — постиг тайное учение, стал «избранным» :DDD После этого, на основе сих фундаментальных знаний, освоил уже намного более «крутой» язык — BASIC.

Смотря с сегодняшних позиций, это все кажется смешным, т.к. любой язык щас надо осваивать за 1 день или ночь, это вместе со стандартной библиотекой функций, встроенных в язык. Т.к. на 2-й день уже надо во всю говнокодировать.

FORTRAN, получается, надо осваивать за 1-2 часа :DDD
-1
FORTRAN, получается, надо осваивать за 1-2 часа :DDD
Ну да, где-то так.:-) У меня тоже такая книга есть! Ценна не Фортраном, а разделам, посвящённым численным методам.
Вывод: человек прочитавший эту книгу никогда не станет жертвой МАТЛАБА!
0
Так что МатЛаб может и хорош для начального уровня, надо только успеть вовремя с него соскочить и пересесть на более распространённый Си.
Меня мучает один вопрос — насколько Си подходит для числодробилки. Моих потуги в Си пока ограничиваются цельночисленной арифметикой, с типом float на практике сталкиваться не приходилось. А вот сыну уже пришлось. Я его загнал изучать онлайн-курс CS50, начали они с Си. В третьем задании появились float и у меня случился разрыв шаблона. Оказывается, простая программка
#include <stdio.h>
#include <math.h>

int main(void)
{
    float f = 0.01;
    if (f == 0.01)
    {
        printf("Norm\n");
        printf("%.50f\n", f);
    } else
    {
        printf("Ups..\n");
        printf("%.50f\n", f);
    }
    return 0;
}

выдает
Ups…
0.00999999977648258209228515625000000000000000000000
Я понимаю, что я в Си — нубяра, но начинать изучение программирования с изучения костылей языка Си типа «бла-бла-бла, переменную нужно округлить», ИМХО, моветон. Причем код-то куда более чем конкретный. Оказывается одна сотая не равна одной сотой. Вот и есть сомнения относительно пригодности Си в качестве числодробилки.
ЗЫ. В Паскале в этом плане все нормально, 0.01 == 0.01.
0
Сходи на wasm.ru Большинство вопросов отпадёт само-собой. А 1/100 в бинаре — это непереводимое число — на всех языках…
+1
Паскаль красиво рисует 1Е-2 и безо всяких хвостов.
0
Настройки округления исправь) Santik прав — формат чисел с плавающей точкой идентичен во всех языках, и 0.01 ровно он хранить не может.
0
Фортран же
program hello
   real f
   f = 0.01
   if (f == 0.01) then
     print *, "Norm"
     print *, f
   else
     print *, "Ups..."
   end if
end program Hello

выдает
Norm
9.99999978E-03
0
Это классика.

Что до неравенства — 0.01f != 0.01d, только и всего. Если исправить на «if (f == 0.01f)» — то работает. Но вообще, плавучку не следует сравнивать на равенство.
0
Что значит не следует? А если надо? Чего такого криминального в моем примере?.. И как он должен был отработать, если это не всемогущий Си, а какой либо абстрактный язык? Теперь я понимаю откуда взялось выражение «и густо граблями усеян тернистый наш путь» :))). Причем начиная с основ. Классика с классическими костылями.
Поймите меня правильно, мне, как программеру, просто хочется дословного исполнения моих инструкций. А тут — то неявное приведениие типов, то оптимизатор шалит, то еще что. Стремно все это.
0
Что значит не следует?
То и значит. Как ты только что убедился, 0.01 != 0.01. Или, например, этот цикл будет вечным:
for(float f = 1; f != 0; f -= 0.1);

А если надо?
Изменять условие. Если надо ловить именно равенство — то оно ловится как if(fabs(f — 0.01) < epsilon), epsilon задается в зависимости от размерности сравниваемых чисел, иначе лучше переписать на сравнение Больше/меньше:
for(float f = 1; f > 0; f -= 0.1);

Стремно все это.
Се ля ви. Веселье дискретной математики и плавающей точки — общее для всех языков программирования.
0
P.S. Цикл
for(float f = 0; f < 1e15; f += 1);

тоже будет вечным. Это уже другой прикол плавающей точки, когда a + b == a при b != 0 и a >> b.
0
То чувство, когда ощущаешь себя безграмотным уебаном :))))) Говорила мне мама: «Учи, сынок, математику».
А если серьезно, то в первый раз столкнулся с этим, причем чисто из академического интереса. Сталкиваться с подобным на практике не приходилось.
Если надо ловить именно равенство — то оно ловится как if(fabs(f — 0.01) < epsilon)
ИМХО, проще (round(f * 100) == 1), т.е. приводим к нужному порядку, перегоняем в целые, а дальше уже без сюрпризов.
0
Может и проще, но скорее всего медленнее.
+1
Но может все же лучше вместо фортрана использовать MATLAB ?
Может я отстал от жизни — но для меня МатЛаб — это набор «чёрных ящиков» и как переписать нужный «ящик» допустим на STM32 — это большая проблема. Так что с МатЛабом может иногда и удобно (хотя сам не пользовался) но портировать программу в «другое измерение» — проблематично.
Фортран на Си переписать — легко. Останется один «чёрный ящик»-БПФ, но это для каждого микроконтроллера — своя реализация.
Рекомендую посмотреть.
Там ещё ссылка есть, как на TMS320 за один раз сделать БПФ двух вещественных векторов :)
0
Вот-вот. Особенно если с ЦОС не знаком, а тут еще и среду изучить нужно.
0
А вы случайно не в курсе, матлаб может типа си код генерить для стенд алоун приложений, соотв можно на нем написать и на си посмотреть…? Спасибо очень полезная статья, вот прям как раз для начинающих в дсп, и фортран нисколько не напрягает, смысл не затемняется. Пишите обязательно еще.
+1
Ну вообще как правило происходит так, сначала используешь, что-нибудь что бы понять смысл, матлаб маткад — что кто, а потом,
когда понел, си и мк. Тут конкретно, фортран совершенно как мне кажется, и не мешает и не специфичен.
+1
Справедливо! :-)
Лучше быть «языконезависимым» :-)
В студенческие годы своему научному руководителю программы переводил с Алгола на Фортран. Переписал 1:1 И вот как-то: «Тебя вызывают в ВЦ!»… Как мне там выписали пиздюлей- распечатка получилась толщиной сантиметров 10! Это при страшном дефиците бумаги! Я — к преподавателю. А он мне и говорит — «А ну нас в МГУ автоматом ограничение стоит на АЦПУ — распечатка не более 1 метра в длину! Что же ты параметры не поменял?» :-)
0
Я однажды скопипастил начало программы и не посмотрел, что там в задании — целый день бегал за распечаткой — нету говорят, только какой-то идиот целый день что-то выводит на перфоленту… занимает машинное время, и тратит сволочь бумагу, ))) сам я побоялся забирать подослал руководство)))
+2
Ну вот, почти один к одному история… :-)
Ну ещё одна — на БЭСМ-6 ввели мультизадачный режим (для отладки). Ограничение — 10 минут. Так мы умудрялись за рабочий день 3-х часовые задачи прогонять…
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.