среда, 4 июля 2012 г.

Unsupported Hardware watermark

Вылезло вдруг эдакое чудо - в правом нижнем углу экрана квадратик с сообщением "AMD Unsupported Hardware". Оказалось, дело в дровах для видеокарты, и решилось с помощью скрипта отсюда: Unsupported Hardware watermark

понедельник, 4 июня 2012 г.

Анонс: открытое ПО GeoMed3D для построения 3D модели недр

Выложил часть своих наработок, связанных с восстановлением 3D модели недр по космоснимкам. Софт написан на ANSI C под OC linux (32 и 64 разрядные). Source-пакет и бинарная сборка под 32 бит linux Deian прилагаются. http://mobigroup.ru/debian/pool-squeeze/main/g/geomed3d-bin/ Документацию пока не выкладывал, равно как и примеры снимков. Ежели у кого есть снимки, которые можно опубликовать и по которым получаются интересные результаты - выкладывайте здесь ссылки, с описанием, что на снимке, кому он принадлежит и под какой лицензией публикуется. Скрипт для построения вертикального разреза приведен ниже:
#!/bin/sh
# скрипт построения вертикального разреза
# глубина в метрах = 0.7*R*(разрешение исходного изображения)
# для работы скрипта нужен установленный ImageMagick и пакет geomed3d
set -e

# исходное изображение
IMAGE=sample.tif
# размер исходного изображения, пикселов
WIDTH=3217
HEIGHT=2782
# глубина построения разреза, шагов
R=300

# удалить файлы предыдущего запуска
rm -f v_min.grad.tif v_mode.grad.tif

# преобразуем исходное изображение в RAW массив
convert -depth 8 "$IMAGE" gray:in.raw
# строим маску
geomed3d_mask $WIDTH $HEIGHT 0 0.5 1 0.5 > v_mask
# размер маски в пикселях (каждому пикселу соответствует отдельная строка в файле маски)
LENGTH=$(cat v_mask | wc -l)
# построить вертикальное сечение (фокальная статистика)
cat v_mask | geomed3d $WIDTH 0 $R in.raw v_min.raw v_mode.raw
# определим размерности полученного массива
W=$LENGTH
H=$((R+1))
# посчитать градиент
geomed3d_grad $LENGTH v_min.raw        v_min.grad.raw
geomed3d_grad $LENGTH v_mode.raw       v_mode.grad.raw
# для просмотра
convert -size ${W}x${H} -depth 8 gray:v_min.grad.raw  v_min.grad.tif
convert -size ${W}x${H} -depth 8 gray:v_mode.grad.raw v_mode.grad.tif

# удалить временные файлы
rm -f in.raw v_mask v_min.raw v_mode.raw v_min.grad.raw v_mode.grad.raw

