Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

GMSAPR

.pdf
Скачиваний:
11
Добавлен:
16.03.2016
Размер:
9.01 Mб
Скачать

161

if(y+dy>m_pSourceBM->GetBMHeight() ) y_finish-=(y+dy-m_pSourceBM->GetBMHeight());

// Находим среднее значение яркости int mx=0, my=0;

int avgY=0, count=0;

for(my=y_start; my<y_finish; my++) for(mx=x_start; mx<x_finish; mx++)

{

if((pSPix=m_pSourceBM->GetPixPtr(x+(mx-dx), y+(my-dy)))!=NULL)

{

avgY+=Y(pSPix);

count++;

}

}

// Находим сумму отклонений от среднего int sumVar=0;

for(my=y_start; my<y_finish; my++) for(mx=x_start; mx<x_finish; mx++)

{

if((pSPix=m_pSourceBM->GetPixPtr(x+(mx-dx), y+(my-dy)))!=NULL)

{

sumVar+=abs(avgY-count*Y(pSPix));

}

}

// Адрес пиксела в изображении-источнике pSPix=m_pSourceBM->GetPixPtr(x, y);

double Pi = sumVar > 0 ? fabs (avgY –count * Y (pSPix)) / sumVar : 0;

// Адрес пиксела в изображении-приемнике pDPix=m_pDestBM->GetPixPtr(x, y);

BYTE NewValue=255;

162

int NewBGR[3], count2=0;

switch(m_nWhatToDo)

{

case 0: //Удаление шума if(Pi> m_dK/count) // шум

{

NewBGR[0]=NewBGR[1]=NewBGR[2]=0;

count2=0;

// Находим суммарное значение «не шумовых» пикселов for(my=y_start; my<y_finish; my++)

for(mx=x_start; mx<x_finish; mx++)

{

if((pSPix=m_pSourceBM->GetPixPtr(x+(mx-dx),y+(my-dy))) != NULL && ((sumVar>0?fabs (avgY -count*Y(pSPix))/sumVar:0) <= m_dK/count))

{

for(int c=0; c<3; c++) NewBGR[c]+=*(pSPix+c);

count2++;

}

}

// Заменяем шум новым значением for(int c=0; c<3; c++)

*(pDPix+c)=NewBGR[c]/count2;

}

else // не шум

//Просто копируем значение пиксела

for(int c=0; c<3; c++) *(pDPix+c)=*(pSPix+c);

break;

case 1: // Выделение шума if(Pi> m_dK*1.0/count)

NewValue=128;

for(int c=0; c<3; c++) *(pDPix+c)=NewValue; break;

163

}

return TRUE;

}

//Расчет яркости пиксела

BYTE Y(PBYTE pPix)

{

return( (BYTE)(0.11*(*pPix) + 0.59*(*(pPix+1)) + 0.3*(*(pPix+2))) );

}

Реализация метода CDeNoise::TransformPix() позволяет, в

зависимости от значения переменной m_nWhatToDo, либо выполнить замену шумового пиксела, либо показать его серым цветом на белом фоне. Последнее может пригодиться при определении оптимального значения порогового коэффициента c в условии (4).

Остается только поэкспериментировать с удалением шума. Для этого надо сначала получить зашумленную картинку. Не станем слишком хитрить, а возьмем изображение автомобиля, показанное на рис. 4, и в программе Microsoft Paint с помощью инструмента Airbrush нанесем на него некоторое количество белых и черных точек (рис. 24). Это приведет к появлению в изображении импульсного шума — значительных скачков яркости в отдельных пикселах.

164

Рис. 24. Зашумленное изображение

Теперь попробуем применить фильтр «Размытие» для удаления шума (рис. 25) — да, похоже, это не тот случай, когда «Размытие» хорошо справляется с удалением шума. Дело, видимо, в том, что шумовые пикселы также вносят свой вклад в среднее значение.

165

Рис. 25. Попытка удалить шум фильтром «Размытие»

Испытаем далее фильтр «Удаление шума». На рис. 26 показано изображение, к половине которого применили этот фильтр со значением c = 2,0.

Рис. 26. Действие энтропийного фильтра удаления шума

Как видно, фильтр справился с задачей довольно неплохо — основная масса шума удалена. Некоторые нарекания вызывает то, что некоторые

166

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

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

