Программа фильтрации шумовЗадание.Создать программу, осуществляющуюфильтрацию шумов в растровых изображениях методами усредняющего, порогового имедианного фильтров.Программанаписана на языке Object Pascal и выполняется в среде Win32. Общий видпрограммы показан на рис. 1.Рис. 2. Общий вид главного окнапрограммы c загруженным исходным изображением.1.
Усредняющий фильтp.Алгоритм работы усредняющегофильтра заключается в замене значения яркости втекущем пикселе на среднююяркость, вычисленную по его 8 окрестностям, включая и сам элемент. Этот фильтрявляется самым простым. К недостаткам его можно отнести сглаживание ступенчатыхи пилообразных функций. Кроме того пиксели, имеющее существенно отличноезначение яркости и являющимися шумовыми могут вносить значительный вклад врезультат обработки.Реализация фильтра представлена ввиде процедуры
Procedure AverageFilter Value Integer Данная процедура осуществляет алгоритмусредняющего фильтра применительно к объекту TBitmap. В него предварительнодолжна быть загружено изображение Рис. 2 . Результат работы усредняющегофильтра можно увидеть на рис. 3. AverageFilte r var PrevisionLine pByteArray
CurrentLine pByteArray NextLine pByteArray I,J Integer Summ Integer begin if Image1.PixelFormat pf8bitthen begin for I 0 to Image1.Height - 1do begin CurrentLine Image1.I for J 0 to Image1.Width - 1do begin Summ 0 if I gt 0 then begin
PrevisionLine Image1.ScanLine I - 1 if J gt 0 then begin Summ Summ PrevisionLine J - 1 end Summ Summ PrevisionLine J if J 1 lt Image1.Width then begin Summ Summ PrevisionLine J 1 end end if J gt 0 then begin Summ Summ CurrentLine J - 1 end Summ
Summ CurrentLine J if J 1 lt Image1.Width then begin Summ Summ CurrentLine J 1 end if I 1 lt Image1.Image1.ScanLine I 1 if J gt 0 then begin Summ Summ NextLine J - 1 end Summ Summ NextLine J if J 1 lt Image1.Picture.
Bitmap.Width then begin Summ Summ NextLine J 1 end end if Summ div 9 lt Value then CurrentLine J Summ div 9 end end Image1.Image1.Visible True N4.Enabled True end else MessageBox Handle, Такой формат файла пока неподерживается , Слабоват я пока ,MB OK or MB ICONSTOP orMB APPLMODAL end
Рис. 3. Результат работыусредняющего фильтра.2. Пороговый фильтр являетсямодификацией усредняющего, и отличие заключается том, что замена значения яркостина среднее производится только в том случае, если разность между значениемяркости и полученным средним превышает установленный порог. Выбор порогаосуществляется в специальном диалоговом окне Рис. 4 . Для произведенияфильтрации используется процедура
AverageFilter, показанная в пункте 1.Рис. 4.Выбор коэффициентаусреднения порогового фильтра.Рис. 5. Результат работы пороговогофильтра.3. Одномерный медианный фильтрпредставляет собой скользящее окно охватывающее нечетное число элементовизображения. Центральный элемент заменяется медианой элементов изображения вокне. Медианой дискретной последовательности М элементов при нечетном 1называют элемент, для которого существует
М-1 2 элементе меньших или равныхему по величине и М-1 2 элементов больших или равных ему по величине. Медианный фильтр в одних случаяхобеспечивает подавление шума, а в других - вызывает нежелательное подавлениесигнала. Медианный фильтр не влияет на пилообразные и ступенчатые функции, чтообычно является полезным свойством, однако он подавляет импульсные сигналы,длительность которых составляет менее половины ширины окна.
Фильтр такжевызывает уплощение вершины треугольной функции. Возможны различные стратегииприменения медианного фильтра для подавления шумов. Одна из них рекомендуетначинать с медианного фильтра, окно которого охватывает три элементаизображения. Если ослабление сигнала незначительно, то окно расширяется до пятиэлементов. Так поступают до тех пор, пока медианная фильтрация начнет приноситьбольше вреда, чем пользы.
Другая возможность состоит в каскадной медианнойфильтрации сигнала с использованием фиксированной или изменяемой ширины окна. Вобщем случае те области, которые остаются без изменения после однократнойобработки, не меняются и после повторной обработки. Области, в которыхдлительность импульсных сигналов составляет менее половины ширины окна, будутподвергаться изменениям после каждого цикла обработки. Концепцию медианногофильтра можно легко обобщить на два измерения, применяя окно прямоугольной илиблизкой
к круговой формы. Для реализации медианного фильтраиспользуется следующий код procedureTMainForm.N16Caption Размер окна фильтра n
Xn ValueForm.TrackBar1.Min 3 TrackBar1.Max 9 TrackBar1.Frequency 2 ValueForm.Edit1.Image1.PixelFormat pf8bitthen begin for Vert 0 to Image1.Height- 1 do begin
CurrentLine Image1.ScanLine Vert for Hor 0 to Image1.Width -1 do begin Заносим все пиксели окошка в массив Counter 0 for VertB Vert - Value div 2 to Vert Value div 2 do begin if VertB gt 0 and VertB lt Image1.Image1.ScanLine VertB for
HorB Hor - Value div 2 to Hor Value div 2 do begin if HorB gt 0 and VertB gt 0 and HorB lt Image1.Picture.Bitmap.Width and VertB lt Image1.Picture.Bitmap.Height then PixelArray Counter BoxCurrentLine HorB else PixelArray Counter 0 Inc Counter end end Сортируем массив for
VertB 0 to Value Value - 1 do begin for HorB VertB to Value Value - 1 do begin if PixelArray VertB gt PixelArray HorB then begin Temp PixelArray VertB PixelArray VertB PixelArray HorB PixelArray HorB Temp end end end Берем то что посередине и присваиваемтекущему пикселю CurrentLine Hor PixelArray Value Value div 2 1 end end
Image1.Visible False Image1.Visible True N4.Enabled True end else MessageBox Handle, Такой формат файла пока неподдерживается , Слабоват я пока ,MB OK or MB ICONSTOP orMB APPLMODAL end end Результат работы фильтра можноувидеть на рис. 6.Рис. 6. Начало работымедианного фильтра запрос на размер окна фильтра.4.
Заполнение объекта другимцветом.Для упрощения алгоритма слудующаяпроцедура заполняет графические объекты только белым цветом, однако путемпростого добавления диалогового окна с вопросом о цвете заполнения можно добитьсязаполнения объектов любым цветом.procedureTMainForm.Image1MouseDow n Sender TObject Button TMouseButton Shift TShiftState X, Y Integer var TargetPixel Byte
ChangeCount Integer CurrentLine pByteArray PrevLine pByteArray NextLine pByteArray YOffset, XOffset Integer begin if Image1.Picture.Bitmap.PixelFormat pf8bitthen begin Запоминаем значение пиксела на которомщелкнули мышкой TargetPixel pByteArray Image1.Picture.Bitmap.ScanLine
Y X YOffset 0 Пока число замен не станет равным 0двигаемся вверх repeat ChangeCount 0 if Y - YOffset lt 0 then Break Берем линию CurrentLine Image1.Picture.Bitmap.ScanLine Y - YOffset PrevLine Image1.Picture.Bitmap.ScanLine Y -YOffset - 1 if PrevLine X lt gt TargetPixel then Break XOffset 0
Заполняем влево ее пока не дойдем дограницы объекта if X - 1 gt 0 then while CurrentLine X - XOffset - 1 TargetPixel do begin CurrentLine X - XOffset 255 Inc XOffset Inc ChangeCount if X - XOffset - 1 lt 0 then Break end XOffset 0 Заполняем вправо ее пока не дойдем дограницы объекта if X 1 lt Image1.Picture.Bitmap.Width - 1then while CurrentLine
X XOffset 1 TargetPixel do begin CurrentLine X XOffset 255 Inc XOffset Inc ChangeCount if X XOffset 1 gt Image1.Picture.Bitmap.Width - 1 then Break end Inc YOffset until ChangeCount 0 YOffset 1 Пока число замен не станет равным 0двигаемся вниз repeat ChangeCount 0 if Y YOffset gt Image1.Picture.Bitmap.
Width - 1 then Break Берем линию CurrentLine Image1.Picture.Bitmap.ScanLine Y YOffset NextLine Image1.Picture.Bitmap.ScanLine Y YOffset 1 if NextLine X lt gt TargetPixel then Break XOffset 0 Заполняем влево ее пока не дойдем дограницы объекта if X - 1 gt 0 then while CurrentLine X - XOffset - 1 TargetPixel do begin
CurrentLine X - XOffset 255 Inc XOffset Inc ChangeCount if X - XOffset - 1 lt 0 then Break end XOffset 0 Заполняем вправо ее пока не дойдем дограницы объекта if X 1 lt Image1.Picture.Bitmap.Width - 1then while CurrentLine X XOffset 1 TargetPixel do begin CurrentLine X XOffset 255 Inc XOffset Inc ChangeCount if X XOffset 1 gt Image1.Picture.
Bitmap.Width - 1 then Break end Inc YOffset until ChangeCount 0 Image1.Visible False Image1.Visible True end end Результаты работы программы можноувидеть на рис. 8 и 9.Рис. 8. Исходное изображениедля заполнения.Рис. 9. Результат заполнения.5. Инверсия.Ну и напоследок сделаем инверсиюнашего изображения Рис. 10, 11 procedureTMainForm.N7Click Sender TObject var
Line pByteArray I,J Integer Bits Byte begin Bits 1 for I 0 to Image1.Picture.Bitmap.Height - 1do begin Line Image1.Picture.Bitmap.ScanLine I case Image1.Picture.Bitmap.PixelFormat of pf4bit Bits 1 pf8bit Bits 1 pf15bit Bits 2 pf16bit Bits 2 pf24bit Bits 3 pf32bit Bits 4 end for
J 0 to Image1.Picture.Bitmap.Width Bits - 1 do Line J 255 - Line J end Image1.Visible False Image1.Visible True N4.Enabled True end Рис. 10. Исходное изображениедля инверсии.Рис. 11. Результат инверсииизображения.
! |
Как писать рефераты Практические рекомендации по написанию студенческих рефератов. |
! | План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом. |
! | Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач. |
! | Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты. |
! | Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ. |
→ | Виды рефератов Какими бывают рефераты по своему назначению и структуре. |