# готово! смотреть файлы v_min.grad.tif и v_mode.grad.tif
Также анонсировал здесь: http://gis-lab.info/forum/viewtopic.php?f=20&t=10754
Для интересующихся на форуме выкладываю "Использование фотополимеризующихся композиций для записи и восстановления распределения интенсивности" (http://zalil.ru/33382501), где я и начинал заниматься вопросами рассеяния на различных неоднородностях. Смотрите 2-ю главу "Спектры рассеяния на собственных неоднородностях ФПК" и главу 3 "Восстановление изображения с транспарантов, записанных на ФПК". Фотополимеризующаяся композиция (ФПК) - двухкомпонентная среда (мономер и полимер, при конверсии мономера образуется полимер), для которой можно и матмодель сделать, и проверить результат в лаборатории. Далее, выкладываю проведенную по гранту компании LG работу "Получение коллимированных пучков после прохождения сферического волнового фронта через фазовую зонную пластинку" (http://zalil.ru/33382544), где изучается и моделируется уже дифракция. Как видим, то, что в геологии называется "малые кольцевые структуры" хорошо изучено и часто встречается. Далее открывайте Фивенского (благо здесь уже и скан выложен, спасибо!). После чего смотрите результаты, полученные специалистами ООО "ГеоКосмоМониторинг". И наконец, можете изучить исходники и запустить анонсированную в топике программу.

Upd. Сборка под виндоус анонсированных утилит: http://zalil.ru/33381973 Для поддержки функций memory mapping использован проект mman-win32.

Upd. Сделал краткое объяснение моего представления о физ. механизме образования кольцевых неоднородностей, раз на форуме так хотят его услышать:

Я полагаю, регистрируемую картинку подземных неоднородностей на поверхности дают значительно более мощные относительно среднего фона сейсмоволны при землетрясениях, нежели чем картинка проявляется как результат накопления изменений от воздействия среднего фона. За несколько десятилетий, которые называет Фивенский минимальным сроком "проявления" малых кольцевых структур, землетрясения амплитудой 8 баллов и выше происходят практически везде (из вики: "За год на Земле происходит примерно: 1 землетрясение с магнитудой 8,0 и выше;10 — с магнитудой 7,0—7,9;100 — с магнитудой 6,0—6,9; 1000 — с магнитудой 5,0—5,9."), что соответствует амплитуде вертикальных колебаний поверхности уже не микроны, а сантиметры, метры и даже десятки метров, причем одна мощная волна с рассеянием на подземных неоднородностях даст интерференционную картину аналогично когерентному источнику (тогда как при среднем сейсмическом фоне когерентности нет). Такой механизм образования кольцевых структур мне представляется намного более вероятным, и дает ответ на вопрос, откуда же берется когерентность сейсмоволн - я вообще не встречал нигде попытки объяснить эту самую когерентность, про которую все упоминают, так как без нее ничего не получается. Итак, землетрясение - это процесс записи на поверхности Земли интерферограммы ее внутреннего строения. Спектры рассеивания (или, что эквивалентно, угловое распределение энергии рассеянной волны) продуцируют образование кольцевых структур на поверхности, причем изотропные неоднородности продуцируют кольца, анизотропные - "полумесяцы", как можно увидеть в моей работе по спектрам рассеивания. Соответственно, картина геологического строения может производиться путем восстановления записанной на поверхности интерферограммы. Технически это реализуется путем поиска кольцевых структур и дальнейшего анализа их характеристик.

пятница, 1 июня 2012 г.

geomed3d-tclshp package for Shapefile creation from Tcl scripts

Понадобилось мне создавать шейпфайлы, попробовал делать это через gdal (типы полей в DBF, похоже, всегда строковые, не подходит, да и не понравилось - нужно создавать XML файл, в котором прописывать имена файлов, и проч. непотребства совершать) и Spatialite (типы полей могут быть и числовые, но все равно не устраивает - сложно и не быстро). Опробовав два вышеназванных пути, сделал свой пакет GeoMed3dSHP для языка Tcl (получается вдвое быстрее, чем делать то же через Spatialite). Пример использования:
rm -f test.* && tclsh8.5
package require GeoMed3dSHP
set id [SHPCreateFiles test]
SHPWritePoint $id 374868.671871 2828378.81973 100.0 777
SHPWritePoint $id 374868.671871 2828378.81973 100.0 888
SHPCloseFiles $id
exit
Ну и заодно расширение GeoMed3dDBF для создания только DBF файлов:
rm -f test.* && tclsh8.5
lappend auto_path .
package require GeoMed3dDBF
set id [DBFCreateFile test]
DBFWrite $id 374868.671871 2828378.81973 100.0 777
DBFWrite $id 374868.671871 2828378.81973 100.0 888
DBFCloseFile $id
exit
Типы полей в DBF фиксированы, ибо мне так надо :) При необходимости поправить тип/количество полей в DBF в исходнике сложностей не вызывает.

вторник, 24 января 2012 г.

Сканер CanoScan LiDE 210 в debian


Взял себе на днях CanoScan LiDE 210 взамен CanoScan LiDE 90, для которого поддержку так и не сделали в линуксе, а танцы с бубном мне надоели. Итак, подключил CanoScan LiDE 210, запустил xsane - все работает. Не настраивал вообще ничего, только установил xsane. Сканер шустрый и достаточно тихий. С поддержкой кнопок (в терминологии разработчиков sane - sensors) все хреново, как обычно, но есть финт ушами:
$ scanimage -d "genesys:`sane-find-scanner|grep CanoScan|cut -d' ' -f 10`" -A|grep '\[hardware\]'|grep "\[yes\]"|wc -l
0
а теперь нажимаем любую кнопку:
$ scanimage -d "genesys:`sane-find-scanner|grep CanoScan|cut -d' ' -f 10`" -A|grep '\[hardware\]'|grep "\[yes\]"|wc -l
1
Одна из кнопок сканера не вызывает никакой реакции, остальные работают (хотя их названия в выводе scanimage -A перепутаны). Так что несложно сделать скрипт для пакетного сканирования, реагирующий на кнопки:
scan.sh
#!/bin/bash

SCANNER=`sane-find-scanner|grep CanoScan|cut -d' ' -f 10`
if [ -z $SCANNER ]
then
    echo "Scanner not found!"
    exit 1
fi
SCANNER="genesys:$SCANNER"

counter=1
while true
do
    BUTTON=`scanimage -d "$SCANNER" -A | grep '\[hardware\]' | grep "\[yes\]" | wc -l`
    if [ $BUTTON == 1 ]
    then
        echo -n "Start scan image $counter ..."
        scanimage -d "$SCANNER" --resolution 75 --mode Color --depth 16 --format png > $counter.png.tmp
        mv $counter.png.tmp $counter.png
        echo " complete"
        counter=$(($counter+1))
    fi
done
Собственно, запускаем вышеуказанный скрипт и жмем любую кнопку на сканере после помещения в него очередного документа.

(C) Alexey Pechnikov aka MBG, mobigroup.ru