Медианная фильтрация предложена Дж. Тьюки в 1971 г. для анализа экономических процессов. Метод медианной фильтрации является эвристическим, и не является математическим решением строго сформулированной задачи. Однако, во многих случаях подобный способ фильтрации весьма эффективен.

Метод медианной фильтрации весьма похож на рассмотренный ранее фильтр «Размытие». Так же, как и в фильтре «Размытие», рассматривается область пикселов, находится среднее значение, и значение центрального пиксела заменяется на найденное среднее. Отличие состоит в том, как находится среднее значение. Если в фильтре «Размытие» среднее значение определяется как среднее арифметическое яркости всех пикселов, то в медианном фильтре просто помещают значения яркости всех пикселов рассматриваемого фрагмента изображения в линейный массив или список, сортируют получившийся набор и берут значение, оказавшееся в середине отсортированной последовательности. Возможны различные варианты зоны рассматриваемых пикселов, например в виде квадрата или креста. Процесс медианной фильтрации изображен на рис. 27. Тестируемый пиксел замещается медианным значением (взятым из центра) упорядоченной последовательности, поэтому, если он содержал пиковое значение, то оно замениться на нечто более среднее. При этом величина пикового значения не учитывается. На рис. 28 показано зашумленное изображение (рис. 24), половина которого обработана с помощью медианного фильтра в Adobe Photoshop.

167

Квадратная зона

Крестообразная зона

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

128

120

108

 

128

120

108

 

 

 

 

 

 

 

 

112

235

98

 

112

235

98

 

 

 

 

 

 

 

 

100

80

85

 

100

80

85

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

80, 85, 98, 100, 108 , 112, 120, 128, 235

80, 98, 112 , 120, 235

Рис. 27. Алгоритм медианного фильтра удаления шума

Рис. 28. Действие медианного фильтра удаления шума

Достоинство метода в его простоте и эффективном удалении импульсного шума. Недостаток — некоторое размытие изображения: в медианном фильтре отсутствует этап выявления шумового элемента, поэтому преобразованию подвергаются все пикселы и возникает размытие. Медианный метод может быть использован в сочетании с энтропийным методом определения шумового пиксела. В этом методе можно «поиграть» размером и формой зоны охвата пикселов.

Для установки фильтра CDeNoise в меню программы добавили соответствующую команду, обработчик которой поместили в класс документа — метод CBMDoc::OnEditDenoise(), а для настройки параметров фильтра специальный диалог CDeNoiseDlg, шаблон которого показан на рис. 29.

168

Рис. 29. Шаблон диалога настройки фильтра удаления шума

Кстати сказать, в компьютерной графике популярна и задача генерации шума.

6.13 Применение фильтров

Теперь, когда мы так много узнали о фильтрах и их внутреннем устройстве, можем использовать их со знанием дела. Например, прежде чем искать контуры рисунка, можно сначала выполнить его размытие — это уберет слабый «шум», незаметный при нормальном просмотре, но проявляющийся при выделении контуров; найденные контуры можно усилить фильтром «Четкость», затем использовать фильтр «Инверсия» и получить окончательный результат:

169

.

Рис. 30. Половина изображения последовательно обработана несколькими фильтрами

Полученное изображение можно использовать, например, с целью векторизации контуров.

6.14 Вывод изображений на печать

Вполне возможно, что у пользователя возникнет желание увековечить свое творение в твердой копии, то есть распечатать. Однако, выполнив команду File | Print Preview, пользователь увидит, что вся красота сжалась до размеров почтовой марки:

170

Рис. 31. Красота сжалась до размеров почтовой марки

Но мы-то знаем, в чем причина: в программе же BMViewer облики работают в режиме отображения MM_TEXT (метод CBMView::OnUpdate()). Это нас вполне устраивает, так как один пиксел экрана соответствует одному пикселу изображения, однако не приемлемо при печати. Решить проблему можно путем масштабирования размеров картинки перед отправкой на принтер. Для этого переопределим в классе облика CBMView виртуальный метод CView::OnPrint():

void CBMView::OnPrint(CDC* pDC, CPrintInfo* pInfo) {// Разрешение устройства

int DXRes=pDC->GetDeviceCaps(LOGPIXELSX); int DYRes=pDC->GetDeviceCaps(LOGPIXELSY);

CBMDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

CRaster* pCurPic=pDoc->GetCurrentBMPtr(); if(pCurPic==NULL) return;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]