Загрузить архив: | |
Файл: vdv-1469.zip (2903kb [zip], Скачиваний: 31) скачать |
Аннотация
Дипломный проект посвящен разработке системы передачи данных из ультразвуковой медицинской диагностической установки, а также получением диагностически адекватного изображения для дальнейшей диагностики, анализа и хранения. Обработка полученных изображений базируется на программном комплексе CTsoft.
Система предназначена для работы в отделениях ультразвуковой диагностики и не требует от пользователя дополнительных знаний по программированию и техническому обслуживанию персональных компьютеров. Она предоставляет пользователю удобный экранный интерфейс для получения и обработки высококачественных изображений, переданных из ультразвуковой медицинской диагностической установки, кроме того, она предусматривает возможность дальнейшей передачи полученных данных по компьютерной сети.
Система прошла опытную эксплуатацию в институте хирургии им А. В. Вишневского в рамках проекта «телемедицина». Отчетные материалы к дипломному проекту включают пояснительную записку, 3 приложения и графический материал.
Содержание
TOC o "1-3" Введение PAGEREF _Toc454809610 h 4
Обзор литературы PAGEREF _Toc454809611 h 7
Разработки телемедицины в мире PAGEREF _Toc454809612 h 7
Необходимость “телемедицины” в России PAGEREF _Toc454809613 h 9
Задачи здравоохранения, решаемые с применением телемедицинских технологий PAGEREF _Toc454809614 h 12
Формы применения телемедицинских технологий для решения задач здравоохранения PAGEREF _Toc454809615 h 15
Приложения телемедицины в клинической практике PAGEREF _Toc454809616 h 16
Требования к передаче телемединформации PAGEREF _Toc454809617 h 17
Анализ возможности передачи медицинских данных существующими программно – аппаратными средствами PAGEREF _Toc454809618 h 20
Подключение ультразвуковой медицинской диагностической установки ALOKA SSD - 650 PAGEREF _Toc454809619 h 23
Ультразвуковая диагностическая установка ALOKA SSD – 650 PAGEREF _Toc454809620 h 25
Общие характеристики устройства PAGEREF _Toc454809621 h 25
Принцип построения выходного сигнала PAGEREF _Toc454809622 h 27
Устройство согласования УЗИ с персональным компьютером первичной обработки данных PAGEREF _Toc454809623 h 29
Основные характеристики HI*DEF Plus LF PAGEREF _Toc454809624 h 31
Формат файла получаемого изображения PAGEREF _Toc454809625 h 32
Персональный компьютер первичной обработки PAGEREF _Toc454809626 h 35
Локальная вычислительная сеть PAGEREF _Toc454809627 h 38
Особенности построения компьютерной сети для института хирургии им. А. В. Вишневского PAGEREF _Toc454809628 h 38
Программное обеспечение и сетевое оборудование PAGEREF _Toc454809629 h 43
Персональный компьютер консультанта PAGEREF _Toc454809630 h 45
Использование фильтров PAGEREF _Toc454809631 h 46
Фильтр сглаживания PAGEREF _Toc454809632 h 48
Фильтр усредненного сглаживания PAGEREF _Toc454809633 h 49
Фильтр подчеркивания контуров PAGEREF _Toc454809634 h 50
Фильтр обработки полутонов PAGEREF _Toc454809635 h 51
Последовательное использование фильтров PAGEREF _Toc454809636 h 52
Заключение PAGEREF _Toc454809637 h 54
Выводы и результаты: PAGEREF _Toc454809638 h 55
Список литературы PAGEREF _Toc454809639 h 56
Приложение 1 PAGEREF _Toc454809640 h 58
Формат информационного поля файла изображения PAGEREF _Toc454809641 h 58
Приложение 2 PAGEREF _Toc454809642 h 63
Модуль формирования фильтров изображений (С++) PAGEREF _Toc454809643 h 63
Приложение 3 PAGEREF _Toc454809644 h 95
Описание программы обработки изображений Ctsoft PAGEREF _Toc454809645 h 95
Несмотря на сложность экономической ситуации, в стране быстро нарастает парк современной медицинской аппаратуры: ультразвуковые аппараты, компьютерные томографы, биохимические анализаторы и т.д. Однако, в силу неполного использования современных медицинских знаний, новые методики внедряются на местах крайне неэффективно. Как показывает опыт, уровень диагностики и лечения в центральных клиниках (а они сосредоточены главным образом в Москве) значительно превосходит уровень практического здравоохранения в стране, даже при том, что разница в уровне оснащения не велика. При этом в медицине объем знаний удваивается в 1,5 - 2 раза быстрее по сравнению с другими разделами науки. Таким образом, стратегически важной задачей становится организация принципиально нового взаимодействия работников практического здравоохранения с центральными научно-диагностическими учреждениями, так чтобы практическое здравоохранение в регионах могло бы оказывать высококвалифицированную помощь населению, используя имеющееся оборудование и интеллектуальный потенциал лучших клиник страны.
Экономическая ситуация в стране изменилась таким образом, что диагностическая помощь населению регионов со стороны центральных клиник становится практически недоступной, при том, что ресурсы ведущих медицинских центров вполне позволяют оказывать эту помощь. Затраты на приезд в Москву становятся сравнимыми, а подчас и превосходят саму стоимость диагностики и лечения. Как показывает статистика широкопрофильного медицинского центра (Института хирургии им. А.В. Вишневского РАМН) до 1995 года за диагностической помощью обращалось порядка 10-12 тыс. пациентов в год из различных регионов страны, сейчас это количество упало до 1 тыс., при этом Институт в год проводит обследования до 70 тыс. пациентов (москвичи) и в состоянии довести это число до 120-150 тыс.
Имеющиеся и активно развивающиеся в стране современные средства связи (спутниковая, оптоволоконная, радиорелейная) позволят объединить региональные и центральные лечебные учреждения в единую сеть и таким образом обеспечить “доставку интеллектуального потенциала лучших клиник страны в те места, где в нем экстренно нуждаются”.
Очень большие перспективы в этом плане сулит “телемедицина” - сочетание современных научных методов диагностики и лечения заболеваний с ускоренной обработкой и анализом клинико-физиологической и медико-социальной информации на базе электронно-вычислительной техники и средств связи в режиме теледоступа.
Выполнение перечисленных выше задач невозможно без технической базы, которая должна быть реализована в каждом медицинском учреждении, входящим в проект «телемедицина». Эта техническая база должна включать в себя парк персональных компьютеров, объединенных в единую сеть с централизованной базой данных, подключением к медицинским диагностическим установкам и иметь выход на внешние линии связи.
Вопросы рассматриваемые в рамках нашего дипломного проекта включают в себя решение следующих задач:
Ø
Ø
Ø
Ø
В дипломном проекте рассмотрен вопрос подключения ультразвукового диагностического аппарата к сети и решение обеспечения качественной передачи данных по сети. С возможностью вывода на печать с использованием печатающих устройств общего назначения. А также анализ полученных данных.
Первой страной, поставившей телемедицину на практические рельсы стала Норвегия, где имеется большое количество труднодоступных для традиционной медицинской помощь мест. Второй проект был осуществлен во Франции для моряков гражданского и военного флотов. А сегодня уже трудно назвать западно — европейскую и американскую страну, где бы не развивались телемедицинские проекты, причем особый размах нарастание сеансов «телемедицины» получило в США.[8]
Получают развитие и международные сети медицинских телекоммуникаций, направленных на разные цели: система “Satellife” для распространения медицинских знаний в развивающихся странах и подготовки кадров, “Planet Heres” — предложенная ВОЗ система глобальных научных телекоммуникаций, международной научной экспертизы и координации научных программ, другие системы и сети.
Толчком к развитию телемедицины стало и то, что быстрый прогресс современных методов исследования привел реально к социально неприятному следствию: отставанию уровня диагностики в учреждениях практического здравоохранения в регионах сколь угодно развитой страны от центральных исследовательских и клинических медицинских центров. И по мере бурного развития медицинской науки этот разрыв не сокращается, а увеличивается. Поэтому стратегически важной задачей во многих странах стала организация принципиально нового взаимодействия работников практического здравоохранения с центральными научно—диагностическими учреждениями, направленного на обеспечение эффективной, высококвалифицированной и эшелонированной медико—санитарной помощи.[5]
Развитие телемедицины в России необходимо по ряду причин и, более чем в любой другой развитой стране, должно опираться на учет многолетних традиций эшелонированной медико–санитарной помощи, больших расстояний, трудностей оснащения всех медицинских учреждений современной диагностической и другой медицинской техникой.
1. Разрыв между уровнем диагностики в сети практического здравоохранения и в ведущих медицинских центрах России больше, чем в Германии, Франции или США. Десять лет назад это было связано с большой разницей в уровне оснащения, сегодня – с системным кризисом здравоохранения, резким сокращением финансирования, буквальным «отрывом» периферии от центра.
2. Социально–экономические изменения в стране сделали диагностическую и консультативную помощь населению регионов со стороны центральных клиник практически недоступной, притом что ресурсы ведущих медицинских центров вполне позволяют оказывать эту помощь. Затраты на приезд в Москву становятся сравнимыми, а подчас и превосходят саму стоимость диагностики и лечения. Социальное напряжение в регионах и их претензии к центру растут, способствуя и росту центробежных тенденций.
3. В случае, если заболевание попадает в разряд бюджетной или страховой медицины и обходится больному бесплатно, пациент обычно находится в региональной клинике 10–15 дней и в результате диагностики устанавливается, что ему могут помочь только в центре. Он направляется в центр, госпитализируется, и процесс диагностики повторяется в течение тех же 10 – 15 дней. Это неоправданное расходование ресурсов может быть предотвращено за счет дистанционного консилиума при унификации диагностических процедур на базе современной техники и полноценной передачи диагностической информации.
4. Между тем страна связывалась воедино разными способами, в т.ч. и эшелонированной системой медицинской помощи как в годы мира. так и войны. Это было основой военно–медицинской доктрины периода ВОВ, специализированной помощи в послевоенные годы. Эта психология воспринята народом. Сегодня эта доктрина разрушена, управленческая вертикаль разрушена. Но разрушена и методологическая вертикаль медицинской помощи, разрушено единство научного сообщества.[7]
Телемедицина позволяет компенсировать значительную часть потерь, но больше того, она компенсирует это не на прежнем, а на качественно новом уровне телекоммуникаций и неизмеримо больших возможностей быстрого получения , обработки, передачи и анализа больших массивов информации, что делает качественно новым и уровень диагностики болезней, изменяет связи центра и периферии без простого патронажа со стороны центра (в отношении науки).
Это скачок в новую информационную эпоху, причем вполне вероятно, что в России телемедицина даст даже больший эффект, чем за рубежом, именно в силу наших традиций и менталитета. При этом могут быть использованы традиционные преимущества системы здравоохранения, при которой звенья первичной медико–санитарной помощи (ПМСП) выдвигаются как можно ближе к населению, туда, где люди живут и работают, а специализированная и высококвалифицированная помощь оказывается в тех городах, где для организации такой помощи имеются финансовые и техническое возможности и где численность населения обеспечивает достаточное количество сложных клинических случаев заболеваний.
Это будет не простая компенсация прошлых функций, а перевод их на качественно новый технический и методологический уровень (равный переходу от писем и курьеров к современному телефону, телевидению и пр.).
Реализация проекта “Телемедицина” позволит повысить уровень медико–санитарной помощи населению, обеспечить ускоренный рост научно–практического потенциала медицинских учреждений регионов.[17]
Возможности использования телемедицины разнообразны и раскрываются по мере накопления опыта, они, несомненно, могут оказать значительное воздействие на решение всех функций системы здравоохранения: на развитие и координацию науки, профилактику заболеваний, экстренную и плановую помощь при заболеваниях, подготовку и усовершенствование кадров, маневрирование материально–техническими ресурсами, управление системой и повышение эффективности ее функционирования как в чрезвычайных ситуациях, так и при решении типовых задач в плановом порядке.[18]
В самом общем виде можно сказать, что здравоохранение нуждается в обработке больших массивов информации и телекоммуникациях для:
ØМониторинга и оценки состояния и динамики здоровья населения, в т.ч. наиболее угрожаемых групп и отдельных людей, а также факторов внешней природной и социальной Среды, влияющих на здоровье населения;
ØМониторинга состояния системы здравоохранения, ее резервов и готовности к решению текущих и экстренных проблем;
ØОбеспечения эффективной первичной медико—санитарной помощи (ПМСП) для всех (в любое время, в удаленных и труднодоступных местах)
ØОбеспечения высоквалифицированной немедленной медико—санитарной помощи (МСП) в экстренных ситуациях (повсеместно).
ØОбеспечения плановой методологической поддержки региональным и местным органам и учреждениям здравоохранения со стороны центральных (федеральных и других) научно—исследовательских, клинических и организационных центров в решении сложных проблем диагностики, лечения и профилактики заболеваний.
ØПодготовки и усовершенствования медицинских кадров.[13]
|
|||||||||||||||||
|
|||||||||||||||||
|
ØТелеконференции (научные и научно—практические, методологические и др.)
ØТелеконсилиумы (двух— и многосторонние)
ØКонсультации и организационная помощь при экстренных и чрезвычайных ситуациях (бедствия, аварии, травмы, эпидвспышки и др.)
ØДистанционный мониторинг больных (ЭКГ и пр.)
ØАвтоматизированные истории болезни (что особенно важно в страховой медицине). При необходимости может осуществляться передача содержащейся в них информации (при переезде пациента в другой город, при заочных консультациях и пр.), включая передачу неискаженных изображений (ЭКГ, рентгенограммы, УЗИ, лабораторные данные, др.)
ØТеледоступ в научные Базы данных в центральных учреждениях России, стран СНГ и в зарубежных научных центрах.
ØВзаимодействие с Международными сетями и системами телемедицины и телекоммуникаций (ВОЗ, НИЗ, др.). [12]
· Телеконференции и консультации · Документооборот · Страховая медицина · Базы данных |
· Лабораторные исследования · Гистология · Эндоскопия |
··· Электрофизические методы |
· Трехмерная визуализация · Планирование операций |
· Рентгенология · Сосудистая хирургия · Ультразвуковые исследования |
· Компьютерная томография · Магнитно – резонансная томография |
Для решения большинства задач телемедицины необходим режим телеконференции, когда врачи в отдаленном медицинском учреждении и в центральном институте видят друг друга и пациента, могут разговаривать между собой. Однако этого недостаточно, поскольку основную информацию при сложных диагностических случаях врач получает в виде изображений внутренних органов или биопсий. Это — микроскопические, рентгеновские, ультразвуковые, радиоизотопные исследования и их более сложные и аналоги, как компьютерная томография, динамическая ангиография.
Поэтому системы телемедицины (СТМ) должны быть готовы к передаче (без потери качества) следующих видов информации: изображения, получаемые с диагностической аппаратуры, аналоговые сигналы, таблицы закодированной информации и/или свободный текст.[16]
Необходимы единые стандарты для объединения разнородных форматов изображений и создания единого цифрового набора для его дальнейшей пересылки. Существующие в Германии "Sienet", в США "PAКS" и другие еще не удовлетворительны по "интеллектуальной" наполненности , поэтому аналогичные подходы развиваются в России (в МГУ, ИКИ и др.) на уровне, заметно превосходящем упомянутые коммерческие системы.
Требования к аппаратуре для передачи и воспроизведения изображений высоки. При воспроизведении компьютерно—томографических, рентгеновских и ультразвуковых изображений необходимы не менее 256 градаций "серого" цвета. Высокой должна быть и скорость передачи изображений. Поэтому во избежание быстрого морального старения системы необходимо закладывать скорость передачи порядка 2,048 мБит/с.
Существенную часть информации о больном составляют аналоговые сигналы (ЭКГ, ЭЭГ, реограммы и др.), которые практически повсеместно эти кривые оцифровываются до введения в компьютер. Частотный диапазон всех физиологических сигналов не превышает 1 кГц, обычно у одного пациента регистрируется несколько (от 2 до 5) аналоговых кривых. Здесь будет требоваться разработка протоколов обмена информацией и стандартов на форматы передачи данных.
Таблицы закодированной информации не будут составлять большого объема и не потребуют скоростей выше, чем при передачи изображений. Основные трудозатраты потребуются на формализацию медицинских данных и унификацию протоколов обмена информацией. Иначе будут неизбежными разночтения (а в результате — повторение диагностики) при переходе пациента из одного лечебного учреждения в другое.
Передача свободных текстов не предъявляет особых требований к системе передачи информации, но избежать передачи свободных текстов не удастся, т.к. не вся медицинская информация может быть формализована и закодирована.[15]
Для эффективной диагностики заболеваний (особенно хирургических) на одного пациента требуется получение от 3 до 20 изображений разного характера. Так, например, для диагностики опухолей печени и поджелудочной железы требуются компьютерно—томографическое, ультразвуковое, ангиографическое исследования одновременно. Для диагностики сердечных и сосудистых заболеваний необходимы рентгеновские, магниторезонансные, ангиографические исследования.
При организации передачи данных от медицинского диагностического оборудования возникает ряд технических проблем, связанных с высокими требованиямипредъявляемыми к качеству передаваемой информации. Эти проблемы можно разделить на три основные группы:
1. Проблема получения диагностически адекватного изображения для дальнейшей диагностики, анализа и хранения.
2. Проблема сопряжения диагностического оборудования с системами передачи информации.
3. Проблема передачи полученной информации к «удаленным» пользователям.
Первая проблема связана в первую очередь с психологией восприятия специалистами – врачами результатов получаемых от медицинских диагностических установок, т.е. они чаще всего, не подготовлены к работе с альтернативными вариантами предоставления медицинской, такими как, например, изображение на мониторе персонального компьютера. В связи с этим информация, с которой предполагается работать на персональных компьютерах, должна быть предоставлена в «привычном» для специалистов виде. Кроме того, программа обработки информации, должна быть простой в использовании и интуитивно понятной, что позволит сократить время адаптации и обеспечить быструю возможность перехода к работе с новыми методами предоставления медицинских данных.
Вторая проблема связана с тем, что не существует единого стандарта формата предоставления и хранения медицинских данных. Фирмы – разработчики медицинского оборудования основываются на собственных стандартах, которые закрыты, зачастую несовместимы с аналогичными системами других фирм, и могут изменяться в последующих разработках и модификациях уже существующего оборудования. Попытки стандартизирования форматов хранения и отображения медицинских данных привели к появлению нескольких стандартов, наиболее известным из которых является DICOM3, но которые всеобщего распространения не получили. Исходя из всего выше сказанного, можно заключить, что каждая медицинская диагностическая установка требует индивидуального подхода для обеспечения возможности передачи информации.
Также существует ряд проблем возникающих при попытках обеспечения высокого качества передаваемой медицинской информации, связанных с тем, что современные программно – аппаратные средства не специализированы для передачи данных подобного рода. Это накладывает определенные требования к подбору оборудования для передачи информации из медицинской диагностической аппаратуры на персональные ЭВМ. Специализированных (стандартных) программных средств, предназначенных для обработки медицинской информации (изображений) на персональных ЭВМ на данный момент практически не существует. Использование программ общего назначения, для работы с медицинскими данными, практически невозможно. Это связано с тем, что требуется высокий уровень специальной подготовки специалистов – врачей, и требования, предъявляемые к персональным ЭВМ, для установки программ такого класса, неоправданно высоки, что практически невозможно из-за неоправданно высоких материальных и временных затрат.
Третья проблема связана с ограничениями, накладываемыми на передаваемую информацию, современными средствами связи. Медицинские данные (изображения, звук, видео) невозможно передавать в «реальном времени» по современным каналам связи, с тем качеством, которое требуется для удовлетворительной работы специалиста. Объемы информации требуют разработки специальных алгоритмов сжатия данных и выработки новых методик передачи информации.
Предлагаемые методы решения вышеперечисленных проблем описаны в настоящем дипломном проекте на базе подключения для передачи данных ультразвуковой диагностической установки ALOKA SSD – 650 к персональному компьютеру с последующей передачей данных по компьютерной сети.
В связи с тем, что для осуществления удаленных консультаций необходимо качественная передача данных от медицинских установок к специалистам, к оборудованию захвата, передачи и отображения информации предъявляются определенные требования, которые будут рассмотрены ниже. Общая схема передачи изображения от ультразвуковой диагностической установки к врачу – консультанту представлена на рис 1.
рис. SEQ рис. * ARABIC 1 Общая схема передачи изображения от УЗИ к врачу - консультанту.
Исходя из схемы, можно выделить основные рабочие блоки:
1.
2.
3.
4.
5.
Основными предпосылками для создания данной схемы послужило то, что захват изображения с медицинских установок (в данном дипломе – ультразвуковая диагностическая установка (в дальнейшем УЗИ)), осуществляется через frame grabber HI*DEF Plus LF фирмы IMAGRAPH. Который установлен в компьютере первичного пользователя подсоединен к видеовыходу УЗИ. Первичный пользователь, осуществляющий управление УЗИ, обеспечивает захват изображения с УЗИ и передачу его на персональный компьютер. Далее с персонального компьютера первичного пользователя осуществляется передача изображения по сети до конечного пользователя. В случае необходимости, через сеть может быть организована телеконференция между первичным и конечным пользователями. Предусматривается также передача изображения в базу данных локальной сети первичного пользователя с последующей дальнейшей пересылкой в базу данных сети конечного пользователя, если осуществляется консультация специалистов в различных медицинских учреждениях. Или в общую базу данных локальной сети одного медицинского учреждения, в том случае, когда первичный и конечный пользователь работают в рамках одного медицинского учреждения.
Далее будут рассмотрены отдельные блоки данной схемы.
В данном дипломном проекте передача изображения осуществлялась с ультразвуковой диагностической установки ALOKA SSD – 650, имеющей следующие характеристики:
Общие сведения: |
|
Метод сканирования: |
Ø Электронное линейное сканирование; Ø Электронное сканирование с выпуклым сектором; Ø Механическое секторное сканирование. |
Режим отображения: |
Ø Режим В (возможно формирование 1, 2, 3 или 4 изображений); Ø Режим В одновременно с режимом М (режим В/М) Ø Режим М. Ø Доплеровский режим. |
Регулировка чувствительности: |
|
Усиление (GAIN): |
Макс. 90 дБ, регулируется непрерывно |
Временная компенсация чувствительности (STC): |
11 – точечные скользящие регуляторы. |
Контраст: |
7 переключаемых степеней, независимых для режимов В и М. |
Градации серого: |
64 уровня. |
Емкость памяти изображения: |
512 х 512 х 6 бит. |
Обработка изображения: |
|
АРУ (AGC): |
Режимы В и М, непрерывная регулировка. |
(FTC): |
Вкл./Выкл. для режима М. |
Усиление края (Edge Enhance): |
3 – шаговое переключение. |
Последующая обработка (Post – Processing) |
5 видов выбираемых кривых |
Направление изображения: |
Возможно изменение в поперечном и продольном направлениях (только режим В) |
Знаковое отображение: |
С использованием всей буквенно – цифровой клавиатуры. |
Режимы автоматического отображения: |
Дата и время, данные зонда (основная частота), установка усиления, диапазон отображения, фокальные области, данные измерения и расчета и пр., сегмент шкалы серого, метки шкалы. |
Другие режимы отображения: |
Метка тела (16 картин), направление пункции, курсор режима М. |
Функции измерения: |
Расстояние, площадь, окружность, объем, скорость, временной интервал, размеры. |
Функции расчета: |
Анализ левожелудочковой функции, акушерские расчеты (возраст плода, оценка веса плода), доплеровский анализ, отношение, процентный стеноз, гистограмма. |
Просмотровый монитор: |
9 дюймов по диагонали. |
Питание: |
115/120/220/240 B±10%; 50/60 Гц, 420 ВА. |
Вес: |
Приблизительно 180 кг. |
Требования к безопасности: |
Соответствуют IEC 601 – 1, класс 1, тип В. |
Принцип работы устройства построен на доплеровском эффекте. Считывающий элемент содержит пьезоэлементы (матрицу элементов), которые генерируют сигнал с частотой 2 – 7,5 МГц (стандартный – 3,5 МГц). Отраженный сигналпоказывает поверхность отражения (стенки тканей и сосудов). За счет того, что скорость звука различается в разных средах, наблюдаемый результат показывает эквивалент скорости прохождения в данной среде. С этим же связаны и получаемые на изображении полутона. Не смотря на то, что УЗИ видит только «стенки», оно работает только в сплошной среде. Небольшие полости огибаются, более обширные не видны. Отраженный сигнал принимается линейкой датчиков, которые и формируют сигнал структур на пути прохождения сигнала.
Датчик формирует электрический сигнал. Все современные УЗИ – устройства снабжены цифровой памятью. Матрица датчика содержит ~300 элементов. Учитывая частоту развертки и количество принимаемых сигналов мы получаем сигнал, сравнимый по качеству с телевизионным. Более высокое качество практически не достижимо за счет дребезга длины волны.
Полученный сигнал разворачивается построчно и пишется в цифровую матрицу. Обычно используются несколько матриц – основная и несколько дублирующих. Далее сигнал преобразуется в ЦАП, и в результате на выходе мы наблюдаем телевизионный сигнал на мониторе устройства. Видеосигнал также поступает на коммутационную панель. На коммутационной панели обычно присутствуют несколько выходов видео информации, такие как:
Ø CR170.
Ø RGB + Y.
В данной установке мы имеемразъем стандартного видео, и разъем видео VTR, а также выход для многоформатной камеры. Сигнал стандартного видео подается на frame grabber. Обычно желательно использовать систему 2 канальной передачи данных. 1-й канал используется для передачи обзорного видео сигнала. 2-й для захвата качественной картинки, которая позволит производить какие – либо измерения с полученным результатом и делать какие – либо выводы о состоянии обследуемого пациента.
Возможность 2 канальной передачи данных осуществляется несколькими способами:
1. BNC тройником. (Наихудший вариант из-за потери качества)
2. frame grabber’ов, медленным, но высококачественным, для получения изображений хорошего качества, и быстрым, использующимся для получения обзорного видеосигнала.
3. frame grabber’а.
Описание одного из возможных frame grabber’ов представлено ниже.
Для согласования персонального компьютера с УЗИ наиболее часто используются устройства захвата изображения – frame grabber’ы. Для получения качественных изображений и уменьшения потерь сигнала при передачи, к данным устройствам предъявляется ряд требований:
ØВозможность захвата стандартного видео сигнала: черно – белого или RGB сигналов, или захват сигналов «укороченных» форматов;
ØСтандартная синхронизация;
ØВозможность подстройки яркости и контрастности.
Одним из возможных вариантов, является frame grabber, описанный ниже.
Устройство согласования персонального компьютера с УЗИ представляет собой frame grabber HI*DEF Plus LF фирмы IMAGRAPH. Он осуществляет захват видеоизображения со стандартного видеовыхода УЗИ. Оцифрование полученного сигнала и преобразование в стандартный цифровой видео сигнал формата MPEG3 или сохранения кадра в виде картинки, форматов BMP, JPEG, TIF, PCX или, если захват картинки осуществляет программа диагностики, то в специализированном формате.
HI*DEF Plus LF фиксирует изображения из любого аналогового источника видеосигнала с высокой точностью и качеством, предоставляет диагностически - качественные изображения для программы коррекции изображения. Некоторые из этих программ включают медицинское отображение типа Teleradiology и PACS, а также сбора данных из компьютерных рабочих станций с высоким разрешением. Самое высокое качество изображения гарантируют режимы HI*DEF: ±0.5 ns pixel jitter, 50 dB – отношение сигнала к шуму, минимальная нелинейность, и авто - стабилизация температуры.
Bus |
ISA |
|
Pixel Rate |
Up to 30 MHz |
|
Horizontal Frequency |
Up to 25 kHz |
|
Inputs |
Up to 4 |
|
Memory |
2 MB |
|
Pixel Jitter |
±0.5 ns |
|
vBits per Pixel |
8 bits |
|
External Trigger |
Yes |
|
Software Platforms |
Windows 95 |
Изображения, переданные в персональный компьютер, сохраняются в определенном специализированном формате. Этот формат подразумевает сохранение в файле изображения дополнительной информации о пациенте, исследовании, физических параметрах изображения и т. п.. Структурная схема данного формата представлена на рис. 2.
рис. SEQ рис. * ARABIC 2 Формат файла изображения.
Два килобайта в данном файле выделяются под информационное поле. В этом поле содержится:
ØИдентификация пациента;
ØРежимы, в которых было получено изображение;
ØРазмер матрицы изображения Nx, Ny;
ØДата исследования;
ØРазрешение изображения (бит/пиксель);
ØИндивидуальный номер изображения;
ØСпециализированная информация.
(Полная информация о содержании информационного поля представлена в приложении 1).
Далее следует матрица значений, содержащая в себе само изображение в специализированном формате.
Имя файла изображения, тоже имеет специализированный формат, показанный на рис.3.
рис. SEQ рис. * ARABIC 3 Формат заголовка файла изображения.
В имени файла, первый символ ( iили p) указывает на метод сохранения файла. ( p – с сжатием, i – без сжатия ). Последующие 7 символов являются уникальным номером пациента или исследования (в зависимости от того, где применяется данная программа). В расширении файла, первый символ указывает на номер исследования, последующие две указывают на номер среза (измерения).
Основные требования, предъявляемые к персональным компьютерам, осуществляемым первичную обработку данных, с дальнейшей их пересылкой по сети можно разделить на 3 группы:
1.
2.
3.
В компьютере должна быть установлена система, обеспечивающая возможность организации телеконференции с удаленным пользователем в реальном времени. Обеспечена возможность подключения печатающего устройства и устройства архивации данных. Очень высокие требования выдвигаются к визуализации изображения, полученного с компьютерного рентгеновского томографа. Разрешение картинки должно быть не менее 1280 х 1024, и цветностью в 16 тыс. цветов (256 градаций серого). Для обеспечения возможности быстрого отображения, видеокарта должна содержать не менее 8 Мбайт памяти. Монитор должен поддерживать данное разрешение и обеспечивать частоту развертки не менее 75 гц. Размер зерна не более 0.26 dpi, и иметь размердиагонали не менее 15 дюймов. Необходимость обеспечения быстрой обработки данных должно быть обеспечено за счет высокопроизводительной системы на базе микропроцессора Pentium II, с тактовой частотой не менее 500 МГц, наличие 128 и более Мбайт памяти. Для временного хранения информации в персональном компьютере должен быть установлен жесткий диск размером не менее 3.2 Гбайта, поддерживающий стандарт Ultra SCSI2. Для обеспечения надежности передачи и сохранности информации к персональному компьютеру должен быть подключен источник бесперебойного питания. Для высокоскоростной передачи данных по сети, в персональном компьютере должна быть установлена сетевая карта со скоростью передачи не менее 10 Мбит/сек. Для обеспечения телеконференции в компьютере должен быть установлен frame grabber с поддержкой формата сжатия видео сигнала MJPEG и встроенным звуком. Для обеспечения возможности архивации данных в нештатных ситуациях в ПК должно быть предусмотрено подключение ZIP драйвера, для сохранения информации на магнитном ленточном носителе. Исходя из всего вышесказанного, приблизительная конфигурация ПК первичной обработки информации представлена в таблице 1.
Для обеспечения работы ПК на нем устанавливается операционная система WindowsNT Workstation. А так же программное обеспечение управления видеоконференциями (Microsoft NetMeteeng или подобная).А также специализированна независимая сервисно – диагностическая консоль для управления и обработки поступающей медицинской информации.
Таблица SEQ Таблица * ARABIC 1 Комплектация компьютера первичного пользователя.
Основнаякомплектация: |
|
Корпус |
ATX 80List (InWin A500) |
Processor |
Pentium II 400 |
Matherboard |
ASUS P2B - D |
Ram |
256 Mb |
HDD first |
SCSI WDE 4550 – 0025 |
HDD second |
SCSI Wde 18300 – AV0038 |
SCSI controller |
ADAPTEC AHA – 8945 |
VideoCard |
I740 |
Network Card |
Fast EthernLink XL PCI TX – 3C9005B – TX |
Monitor |
ViewSonic “GA655” |
Mouse |
Стандартная мышь PS/2 |
Видеоконференции: |
|
Плата |
miroVideo DC30 plus |
Камера |
MUSTEK VidCam |
Дополнительное оборудование: |
|
Frame Grabber |
IMAGRAPH HI*DEF Plus LF |
Локальная вычислительная сеть представляет собой высокоскоростное соединение различных устройств, таких как сервера, рабочие станции и периферийные устройства (принтеры, модемы и т.п.), с общей средой передачи. Что позволяет распределять информацию и ресурсы ЛВС между пользователями.
Выбор топологии и типа ЛВС, а так же сетевых стандартов зависит от задач предъявляемых к ЛВС института хирургии.
Локальная сеть института предназначена для:
ØОбеспечения общего доступа к базам данных и другой медицинской информации;
ØПередача и обработка видеоинформации;
ØОбеспечение аудиовизуальноговзаимодействия сотрудников института в реальном времени. с помощью системы видеоконференций;
ØПредоставление доступа к ресурсам Интернет;
ØПредоставление услуг электронной почты.
Отличительной особенностью данной сети является необходимость передачи видеоинформации и взаимодействие сотрудников с помощью видеоконференций. Данные приложения предъявляют жесткие требования к пропускной способностии скорости передачи, создаваязначительную нагрузку на локальную сеть.
Изображение в аналоговом видео состоит из 625 для PAL/SECAM (525 для NTSC) строк и состоит из 2 полей по 312,5 (262,5). За 1 секунду передаются 25 (30) кадров или 50 (60) полей. Полоса, занимаемая видеосигналом, достигает 6 МГц.
В цифровом ТВ принято разбиение одного ТВ кадра на пиксели, что наиболее удобно для дальнейшей цифровой обработки. Каждый ТВ кадр разбивается на 768 точек по горизонтали и 576 точек по вертикали для сигналов PAL/SECAM (640 на 480 для NTSC) при стандартном для ТВ соотношении ширины к высоте изображения равным 4:3. Таким образом, получается два полукадра (поля) с разрешением 384Х288 (320Х240 для NTSC) при частоте 50(60) полей или 25(30) кадров в секунду. Для передачи цвета используется принцип сложения основных цветов: красного(R), синего(B) и зеленого(G) цветов. Цветной ТВ сигнал состоит из яркостной (Y) и двух цветоразностных (R-Y и B-Y) составляющих. Для этого используя специальные схемы суммирования из трех составляющих (Y, R-Y и B-Y) восстанавливают исходные составляющие цвета красный (R), синий (B) и зеленый (G) цвета, которые подаются на соответствующие электронные пушки кинескопа.
Для полного восприятия информации о яркости и цвете необходимо каждую точку изображения передавать как минимум 256 уровнями или 8 битным кодированием. Каждая точка цветного видеоизображения должна кодироваться 24 разрядным словом (8 бит Х 3 составляющие) или по компьютерной терминологии 24 бит/пиксель (24bpp). Таким образом, перемножив 24х768х576х25 получаем цифровой поток в 265420800 бит/сек или около 265 Мбит/сек для сигналов PAL/SECAM (221 Мбит/сек NTSC).
Практически кодирование ТВ сигнала происходит несколько иначе, учитывая, что для передачи ТВ изображения используется формат Y, R-Y, B-Y, то по сигналу Y производится полное кодирование (8 бит по 768х576 pics), а по сигналам R-Y и B-Y кодируется либо половина (8 бит по 384х288 pics), либо четверть (8 бит по 192х144 pics) для каждого из сигналов R-Y и B-Y. Для простоты используется запись в виде дроби 4:2:2 (иногда 8:4:4) или 4:1:1 (8:2:2). Следует иметь в виду, что данная дробная запись говорит о количественном соотношении кодируемых точек. Разрядность кодирования каждой точки всегда равна 8, иногда и больше. Перемножив полученные данные, получаем цифровой поток до 177 Мбит/сек для разрешения 4:2:2 и около 111 Мбит/сек для 4:1:1 (Все данные приведены для разрешенияPAL/SECAM 768х576х25 кадр/сек).
Для ограничения цифрового потока видеоданных используют алгоритмы сжатия(компрессии). В основном используется два вида очень схожих между собой метода компрессии. Это метод M-JPEC, основанный на графическом формате JPEG, и MPEG (в разных вариациях). Оба метода основаны на дискретно-косинусном преобразовании (DCT) изображения разбитого на блоки. Разница этих методов заключается в исключении избыточной информации из исходного видеоизображения. Если M-JPEG использует только внутрикадровую избыточность (так называемую пространственную), то формат MPEG дополнительно использует и межкадровую избыточность (временную). Сжатие характеризуется коэффициентом компрессии - качественным соотношением между исходным и полученным кадром исходя из необходимости сохранения качества исходного изображения и ограничения цифрового потока видеоданных. На практике применяются коэффициенты от 1:1 (без сжатия) до 20:1 (сжатие исходного кадра в 20 раз). Это соответствует качеству ТВ сигнала от эталона (1:1) до стандарта VHS (20:1).
С учетом сжатия видеосигнала, формату видеозаписи VHS(стандарт PAL, оцифровка 768х576, 384х576 или 384х288, 8 бит 4:2:2) соответствует цифровой поток до 24 Мбит/сек.
Формату видеозаписи SVHS или DV/DVCAM (Стандарт PAL, оцифровка 768х576 8 бит 4:2:2 для SVHS и 4:1:1 или 4:2:0 для DV/DVCAM/DVCPRO) соответствует цифровой поток от 24 Мбит/сек.
Система видеоконференций с разрешением 640х480х25(30) кадров/сек дает цифровой поток 128-512 кбит/с (0,12 – 0,5 Мбит/сек). Рекомендуется для проведения видеоконференций уровня предприятия использовать полосу пропускания 384 кбит/с (0,4 Мбит/сек).
Соответственно, общий цифровой поток ~ 25 Мбит/сек.
Локальная вычислительная сеть способна обеспечить высокую пропускную способность, а следовательно, высокое качество изображения и звука. Однако традиционные ЛВС представляют собой сети с разделяемой средой передачи, т.е. когда одно из устройств передает данные в сеть, все остальные должны ждать окончания передачи, не делая попыток передать в сеть свои данные(доступ сетевых устройств к среде передачи регулируется сетевыми стандартами). Однако широкая полоса пропускания используется и для передачи других потоков данных, а соответственно, возможны задержки передачи, к которым видеопотоки крайне чувствительны, поэтому оптимальным решением является коммутируемая ЛВС. Преимущества коммутации заключаются в сегментировании сетей - делении их на более мелкие фрагменты со значительным снижением числа станций в каждом сегменте. Изоляция трафика в небольшом сегменте приводит к многократному расширению доступной каждому пользователю полосы, а поддержка виртуальных ЛВС (VLAN) значительно повышает гибкость системы. Для обеспечения передачи цифрового потока без задержек необходима полоса пропускания 100/1000 Мбит/сек. Оптимальным решением является сеть Fast Ethernet(10/100Base-TX)/Gigabit Ethernet (1000Base-SX). На уровне сегмента обеспечивается скорость передачи 100 Мбит/сек, на уровне здания 1000 Мбит/сек.
Данная сеть характеризуется следующими параметрами:
ØТопология сети – “звезда”;
ØАрхитектура сети: “Клиент- Сервер/Файл – Сервер”;
ØОсновной сетевой протокол TCP/IP;
ØФизическая среда передачи – кабель на основе неэкранированной витой пары (UTP 5 категории) и многомодовый оптоволоконный кабель.
ØКоммутаторы с высокоскоростной шиной иразделяемой памятью.
Ø Возможность объединения сетей Fast Ehernet и ATM
1. Программное обеспечение для управления и работы с серверами и рабочими станциями:
1.Сетевая ОС - Windows NT Server 4.0
2. Клиентская ОС - Windows NT Workstation 4.0
3. Сервер БД - MS SQL Server 7.0
4. Почтовый сервер - MS Exhange Server 5.5
В качестве программного обеспечения для работы с базами данных и сетью можно использовать пакет MS Back Office - 4.0 (Включает в себя NT Server, SQL Server 7.0 Exhange Server 5.5, SMS 2.0, IIS, SNA Server)
2. Программное обеспечение для управления сетью.
1. MS SMS 2.0 - Мониторинг сети и рабочих станций, управление рабочими станциями, установка ПО по сети
2. Программное обеспечение фирмы 3Сom - Transcend Network Control Services(включает сл. продукты Transcend Enterprise Manager и Transcend Workgroup Manager), Traffix Manager - позволяют управлять сетевыми устройствами, анализировать трафики статистику приложений, управлять работой сети(реализуется редствами протокола RMON/RMON2). Все программное обеспечение работает подуправлением WindowsNT Server, Transcend Network Control так же работает под управлением Sun Solstice Domain Manager.
3. Сетевое оборудование фирмы 3Com: Коммутаторы серии: SuperStack II 3300 для Ehernet 10/100 Base-TX (витая пара 5 категории, разъем RJ 45), SuperStack II 9000/9300 для Ehernet 100/100 Base-SX (многомодовое оптоволокно).
Персональный компьютер консультанта использует конфигурацию, аналогичную той, которая была использована для персонального компьютера первичной обработки данных. За исключением установки в ПК сетевой карты для работы с компьютерным рентгеновским томографом и увеличением быстродействия для более детальной и оперативной обработки принимаемой информации, а так же работы с базой данных. Рекомендуемая конфигурация представлена в таблице 2.
Таблица SEQ Таблица * ARABIC 2 Комплектация персонального компьютера консультанта.
Корпус |
ATX 80List (InWin A500) |
Processor |
Pentium II 500 |
Matherboard |
ASUS P2B - D |
Ram |
256 Mb |
HDD first |
SCSI WDE 4550 – 0025 |
HDD second |
SCSI Wde 18300 – AV0038 |
SCSI controller |
ADAPTEC AHA – 8945 |
VideoCard |
I740 |
Network Card |
Fast EthernLink XL PCI TX – 3C9005B – TX |
Monitor |
ViewSonic “GA771” |
Mouse |
Стандартная мышь PS/2 |
Видеоконференции: |
|
Плата |
miroVideo DC30 plus |
Камера |
MUSTEK VidCam |
Для эффективной работы с полученными из УЗИ изображениями необходимо применять программные средства, которые бы обеспечили возможность обработки изображения и при этом не требовали высокой квалификации обслуживающего их персонала. Данная программа была разработана в РНЦ «Курчатовский институт» и называется CTsoft. В создании этого программного продукта и приняла участие и наша группа дипломников. В размерах данного проекта были предоставлены алгоритмы обработки изображения, позволяющие преобразовывать полученные картинки по специализированным алгоритмам – фильтрам. Данные фильтры предназначены для сглаживания и выделения областей на изображении. Рассматривалось четыре вида фильтров:
1. Фильтр сглаживания – Smooth;
2. Фильтр усредненного сглаживания – Mean;
3. Фильтр подчеркивания контуров на основе матрицы размером 3*3 пикселей – Contour;
4. Фильтр обработки полутонов – Shading.
Все вышеуказанные фильтры работают по алгоритмам на базе матрицы размером 3*3 пикселей. Для описания алгоритмов фильтрации используем условные обозначения для каждого элемента данной матрицы см. таблицу 3.
Таблица SEQ Таблица * ARABIC 3 Матрица пикселей, использованная для построения фильтров.
A |
B |
C |
D |
E |
F |
G |
H |
J |
Для того, чтобы можно было бы сравнить действия этих фильтров, далее будут показано изображение, полученное путем передачи данных из УЗИ в персональный компьютер. Исходное изображение показано на рис. 4. И в конце данного раздела будет показано действие нескольких фильтров для отображения определенных областей на данном изображении.
рис. SEQ рис. * ARABIC 4 Исходное изображение.
Фильтр сглаживания используется для уменьшения общей контрастности изображения. Основной алгоритм, использующийся в данном фильтре:
Изменение изображения при использовании данного фильтра показано на рис. 5.
рис. SEQ рис. * ARABIC 5 Фильтр сглаживания.
Фильтр усредненного сглаживания используется для того, чтобы устранить дефекты изображения, могущие появиться в процессе оцифровки. Одним из самых распространенных дефектов является появление в темной области светлого пикселя или наоборот. Данный дефект устраняется при помощи алгоритма:
Пример использования данного фильтра представлен на рис. 6.
рис. SEQ рис. * ARABIC 6 Фильтр усредненного сглаживания.
Фильтр подчеркивания контуров на основе матрицы 3*3 пикселя используется для отображения на изображении областей имеющих «ярко выраженную» границу с другими областями. Алгоритм, использующийся для получения данных областей:
Пример использования данного фильтра показан на рис. 7.
рис. SEQ рис. * ARABIC 7 Фильтр подчеркивания контуров.
Фильтр обработки полутонов используется для построения псевдорельефа. Алгоритм используемый в данном фильтре:
Результат применения данного фильтра к изображению показан на рис. 8.
рис. SEQ рис. * ARABIC 8 Фильтр обработки полутонов.
Часто встречается ситуация, когда использование одного фильтра не дает желаемого результата. В таких случаях бывает необходимо последовательное использование нескольких фильтров для получения желаемого результата. В данном разделе мы рассмотрим две комбинации последовательного использования фильтров представленных на рис. 9 и рис. 10. На рис. 6 рассматривается комбинация фильтров: сглаживания – усредненного сглаживания – подчеркивания контуров. На рис. 7 рассматривается комбинация фильтров: сглаживания – усредненного сглаживания – обработки полутонов.
рис. SEQ рис. * ARABIC 9Smooth - Mean - Contour.
рис. SEQ рис. * ARABIC 10 Smooth - Mean - Shading.
Реформа системы здравоохранения обеспечила рывок в развитии диагностических служб региональных клиник, но одновременно и привела к утере ряда несомненных достижений советского здравоохранения. В частности практически полностью разрушена целостность системы, в результате чего жители регионов не в состоянии получить высококвалифицированную помощь, которая осталась сосредоточенной в центральных московских клиниках. Развитие проекта «Телемедицина» направлено на сохранение и усиление положительных аспектов реформ и на нивелирование возникших негативных последствий.
Объединение клиник страны в медицинскую информационную сеть позволит организовать взаимодействие опытных специалистов центра с начинающими докторами регионов. Работа в этом направлении уже начата, однако до сих пор внутригоспитальные сети, позволяющие обмениваться информацией о больном, находятся на уровне научных разработок. До сих пор не существует единый стандарт формирования пакета медицинской информации, включая изображения (рентген, УЗИ, КТи т.п.). Только единичные клиники работают над построением сетей, собирающих информацию.
Дипломная работа посвящена решению задачи подключения к сети ультразвукового медицинского диагностического аппарата ALOKA SSD - 650, на выходе которого появляется изображение (УЗИ). Главной задачей работы была передача изображения через локальную сеть в другую часть института. Были разработаны и реализованы алгоритмы предварительной обработки изображений. На момент начала исследования в Институте хирургии им. А. В. Вишневского была начата работа по прокладке оптоволоконного кабеля между двумя зданиями: главным корпусом (в котором расположены диагностические службы) и лаб. Кибернетики (в которой расположены вычислительные мощности и внешние коммуникации). На сегодняшний день фрагмент сети, обеспечивающий передачу изображений, построен, испытан и реально функционирует.
В результате проведенного исследования получены следующие выводы и результаты.
1. Построена система передачи изображения из ультразвуковой диагностической установки в ПК с последующей передачей по компьютерной сети;
2. Полученные и переданные изображения были оценены медицинскими экспертами как адекватные;
3.
Установлено, что пропускная способность
коммуникационного канала на удаленных моделях связи должна быть не менее
64 кб/с;
4. Установлено, что разрешающая способность при регистрации изображения должна составлять не менее 768 * 586, при отображении серого клина разрешение должно составлять не менее 10 бит.
1. A CASE OF GASTROSCHISIS, Dr. German Quevedo P, Santa Cruz de la Sierra, Bolivia, June 1 st, 1997.
2. ELEMENTS OF SUCCESS IN TELEMEDICINE PROJECTS, Mary Moor, Ph.D., October, 1996.
3. EUROPEAN COMMITTE FOR STANDARDIZATION.
4. Implementing a Telemedicine Programm Across the Mexican-U.S. Border, 1996.
5. TELEMEDICINE: ITS PLACE ON THE INFORMATION HIGHWAY, Frederic Williams and Mary Moor, 1995.
6. V.D. The Virtual Doctor - медицинские ресурсы Internet в Санкт-Петербурге.
7. Видеоконференции в российских клиниках. Е. Тимин, В. Столяр, А. Сильков. Журнал «Открытые Системы» Изд: «Открытые Системы», 1999г.
8. Журнал «Медицинская визуализация», Выпуски 1 – 4, издательство "ВИДАР" 1999.
9. Журнал Американского Международного Союза Здравоохранения, "Наше Здоровье", Том 5, Выпуск 1, Зима 1997, Раздел "Развитие информационных технологий", Марион Болл и Джудит Дуглас, Статья "Медицинская информатика: там, где встречаются технология и медицина", с. 18.
10. Журнал Американского Международного Союза Здравоохранения, "Наше Здоровье", Том 5, Выпуск 2, Весна 1997, Раздел "Активное сотрудничество", Статья "Бишкек-Канзас-Сити", с. 39.
11. Информационные технологии в охране здоровья, Санкт-Петербург, 1997.
12. Комплекс ИНФОРМАЦИОННО-ВЫЧИСЛИТЕЛЬНЫХ СЕТЕЙ "Телемедицина", Проект "КИВС-МСЧ. ТП", редакция 1, Санкт-Петербург, Февраль 1997.
13. Программа первоочередных мероприятий по реализации программы создания системы телемедицинских услуг в Российской Федерации («Телемедицина»); Главный информационно-аналитический центр при Минздраве РФ, Управление информатизации Федерального Фонда ОМС. Москва 1998г.
14. ТЕЛЕКОНФЕРЕНЦИЯ GlobChat, Copyright © 1997, Julius Edlavitch M.D., В. Теплинский, Ноябрь 1997.
15. ТЕЛЕМЕДИЦИНА - INTERNET, Copyright © 1997, Марк Стори, В. Теплинский, Январь 1997.
16. ТЕЛЕМЕДИЦИНА - АМСЗ, Copyright © 1997, В. Теплинский, Февраль, 1997.
17. Телемедицина. Новые информационные технологии на пороге XXI века; Р. М. Юсупов, Р. И. Полонников.– СПб.:СПИИРАН, 1998. – 486с.
18. ФЕДЕРАЛЬНАЯ ЦЕЛЕВАЯ ПРОГРАММА «ТЕЛЕМЕДИЦИНА»: Министерство здравоохранения Российской Федерации. Министерство науки и технологий Российской Федерации. Москва 1997г.
19. Физика визуализации изображений в медицине; т. 2 под. ред. С. Уэбба. Москва, «Мир», 1991.
Позиция |
Название |
Значение |
Описание |
0 |
n |
360 |
Число проекций |
1 |
m |
512 |
Число отсчетов в проекции |
2 |
nx |
512 |
Число элементов в строке изображения |
3 |
ny |
512 |
Число строк в изображении |
4 |
fi |
360 |
Угол сканирования |
5 |
fi0 |
0 |
Начальный угол сканирования |
6 |
r0 |
125 |
Радиус зоны обследования |
7 |
ri |
150 |
Радиус зоны реконструкции |
8 |
xi |
0 |
X-координата центра зоны реконструкции |
9 |
yi |
0 |
Y-координата центра зоны реконструкции |
10 |
l |
110 |
Уровень окна отображения |
11 |
w |
250 |
Ширина окна отображения |
12 |
ko |
185 |
Номер объекта реконструкции |
13 |
ks |
1 |
Номер среза реконструкции |
14 |
no |
877 |
Номер объекта визуализации |
15 |
ns |
5 |
Номер среза визуализации |
16 |
alm |
5000 |
Мантисса ALFA*1000 |
17 |
alex |
-7 |
Экспонента ALFA |
18 |
pp |
400 |
Порядок регуляризации * 100 |
19 |
mk |
9 |
m*2 = 2**mk |
20 |
0 |
Тип: 0-CTSYS, 1- СРТ-1000М, 2- СТ1010 |
|
21 |
lstp |
5 |
Шаг изменения по уровню окна |
22 |
wstp |
20 |
Шаг изменения по ширине окна |
23 |
scrl |
2 |
Шаг при сдвиге изображения по вертикали |
24 |
ybig |
0 |
Начальный номер строки отображения |
25 |
rd |
0 |
Расстояние от центра до фокуса в мм/10 |
26 |
nj |
480 |
Число измеряемых проекций |
27 |
mj |
384 |
Число измеряемых отсчетов |
28 |
nkad |
32 |
Число кадров в фильме |
29 |
nsl |
100 |
Число срезов для 3D визуализации |
30 |
xw1 |
20 |
Левая X-координата |
31 |
yw1 |
65 |
Верхняя Y-координата |
32 |
xw2 |
147 |
Правая X-координата |
33 |
yw2 |
192 |
Нижняя Y-координата |
34 |
hz |
10 |
Шаг между слоями в мм |
35 |
max |
8000 |
Максимум |
36 |
min |
80 |
Минимум |
40 |
surf |
20 |
Порог плотности для выделения 3d-поверхности |
41 |
tr |
3500 |
Время повторения |
42 |
te |
150 |
неизменяемый параметр |
43 |
ti |
0 |
Время инверсии |
44 |
nsli |
9 |
Количество срезов на томограмме |
45 |
acc |
4 |
Количество накоплений |
46 |
fov |
300 |
Поле обзора |
47 |
matx |
252 |
X матрицы |
48 |
maty |
252 |
Y матрицы |
49 |
1 |
||
50 |
7 |
||
51 |
pmin |
-140 |
Минимум для обрезки перед упаковкой |
52 |
pmax |
220 |
Максимум для обрезки перед упаковкой |
53 |
ncic |
0 |
Количество полос длинной картинки минус 1 |
54 |
yloc |
0 |
Количество строк полной полосы |
60 |
sh2s |
180 |
Сдвиг для второго слоя в микронах |
61 |
sfd |
6 |
Число сдвигов для прямого БПФ |
62 |
nfd |
1 |
(*10) Делитель для спектра |
63 |
nfl |
480 |
(*10) Делитель спектр*фильтр |
64 |
sfi |
6 |
Число сдвигов обратного БПФ |
65 |
nfi |
7 |
(*10) Делитель свернутых проекций |
66 |
imgn |
300 |
(*10) Делитель для изображения |
67 |
? |
360 |
Так надо ??? |
70 |
hx0 |
x0 - координаты прямоугольника обрезки (печать) |
|
71 |
hy0 |
13 |
y0 |
72 |
hx1 |
47 |
x1 |
73 |
hy1 |
217 |
y1 |
74 |
242 |
||
75 |
128 |
||
76 |
40 |
||
77 |
128 |
||
78 |
40 |
||
79 |
12 |
||
80 |
88 |
||
81 |
230 |
||
82 |
190 |
||
83 |
128 |
||
84 |
125 |
||
85 |
128 |
||
86 |
sque |
142 |
Параметр квадрата |
89 |
3 |
Нач. отсчет (для теста каналов) |
|
90 |
568 |
Кон. отсчет (для теста каналов) |
|
91 |
6 |
Число отсчетов в калибровочных зонах |
|
92 |
39 |
Рабочая зона детектора 1 и 9 |
|
93 |
46 |
2 и 10 |
|
94 |
53 |
3 и 11 |
|
95 |
60 |
4 и 12 |
|
96 |
67 |
5 и 13 |
|
97 |
74 |
6 и 14 |
|
98 |
81 |
7 и 15 |
|
99 |
88 |
8 и 16 |
|
100 |
527 |
Калибровочная зона детектора 1 |
|
101 |
534 |
2 |
|
102 |
541 |
3 |
|
103 |
548 |
4 |
|
104 |
9 |
5 |
|
105 |
16 |
6 |
|
106 |
23 |
7 |
|
107 |
30 |
8 |
|
108 |
513 |
Темновая зона детектора 1 |
|
109 |
520 |
2 |
|
110 |
527 |
3 |
|
111 |
534 |
4 |
|
112 |
542 |
5 |
|
113 |
549 |
6 |
|
114 |
556 |
7 |
|
115 |
563 |
8 |
|
116 |
28 |
mA |
|
117 |
0 |
Угол топограммы (0-359) |
|
118 |
0 |
Длина топограммы (512/256) |
|
119 |
4590 |
Полная доза, mAs |
|
120 |
120 |
Число пикселей в 10 см. |
|
121 |
4620 |
Время сканирования (сек.*10) |
|
122 |
60 |
Доза, mAs |
|
123 |
120 |
Напряжение ,kV |
|
124 |
4 |
Наклон плоскости сканирования в градусах |
|
125 |
8 |
Толщина слоя в мм. |
|
126 |
22 |
Позиция стола пациента в мм. от начала |
|
127 |
410 |
Тип системы |
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "color.h"
#include "vectlib.h"
#include "winds.h"
#include "win2d.h"
#include "3d.h"
#include "filtr.h"
#include "config.h"
#include "ctmenu.h"
#include "setup.h"
#include "measure.h"
#include "ct.h"
#include "ct_ext.h"
#include "console.h"
#include "language.h"
#define POROG (GRAY_BASE+GRAY_LVLS*4/5)
extern int ExistWindow(WinHandle w);
extern WinHandle MainControl;
extern WinHandle H3d_view;
extern void InvRect(int x0, int y0, int x1, int y1, WinHandle w, char *s);
extern void redraw_window(WinHandle w);
extern void redraw_cw(WinHandle w);
extern void SetupLUT(DWIND *winds);
extern void Screen_Save(void);
extern Rect correct_rect(Rect r);
extern Rect Set_Rect(WinHandle w);
extern Rect Set_Sqr(WinHandle w);
extern void cell_to_pcx(char *pcx_name, GCHandle ch,
int xmax, int ymax, char *pallet);
/***********************************************************/
void Do_AddSub_Img(WinHandle w, int fl_sub)
{ GWHandle chl;
HFILE img_fil,tmp_fil;
long *L,*L1;
int *p,*p1,*p2,*p0,*pp,k,i,j,jz,nx,ny,*pq;
char *hc,*c,name[81];
char *s;
unsigned char *uhc,*pc;
Win2d *ud = h_data(w);
if(!ud->img_name || !ud->ch) return;
if(ud->frag) return;
chl = ud->ch;
s = GetFileName(GetCfgItem("image"),H_CREATE); if (*s == 0) return;
img_fil = HOpen(s,H_READ); if (img_fil == 0) return;
HLocate(img_fil,0l,2048); p = HPosit(img_fil);
L = (long*)p; nx = L[2]; ny = L[3]; ud = h_data(w);
if(nx != ud->iw) { HClose(img_fil); return;}
if(ny != ud->ih) { HClose(img_fil); return;}
if (chl == 0) { HClose(img_fil); return;}
ud = h_data(w);
uhc = (char*)&p[256+128];
if(uhc[249] != 2-ud->ps) return;
if(ud->scale2d == 1)
{
pp = h_malloc(nx*4);
pq = h_malloc(nx*4);
for (j = 0; j < ny; j++)
{ ud = h_data(w);
if(ud->ps == 2)
{ HLocate(img_fil,(long)j*nx*2+2048L,nx*2); p = HPosit(img_fil);
}
else
{ HLocate(img_fil,(long)j*nx+2048L,nx); pc = HPosit(img_fil);
for(i = 0; i < nx; i++) pq[i] = (int)pc[i];
p = pq;
}
GetGWL(chl,(short*)pp,nx,j);
for(i = 0; i < nx; i++)
if(fl_sub) pp[i] = (pp[i]-2048 - p[i])/2 + 2048;
pp[i] = (pp[i]-2048 + p[i])/2 + 2048;
PutGWL(chl,(short*)pp,nx,j);
}
h_mfree(pp); h_mfree(pq);
}
else
{ p1 = h_malloc(nx*4); p2 = h_malloc(nx*4);
p0 = h_malloc(nx*4); pp = h_malloc(nx*4);
// Image interpolation
HLocate(img_fil,2048l,nx*2);
p = (int*)HPosit(img_fil);
for (i = 0, k = 0; i < nx-1; i++, k += 2)
{ p1[k] = p[i]; p1[k+1] = (p[i]+p[i+1])/2;
}
p1[k] = p[i];
for (j = 0, jz = 0; j < ny-1; j++, jz += 2)
{ // Write 1 line
GetGWL(chl,(short*)pp,nx*2-1,jz);
for(i = 0; i < nx*2-1; i++)
if(fl_sub) pp[i] = (pp[i]-2048 - p1[i])/2 + 2048;
pp[i] = (pp[i]-2048 + p1[i])/2 + 2048;
PutGWL(chl,(short*)pp,nx*2-1,jz);
//Read 2 line
HLocate(img_fil,(long)(j+1)*nx*2+2048l,nx*2);
p = (int*)HPosit(img_fil);
for (i = 0, k = 0; i < nx-1; i++, k += 2)
{ p2[k] = p[i]; p2[k+1] = (p[i]+p[i+1])/2;
}
p2[k] = p[i];
for (i = 0; i < nx*2-1; i++) p0[i] = (p1[i]+p2[i])/2;
// Write 2 line
GetGWL(chl,(short*)pp,nx*2-1,jz+1);
for(i = 0; i < nx*2-1; i++)
if(fl_sub) pp[i] = (pp[i]-2048 - p1[i])/2 + 2048;
pp[i] = (pp[i]-2048 + p0[i])/2 + 2048;
PutGWL(chl,(short*)pp,nx*2-1,jz+1);
// Line2 to Line1
for (i = 0; i < nx*2-1; i++) p1[i] = p2[i];
}
GetGWL(chl,(short*)pp,nx*2-1,jz);
for(i = 0; i < nx*2-1; i++)
if(fl_sub) pp[i] = (pp[i]-2048 - p1[i])/2 + 2048;
pp[i] = (pp[i]-2048 + p1[i])/2 + 2048;
PutGWL(chl,(short*)pp,nx*2-1,jz);
h_mfree(p1); h_mfree(p2); h_mfree(p0); h_mfree(pp);
}
HClose(img_fil);
ud = h_data(w);
ud->x0 = (ud->iw-ud->w)/2; // Центровка
ud->y0 = (ud->ih-ud->h)/2; // изображения
redraw_cw(w);
}
/***********************************************************/
void Do_Inversion(WinHandle w)
{ int i,k;int imin,imax;
Win2d *ud = h_data(w);
WinCon *udc;
DWIND *p = &ud->dw[0];
if(!ud->img_name || !ud->ch) return;
if (p->on) { if(p->neg) p->neg = 0; else p->neg = 1;
if(!ExistWindow(H3d_view))
{ udc = h_data(MainControl);
udc->inv_prn = p->neg;
}
}
SetupLUT(ud->dw);
redraw_cw(w);
}
/***********************************************************/
// Image filtration functions
static void inch(int *u,int *v)
{int temp;
temp=*u; *u=*v; *v=temp;
}
static int f9(int *mf)
{
int *max,i,j;
for(i = 0;i < 9; i++)
{max=&mf[i];
for(j = i+1;j < 9; j++) if(*max < mf[j]) max = &mf[j];
if(max != &mf[i]) inch(max,&mf[i]);
}
return(mf[4]);
}
static int f1(int *mf)
{long s;
s=(long)mf[0]+2*(long)mf[1]+(long)mf[2]+2*(long)mf[3]
+4*(long)mf[4]+2*(long)mf[5]+(long)mf[6]+2*(long)mf[7]+(long)mf[8];
return(s/16);
}
static int f2(int *mf)
{long s;
s=(long)mf[0]+(long)mf[1]+(long)mf[2]+(long)mf[3]
+(long)mf[5]+(long)mf[6]+(long)mf[7]+(long)mf[8];
return(s/8);
}
static int f3(int *mf)
{long r1,r2;
r1 = (long)mf[0]+(long)mf[1]+(long)mf[2]-(long)mf[6]-(long)mf[7]-(long)mf[8];
r1 = r1*r1;
r2 = (long)mf[0]+(long)mf[3]+(long)mf[6]-(long)mf[2]-(long)mf[5]-(long)mf[8];
r2 = r2*r2;
return((int)(2.0*sqrt((double)(r1+r2))));
}
static int f4(int *mf)
{return( mf[4]);
}
static int f5(int *mf)
{long s;
s=(-2*(long)mf[0]+(long)mf[1]-2*(long)mf[2]+(long)mf[3]
+6*(long)mf[4]+(long)mf[5]-2*(long)mf[6]+(long)mf[7]-2*(long)mf[8])/2;
return((int)s);
}
static int f6(int *mf)
{int e,s;
s = f1(mf); e = mf[4];
if((2*e - s) > 30) e = 2*e - s;
else e = s;
return(e);
}
static int f7(int *mf)
{long s;
s=-(long)mf[0]-(long)mf[1]-(long)mf[2]+(long)mf[3]
+3*(long)mf[4]-(long)mf[5]+(long)mf[6]+(long)mf[7]-(long)mf[8];
return((int)s);
}
static int f8(int *mf)
{long s;
s=((long)mf[0]+(long)mf[1]+(long)mf[2]+(long)mf[3])/4;
return((int)s);
}
static int f10(int *mf)
{return( mf[4]);
}
static void filt(int *p1,int *p2,int *p3,int *po,int str,int nfilt)
{
int mf[9],i,tr;
str=str-1; tr=str-1;
mf[0]=*(p1+str);mf[1]=*p1;mf[2]=*(p1+1);
mf[3]=*(p2+str);mf[4]=*p2;mf[5]=*(p2+1);
mf[6]=*(p3+str);mf[7]=*p3;mf[8]=*(p3+1);
switch (nfilt)
{ case 1: *po=f1(mf); break;
case 2: *po=f2(mf); break;
case 3: *po=f3(mf); break;
case 4: *po=f4(mf); break;
case 5: *po=f5(mf); break;
case 6: *po=f6(mf); break;
case 7: *po=f7(mf); break;
case 8: *po=f8(mf); break;
case 9: *po=f9(mf); break;
case 10: *po=f10(mf); break;
}
for(i = 0; i < tr; i++)
{mf[0] = *(p1+i); mf[1] = *(p1+i+1); mf[2] = *(p1+i+2);
mf[3] = *(p2+i); mf[4] = *(p2+i+1); mf[5] = *(p2+i+2);
mf[6] = *(p3+i); mf[7] = *(p3+i+1); mf[8] = *(p3+i+2);
switch (nfilt)
{ case 1: *(po+i+1) = f1(mf); break;
case 2: *(po+i+1) = f2(mf); break;
case 3: *(po+i+1) = f3(mf); break;
case 4: *(po+i+1) = f4(mf); break;
case 5: *(po+i+1) = f5(mf); break;
case 6: *(po+i+1) = f6(mf); break;
case 7: *(po+i+1) = f7(mf); break;
case 8: *(po+i+1) = f8(mf); break;
case 9: *(po+i+1) = f9(mf); break;
case 10: *(po+i+1) = f10(mf); break;
}
}
mf[0]=*(p1+tr);mf[1]=*(p1+str);mf[2]=*p1;
mf[3]=*(p2+tr);mf[4]=*(p2+str);mf[5]=*p2;
mf[6]=*(p3+tr);mf[7]=*(p3+str);mf[8]=*p3;
switch (nfilt)
{ case 1: *(po+str)=f1(mf); break;
case 2: *(po+str)=f2(mf); break;
case 3: *(po+str)=f3(mf); break;
case 4: *(po+str)=f4(mf); break;
case 5: *(po+str)=f5(mf); break;
case 6: *(po+str)=f6(mf); break;
case 7:*(po+str)=f7(mf); break;
case 8: *(po+str)=f8(mf); break;
case 9: *(po+str)=f9(mf); break;
case 10: *(po+str)=f10(mf); break;
}
}
void Do_Filters(WinHandle w, int nfilt)
{ GWHandle chl;
int i,k;
int *po,*p1,*p2,*p3,*p4,*p5,*pn,iw,ih;
double d1,d2;
Win2d *ud = h_data(w);
if ((chl = ud->ch) == 0) return;
iw=ud->iw; ih=ud->ih;
if(nfilt == 10)
{
po = (int*)h_malloc(iw*2); pn = (int*)h_malloc(iw*2);
p1 = (int*)h_malloc(iw*2); p2 = (int*)h_malloc(iw*2);
p3 = (int*)h_malloc(iw*2); p4 = (int*)h_malloc(iw*2);
p5 = (int*)h_malloc(iw*2);
i = 2;
GetGWL(chl,(short*)p1,iw,i-2);
for(k = 0; k < iw; k++) p1[k] = p1[k]-2048;
GetGWL(chl,(short*)p2,iw,i-1);
for(k = 0; k < iw; k++) p2[k] = p2[k]-2048;
GetGWL(chl,(short*)p3,iw,i);
for(k = 0; k < iw; k++) p3[k] = p3[k]-2048;
GetGWL(chl,(short*)p4,iw,i+1);
for(k = 0; k < iw; k++) p4[k] = p4[k]-2048;
for( i =2; i < ih-2; i++)
{
GetGWL(chl,(short*)p5,iw,i+2);
for(k = 0; k < iw; k++) p5[k] = p5[k]-2048;
for(k = 2; k < iw-2; k++)
{
d1 = p1[k-2] - p5[k+2]; d1 = d1*d1;
d2 = p5[k-2] - p1[k+2]; d2 = d2*d2;
po[k] = (int)sqrt(d1+d2)+2048;
}
for(k = 0; k < iw; k++) p1[k] = p2[k];
for(k = 0; k < iw; k++) p2[k] = p3[k];
for(k = 0; k < iw; k++) p3[k] = p4[k];
for(k = 0; k < iw; k++) p4[k] = p5[k];
PutGWL(chl,(short*)po,iw,i);
}
h_mfree(pn); h_mfree(po); h_mfree(p1); h_mfree(p2); h_mfree(p3);
h_mfree(p4); h_mfree(p5);
redraw_cw(w);
return;
}
if(nfilt == 4)
{
}
po = (int*)h_malloc(iw*2); pn = (int*)h_malloc(iw*2);
p1 = (int*)h_malloc(iw*2); p2 = (int*)h_malloc(iw*2);
p3 = (int*)h_malloc(iw*2);
i = 1;
GetGWL(chl,(short*)p1,iw,i-1);
for(k = 0; k < iw; k++) p1[k] = p1[k]-2048;
GetGWL(chl,(short*)p2,iw,i);
for(k = 0; k < iw; k++) p2[k] = p2[k]-2048;
for( i =1; i < ih-1; i++)
{
GetGWL(chl,(short*)p3,iw,i+1);
for(k = 0; k < iw; k++) p3[k] = p3[k]-2048;
filt(p1,p2,p3,po,iw,nfilt);
// memcpy(p1,p2,iw); memcpy(pn,p3,iw);
for(k = 0; k < iw; k++) p1[k] = p2[k];
for(k = 0; k < iw; k++) pn[k] = p3[k];
for(k = 0; k < iw; k++) po[k] = po[k]+2048;
PutGWL(chl,(short*)po,iw,i);
// memcpy(p2,pn,iw);
for(k = 0; k < iw; k++) p2[k] = pn[k];
}
h_mfree(pn); h_mfree(po); h_mfree(p1); h_mfree(p2); h_mfree(p3);
redraw_cw(w);
}
/***********************************************************/
void Do_Scale_Rotate(WinHandle w)
{ int i,k;
int nx,ny,ix,iy;
int *po;
int q1,q2,q3,q4;
double angle;
double hi,hi_t,x,y,u,v,si,co,dx,dy;
double cox = 65536.0;
long cx,cy,cx1,cy1,s1,s2;
long lx,ly,ldx,ldy,lix,liy;
unsigned char *pc,s,p;
IJ ij;
GWHandle ch,chol;
Win2d *ud = h_data(w);
if ((chol=ud->ch) == 0) return;
angle = 3.14159265*ud->angle/180.0;
hi = 1.0/ud->iw; hi_t = hi/ud->scale;
nx = ud->scale*ud->iw; ny = ud->scale*ud->ih;
si = sin(angle); co = cos(angle);
u= -hi_t*(nx/2.0); v = -hi_t*(ny/2.0 - 1);
dx = hi_t*co/hi; dy = hi_t*si/hi;
ldx= cox*dx; ldy = cox*dy;
po = (int*)h_malloc(nx*sizeof(int));
ch = NewGW(f_create("rout.tmp",F_CREATE_NORMAL),0);
for( i = 0; i < ny; i++)
{v+= hi_t;
lx = cox*( u*co - v*si + hi_t*(nx/2.0) )/hi;
ly = cox*( u*si + v*co + hi_t*(ny/2.0) )/hi;
for(k = 0; k < nx; k++)
{
ix = lx >> 16; lx+= ldx;
iy = ly >> 16; ly+= ldy;
liy = iy; liy = liy << 16;
cy = ly - liy;
cy1= 65537L - cy;
lix = ix; lix = lix << 16;
cx = lx - lix;
cx1= 65537L - cx;
ij.i = ix; ij.j = iy; GetGWA(chol, (short*)&q1, 1, &ij);
ij.i = ix+1; ij.j = iy;GetGWA(chol, (short*)&q2, 1, &ij);
ij.i = ix; ij.j = iy+1; GetGWA(chol, (short*)&q3, 1, &ij);
ij.i = ix+1; ij.j = iy+1; GetGWA(chol, (short*)&q4, 1, &ij);
s1 = ((long)q1*cx1+(long)q2*cx) >> 16;
s1 = (s1*cy1)>>16;
s2 = ((long)q3*cx1 + (long)q4*cx) >> 16;
s2 = (s2*cy)>>16;
po[k] = s1+s2;
}
PutGWL(ch, (short*)po, nx, i);
}
h_mfree(po);
if (chol) DisposeGW(chol);
ud = h_data(w);
ud->ch = ch;
ud->iw = nx; ud->ih = ny;
ud->x0 = (ud->iw-ud->w)/2; // Центровка
ud->y0 = (ud->ih-ud->h)/2; // изображения
redraw_window(w);
}
// зеркальное отображение
void Do_Mirrow(WinHandle w)
{ int i,j,vol;
int nx,ny;
int *po;
GWHandle ch;
Win2d *ud = h_data(w);
if ((ch=ud->ch) == 0) return;
nx = ud->iw; ny = ud->ih;
po = (int*)h_malloc(nx*sizeof(int));
for( i = 0; i < ny; i++)
{ GetGWL(ch, (short*)po, nx, i);
for(j=0;j { vol = po[j]; po[j] = po[nx-j-1];
po[nx-j-1] = vol; } PutGWL(ch, (short*)po, nx, i); } h_mfree(po); ud = h_data(w); ud->flef^=1; redraw_cw(w); } static
void Do_ResZo(WinHandle w, int nxi, int nyi, int reszo, int type) {
int i,k; int nx,ny,ix,iy,new_nx,new_ny,x0,y0; int *po; int q1,q2,q3,q4; double x,y,dx,dy; long cx,cy,cx1,cy1,s1,s2; double sc_x,sc_y,cox = 65536.0; long lx,ly,ldx,ldy,lix,liy; unsigned char *pc,s,p; IJ ij; GWHandle ch,chol; Rect r; Rect wr = WorkRect(w); Win2d *ud = h_data(w); if ((chol=ud->ch) == 0) return; if(reszo) { nx=nxi; ny=nyi; new_nx = ud->iw;new_ny = ud->ih; if(new_nx==nx && new_ny==ny)
return; } else { r = type ? Set_Rect(w) : Set_Sqr(w); if(r.x0 == -1) return; new_nx = r.x1-r.x0+1; new_ny = r.y1-r.y0+1; ud =
h_data(w); sc_x = (double)ud->iw/new_nx; sc_y = (double)ud->ih/new_ny; if( sc_x < sc_y) { nx = ud->iw; ny = new_ny*sc_x; if(ny%2) ny--; ud->scale = sc_x; } else { ny = ud->ih; nx = new_nx*sc_y; if(nx%2) nx--; ud->scale = sc_y; } } OnScale(wr.x0,wr.y0); dx = (double)new_nx/(double)nx; dy = (double)new_ny/(double)ny; ldx= cox*dx; ldy = cox*dy; po = (int*)h_malloc(nx*sizeof(int)); if(reszo) x0 =
y0 = 0; else { ud = h_data(w); x0 = r.x0-wr.x0+ud->x0; y0 = r.y0-wr.y0+ud->y0; } ch =
NewGW(f_create("rout.tmp",F_CREATE_NORMAL),0); ly = cox*y0; for( i = 0; i < ny; i++) { lx = cox*x0; ly+= ldy; iy = ly>>16; liy = iy; liy = liy << 16; cy = ly - liy; cy1= 65537L - cy; for(k = 0; k < nx; k++) { lx+= ldx; ix = lx>>16; ij.i = ix; ij.j = iy;
GetGWA(chol, (short*)&q1, 1, &ij); ij.i = ix+1; ij.j = iy; GetGWA(chol, (short*)&q2, 1, &ij); ij.i = ix; ij.j = iy+1; GetGWA(chol, (short*)&q3,
1, &ij); ij.i = ix+1; ij.j = iy+1; GetGWA(chol,
(short*)&q4, 1, &ij); lix = ix; lix = lix << 16; cx = lx - lix; cx1= 65537L - cx; s1 = ((long)q1*cx1+(long)q2*cx)
>> 16; s1 = (s1*cy1)>>16; s2 = ((long)q3*cx1 + (long)q4*cx)
>> 16; s2 = (s2*cy)>>16; po[k] = s1+s2; } PutGWL(ch, (short*)po, nx, i); DoneVisSave((int)((i+1)*100.0/ny+0.5)); } h_mfree(po); if (chol) DisposeGW(chol); ud = h_data(w); ud->ch = ch; ud->r0 =
(double)ud->r0*(double)new_nx/ud->iw; ud->iw = nx; ud->ih = ny; ud->x0 = (ud->iw-ud->w)/2; //
Центровка ud->y0 = (ud->ih-ud->h)/2; //
изображения OffScale(); if(reszo) redraw_window(w); else { if (ud->size_big) SetRectShape(w,&CommonRect); else
SetRectShape(w,&ud->own_size); redraw_cw(w); } } void
Do_Zoom(WinHandle w, int type) {
Do_ResZo(w,0,0,0,type); } void
Do_Resemple(WinHandle w, int nx, int ny, int type) {
Do_ResZo(w,nx,ny,1,type); } /***********************************************************/ typedef
unsigned char BYTE; typedef
unsigned int WORD; typedef
unsigned long DWORD; typedef
struct tagBITMAPFILEHEADER { WORD
bfType; DWORD
bfSize; WORD
bfReserved1; WORD
bfReserved2; DWORD
bfOffBits; }
BITMAPFILEHEADER; typedef
struct tagBITMAPINFOHEADER { DWORD
biSize; long
biWidth; long
biHeight; WORD
biPlanes; WORD
biBitCount; DWORD
biCompression; DWORD
biSizeImage; long
biXPelsPerMeter; long
biYPelsPerMeter; DWORD
biClrUsed; DWORD
biClrImportant; }
BITMAPINFOHEADER; void
Fr_Save(WinHandle w, int select) {
int i,k,x,y,x1,y1,nx,ny,format,ii,fin; BYTE rr,gg,bb; Rect r; BYTE *filp,*pallet,*pal; GCHandle
ch; Win2d *ud = h_data(w); USGC *s; BITMAPFILEHEADER *hfile; BITMAPINFOHEADER *hinfo; long hi; Rect wr = WorkRect(w); int L = wr.x1 - wr.x0 + 1; int H = wr.y1 - wr.y0 + 1; if(ud->r0<500 && ud->r0>10) hi =
100.0/(0.2*(double)ud->r0/(double)(ud->iw-1)); else hi = 0l; if(!ud->img_name || !ud->ch) return; //BringToFront(w);VisSetWin(w); // ????? format = 0; if(select == 0) {r = Set_Rect(w); if(r.x0 < 0)return; redraw_window(w); } else if(select == 1) {r.x0 = wr.x0; r.y0 = wr.y0; r.x1 = wr.x1;
r.y1 = wr.y1;} else if(select == 2) { if((ud->iw > L) || (ud->ih >
H)) {r.x0 = wr.x0; r.y0 = wr.y0; r.x1 =
wr.x1; r.y1 = wr.y1;} else { r.x0 = wr.x0-ud->x0; r.y0 =
wr.y0-ud->y0; r.x1 = r.x0 + ud->iw-1; r.y1 = r.y0
+ ud->ih-1; } } else return; nx = r.x1-r.x0+1; ny = r.y1-r.y0+1; if(nx%4) { nx-=nx%4; r.x0++; } if(ny%2) { ny--; r.y0++; } i = InputForm(mesman,&format); if (i != 1) return; s = h_malloc(4096); if(!s) return; if(format == 2) // BMP save { hfile =h_malloc(sizeof(BITMAPFILEHEADER)); hinfo =h_malloc(sizeof(BITMAPINFOHEADER)); //
Select name and open BMP file filp = GetFileName(GetCfgItem("bmp"),H_CREATE); if (*filp == 0) {h_mfree(s);
h_mfree(hfile); h_mfree(hinfo); return;} if ((fin = f_create(filp,
F_CREATE_NORMAL)) == -1) {h_mfree(s); h_mfree(hfile);
h_mfree(hinfo); return;} //
Save BITMAPFILEHEADER hfile->bfType = 0x4D42;// BM - символы идентифицирующие формат hfile->bfSize = 0l; // размер файла в long-ах hfile->bfReserved1= 0; hfile->bfReserved2= 0; hfile->bfOffBits = sizeof(BITMAPFILEHEADER)+ sizeof(BITMAPINFOHEADER)+1024L; // смещение начала собственно битового
массива в байтах f_write(fin, hfile,
sizeof(BITMAPFILEHEADER)); //
Save BITMAPIMFOHEADER hinfo->biSize = (long)sizeof(BITMAPINFOHEADER); hinfo->biWidth = (long)nx; // кратно long-ам (если надо,
добавить нули) hinfo->biHeight = (long)ny; hinfo->biPlanes = 1; hinfo->biBitCount = 8; hinfo->biCompression = 0L; hinfo->biSizeImage = 0L;
hinfo->biXPelsPerMeter = hi; hinfo->biYPelsPerMeter = hi; hinfo->biClrUsed = 0L;
// к-во цветов в таблице цветности hinfo->biClrImportant= 0L;
// обязательное к-во цветов f_write(fin, hinfo,
sizeof(BITMAPINFOHEADER)); //
Save PALLETE pallet = h_malloc(1024); pal = pallet; for(ii=0; ii<256; ii++) {
g_get_pal((USGC)ii,&rr,&gg,&bb); *pal++ = rr*4; *pal++ = gg*4; *pal++
= bb*4; *pal++ = 0; } f_write(fin, pallet, 1024); h_mfree(pallet); //
Save BITMAP for(y=r.y1; y>=r.y0; y--) { for(x=r.x0,k=0; x<=r.x1; x++,k++) { s[k] = g_point(x, y, 0);
g_point(x, y, s[k]);} f_write(fin, s, nx); } f_close(fin); h_mfree(hfile);
h_mfree(hinfo); } else if(format == 0)// IMG save { filp =
GetFileName(GetCfgItem("frag"),H_CREATE); if (*filp == 0) { h_mfree(s); return;} if ((fin = f_create(filp,
F_CREATE_NORMAL)) == -1) {h_mfree(s); return;} f_write(fin, &nx, sizeof(int)); f_write(fin,
&ny, sizeof(int)); for(y=r.y0; y<=r.y1; y++) { for(x=r.x0,k=0; x<=r.x1; x++,k++) { s[k] = g_point(x, y, 0);
g_point(x, y, s[k]); } f_write(fin, s, nx); } f_close(fin); ShowCursor(x,y,CURT_HAND); } else if(format == 1) // PCX save { if ((fin = f_create("frag.tmp",
F_CREATE_NORMAL)) == -1) {h_mfree(s); return;} ch = NewGC(fin,0); pallet = h_malloc(768); for(y=r.y0,i = 0; y<=r.y1; y++,i++) { for(x=r.x0,k=0; x<=r.x1; x++,k++) { s[k] = g_point(x, y, 0);
g_point(x, y, s[k]);} PutGCL(ch, s, nx, i); } pal = pallet; for(ii=0; ii<256; ii++) {
g_get_pal((USGC)ii,&rr,&gg,&bb); *pal++ = rr*4; *pal++ = gg*4; *pal++ = bb*4; } filp =
GetFileName(GetCfgItem("pcx"),H_CREATE); if (*filp) cell_to_pcx(filp, ch, nx, ny, pallet); h_mfree(pallet); DisposeGC(ch);
f_delete("frag.tmp"); } h_mfree(s); } void
PCX_Save(WinHandle w) {
int i,k,x,y,x1,y1,nx,ny,ii,fin; USGC rr,gg,bb; Rect r; USGC *filp,*pallet,*pal; GCHandle
ch; Win2d *ud; USGC *s,*s1,name[13],ss[81]; Rect wr = WorkRect(w); ud = h_data(w); if(!ud->img_name ||
!ud->ch) return; r.x0 = wr.x0; r.y0 = wr.y0; r.x1 = wr.x1;
r.y1 = wr.y1; nx = r.x1-r.x0+1; ny = r.y1-r.y0+1; if(nx%2) { nx--; r.x0++; } if(ny%2) { ny--; r.y0++; } s = h_malloc(1024); if(!s) return; //
PCX save if ((fin = f_create("frag.tmp",
F_CREATE_NORMAL)) == -1) {h_mfree(s); return;} ch = NewGC(fin,0); pallet = h_malloc(768); for(y=r.y0,i = 0; y<=r.y1; y++,i++) { for(x=r.x0,k=0; x<=r.x1; x++,k++) { s[k] = g_point(x, y, 0);
g_point(x, y, s[k]);} PutGCL(ch, s, nx, i); } pal = pallet; for(ii=0; ii<256; ii++) {
g_get_pal((USGC)ii,&rr,&gg,&bb); *pal++ = rr*4; *pal++ = gg*4; *pal++ = bb*4; } strcpy(ss,GetCfgItem("pcx")); if(*ss != 0) { s1=strrchr(ss,'\'); if(!s1) return ;
else { s1++; *s1=0; } } ud = h_data(w);
sprintf(name,"%ld-%d.pcx",ud->no,ud->ns); strcat(ss,name); if (*ss) cell_to_pcx(ss, ch, nx, ny,
pallet); h_mfree(pallet); DisposeGC(ch); f_delete("frag.tmp"); h_mfree(s); } void
Fr_Load(WinHandle w) {
GWHandle chl; int i,k,x,y,x1,y1,nx,ny; Rect r;
EventRecord e; char name[81],s[81],*s1; int *pi; unsigned char *c,*pc,*p,*pp; int fin; char *filp; Win2d *ud = h_data(w); filp =
GetFileName(GetCfgItem("frag"),H_READ); if (*filp == 0) return; if ((fin = f_open(filp, F_OPEN_READ)) == -1)
return; f_read(fin, &nx, sizeof(int));
f_read(fin, &ny, sizeof(int)); get_ct_handle(w, ct); get_ctsys(); ct->l[2] = nx; ct->l[3] = ny; ct->b[249] = 1; ud = h_data(w); ud->iw = nx; ud->ih = ny; ud->ps = 1; ud->frag = 1; ud->objtype = 0; //
GW file name definition strcpy(name,GetCfgItem("image")); pc = name+strlen(name); while (pc > name
&& pc[-1] != '\') pc--; sprintf(pc,"w%d.tmp",ud->temp_name); if (ud->ch) { DisposeGW(ud->ch);
f_delete(name); } ud->ch =
NewGW(f_create(name,F_CREATE_NORMAL),0); chl = ud->ch; p=
h_malloc(nx);pi = (int*)h_malloc(nx*2); for( k = 0; k < ny; k++) {f_read(fin, p, nx); for
(i = 0; i < nx; i++) pi[i] = (int)p[i]+2048; PutGWL(chl,(short*)pi,nx,k); // Write to GW file } h_mfree(p); h_mfree(pi); VisSetWin(w); strcpy(s,filp); ud = h_data(w); if(!ud->img_old &&
ud->img_name) { int len = strlen(h_data(ud->img_name)); ud->img_old = h_alloc(len+1); ud = h_data(w);
strcpy(h_data(ud->img_old),h_data(ud->img_name)); } if(ud->img_name) { if (ud->tempimg)
f_delete(h_data(ud->img_name)); h_free(ud->img_name); } else h_free(ud->win.title); ud = h_data(w); ud->img_name = h_alloc(strlen(s)+1); ud = h_data(w); strcpy(h_data(ud->img_name),s); ud->tempimg = 0; ud->win.title = ud->img_name; PaintTitle(w); ud->x0 = (ud->iw-ud->w)/2; //
Центровка ud->y0 = (ud->ih-ud->h)/2; //
изображения redraw_window(w); }
Приложение
3
Описание
программы обработки изображений Ctsoft