Название: Программа фильтрации шумов
Вид работы: реферат
Рубрика: Информатика
Размер файла: 145.9 Kb
Скачать файл: referat.me-131377.docx
Краткое описание работы: Задание. Создать программу, осуществляющую фильтрацию шумов в растровых изображениях методами усредняющего, порогового и медианного фильтров. Программа написана на языке Object Pascal и выполняется в среде Win32. Общий вид программы показан на рис. № 1.
Программа фильтрации шумов
Задание.
Создать программу, осуществляющую фильтрацию шумов в растровых изображениях методами усредняющего, порогового и медианного фильтров.
Программа написана на языке Object Pascal и выполняется в среде Win32. Общий вид программы показан на рис. № 1.
Рис. № 2. Общий вид главного окна программы c загруженным исходным изображением.
1. Усредняющий фильтp.
Алгоритм работы усредняющего фильтра заключается в замене значения яркости в
текущем пикселе на среднюю яркость, вычисленную по его 8 окрестностям, включая и сам элемент. Этот фильтр является самым простым. К недостаткам его можно отнести сглаживание ступенчатых и пилообразных функций. Кроме того пиксели, имеющее существенно отличное значение яркости и являющимися шумовыми могут вносить значительный вклад в результат обработки.
Реализация фильтра представлена в виде процедуры:
Procedure AverageFilter(Value:Integer);
Данная процедура осуществляет алгоритм усредняющего фильтра применительно к объекту TBitmap. В него предварительно должна быть загружено изображение (Рис. № 2). Результат работы усредняющего фильтра можно увидеть на рис. № 3. Параметр Value – порог при котором производятся манипуляции с пикселом.
Procedure TMainForm.AverageFilter;
var
PrevisionLine:pByteArray;
CurrentLine:pByteArray;
NextLine:pByteArray;
I,J:Integer;
Summ:Integer;
begin
if Image1.Picture.Bitmap.PixelFormat = pf8bit then
begin
for I := 0 to Image1.Picture.Bitmap.Height - 1 do
begin
CurrentLine := Image1.Picture.Bitmap.ScanLine[I];
for J := 0 to Image1.Picture.Bitmap.Width - 1 do
begin
Summ := 0;
if I > 0 then
begin
PrevisionLine := Image1.Picture.Bitmap.ScanLine[I - 1];
if J > 0 then
begin
Summ := Summ + PrevisionLine^[J - 1];
end;
Summ := Summ + PrevisionLine^[J];
if J + 1 < Image1.Picture.Bitmap.Width then
begin
Summ := Summ + PrevisionLine^[J + 1];
end;
end;
if J > 0 then
begin
Summ := Summ + CurrentLine^[J - 1];
end;
Summ := Summ + CurrentLine^[J];
if J + 1 < Image1.Picture.Bitmap.Width then
begin
Summ := Summ + CurrentLine^[J + 1];
end;
if I + 1 < Image1.Picture.Bitmap.Height then
begin
NextLine := Image1.Picture.Bitmap.ScanLine[I + 1];
if J > 0 then
begin
Summ := Summ + NextLine^[J - 1];
end;
Summ := Summ + NextLine^[J];
if J + 1 < Image1.Picture.Bitmap.Width then
begin
Summ := Summ + NextLine^[J + 1];
end;
end;
if (Summ div 9) <= Value then
CurrentLine^[J] := Summ div 9;
end;
end;
Image1.Visible := False;
Image1.Visible := True;
N4.Enabled := True;
end
else
MessageBox(Handle,'Такой формат файла пока не подерживается...',
'Слабоват я пока...',MB_OK or MB_ICONSTOP or MB_APPLMODAL);
end;
Рис. № 3. Результат работы усредняющего фильтра.
2. Пороговый фильтр.
Пороговый фильтр является модификацией усредняющего, и отличие заключается
том, что замена значения яркости на среднее производится только в том случае, если разность между значением яркости и полученным средним превышает установленный порог. Выбор порога осуществляется в специальном диалоговом окне (Рис. 4). Для произведения фильтрации используется процедура AverageFilter, показанная в пункте 1.
Рис. № 4.Выбор коэффициента усреднения порогового фильтра.
Рис. № 5. Результат работы порогового фильтра.
3. Медианный фильтр.
Одномерный медианный фильтр представляет собой скользящее окно охватывающее нечетное число элементов изображения. Центральный элемент заменяется медианой элементов изображения в окне. Медианой дискретной последовательности М элементов при нечетном 1 называют элемент, для которого существует (М-1)/2 элементе меньших или равных ему по величине и (М-1)/2 элементов больших или равных ему по величине.
Медианный фильтр в одних случаях обеспечивает подавление шума, а в других - вызывает нежелательное подавление сигнала. Медианный фильтр не влияет на пилообразные и ступенчатые функции, что обычно является полезным свойством, однако он подавляет импульсные сигналы, длительность которых составляет менее половины ширины окна. Фильтр также вызывает уплощение вершины треугольной функции.
Возможны различные стратегии применения медианного фильтра для подавления шумов. Одна из них рекомендует начинать с медианного фильтра, окно которого охватывает три элемента изображения. Если ослабление сигнала незначительно, то окно расширяется до пяти элементов. Так поступают до тех пор, пока медианная фильтрация начнет приносить больше вреда, чем пользы. Другая возможность состоит в каскадной медианной фильтрации сигнала с использованием фиксированной или изменяемой ширины окна. В общем случае те области, которые остаются без изменения после однократной обработки, не меняются и после повторной обработки. Области, в которых длительность импульсных сигналов составляет менее половины ширины окна, будут подвергаться изменениям после каждого цикла обработки. Концепцию медианного фильтра можно легко обобщить на два измерения, применяя окно прямоугольной или близкой к круговой формы.
Для реализации медианного фильтра используется следующий код:
procedure TMainForm.N16Click(Sender: TObject);
var
PixelArray:array of Byte;
Value:Byte;
CurrentLine:pByteArray;
BoxCurrentLine:pByteArray;
Vert,Hor:Integer;
VertB,HorB:Integer;
Counter:Integer;
Temp:Byte;
begin
ValueForm.Caption := 'Размер окна фильтра n X n';
ValueForm.TrackBar1.Min := 3;
ValueForm.TrackBar1.Max := 9;
ValueForm.TrackBar1.Frequency := 2;
ValueForm.Edit1.ReadOnly := True;
if ValueForm.Execute(Value) then
begin
SetLength(PixelArray,Value*Value);
if Image1.Picture.Bitmap.PixelFormat = pf8bit then
begin
for Vert := 0 to Image1.Picture.Bitmap.Height - 1 do
begin
CurrentLine := Image1.Picture.Bitmap.ScanLine[Vert];
for Hor := 0 to Image1.Picture.Bitmap.Width - 1 do
begin
// Заносим все пиксели окошка в массив
Counter := 0;
for VertB := (Vert - (Value div 2)) to (Vert + (Value div 2)) do
begin
if (VertB >= 0) and (VertB < Image1.Picture.Bitmap.Height) then
BoxCurrentLine := Image1.Picture.Bitmap.ScanLine[VertB];
for HorB := (Hor - (Value div 2)) to (Hor + (Value div 2)) do
begin
if (HorB >= 0) and (VertB >= 0) and
(HorB < Image1.Picture.Bitmap.Width) and
(VertB < 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] > 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 or MB_APPLMODAL);
end;
end;
Результат работы фильтра можно увидеть на рис. № 6.
Рис. № 6. Начало работы медианного фильтра – запрос на размер окна фильтра.
4. Заполнение объекта другим цветом.
Для упрощения алгоритма слудующая процедура заполняет графические объекты только белым цветом, однако путем простого добавления диалогового окна с вопросом о цвете заполнения можно добиться заполнения объектов любым цветом.
procedure TMainForm.Image1MouseDown(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 = pf8bit then
begin
// Запоминаем значение пиксела на котором щелкнули мышкой
TargetPixel := pByteArray(Image1.Picture.Bitmap.ScanLine[Y])^[X];
YOffset := 0;
// Пока число замен не станет равным 0 двигаемся вверх
repeat
ChangeCount := 0;
if Y - YOffset < 0 then
Break;
// Берем линию
CurrentLine := Image1.Picture.Bitmap.ScanLine[Y - YOffset];
PrevLine := Image1.Picture.Bitmap.ScanLine[Y - YOffset - 1];
if PrevLine[X] <> TargetPixel then
Break;
XOffset := 0;
// Заполняем влево ее пока не дойдем до границы объекта
if X - 1 >= 0 then
while CurrentLine^[X - XOffset - 1] = TargetPixel do
begin
CurrentLine^[X - XOffset] := 255;
Inc(XOffset);
Inc(ChangeCount);
if X - XOffset - 1 < 0 then
Break;
end;
XOffset := 0;
// Заполняем вправо ее пока не дойдем до границы объекта
if X + 1 < Image1.Picture.Bitmap.Width - 1 then
while CurrentLine^[X + XOffset + 1] = TargetPixel do
begin
CurrentLine^[X + XOffset] := 255;
Inc(XOffset);
Inc(ChangeCount);
if X + XOffset + 1 > Image1.Picture.Bitmap.Width - 1 then
Break;
end;
Inc(YOffset);
until ChangeCount = 0;
YOffset := 1;
// Пока число замен не станет равным 0 двигаемся вниз
repeat
ChangeCount := 0;
if Y + YOffset > 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] <> TargetPixel then
Break;
XOffset := 0;
// Заполняем влево ее пока не дойдем до границы объекта
if X - 1 >= 0 then
while CurrentLine^[X - XOffset - 1] = TargetPixel do
begin
CurrentLine^[X - XOffset] := 255;
Inc(XOffset);
Inc(ChangeCount);
if X - XOffset - 1 < 0 then
Break;
end;
XOffset := 0;
// Заполняем вправо ее пока не дойдем до границы объекта
if X + 1 < Image1.Picture.Bitmap.Width - 1 then
while CurrentLine^[X + XOffset + 1] = TargetPixel do
begin
CurrentLine^[X + XOffset] := 255;
Inc(XOffset);
Inc(ChangeCount);
if X + XOffset + 1 > 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):
procedure TMainForm.N7Click(Sender: TObject);
var
Line:pByteArray;
I,J:Integer;
Bits:Byte;
begin
Bits := 1;
for I :=0 to Image1.Picture.Bitmap.Height - 1 do
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. Результат инверсии изображения.
Похожие работы
-
Логические задачи на языке программирования Prolog
http://monax.ru/order/ - рефераты на заказ (более 2300 авторов в 450 городах СНГ). Логические задачи на языке программирования Prolog Задание 1. Ввести предложенный текст программы, реализовать ее и записать на диск.
-
Определение связанного множества пикселей на бинарном изображении
Кандидат наук Головко А.В. Национальный институт кораблестроения г. Николаева Определение связанного множества пикселей на бинарном изображении
-
Расчет переходных процессов в Гидравлике
Расчет переходных процессов в Гидравлике Министерство образования Республики Беларусь Гомельский государственный технический университет им. П.О. Сухого
-
Использование Prolog совместно с другими ЯП
Понятие Dll. Вспомним процесс программирования в DOS. Преобразование исходного текста в машинный код включал в себя 2 процесса: компиляцию и линковку. Во время линковки в код программы помещались не только объявления функций и процедур, но и их полный код.
-
Базы данных торговой фирмы
Содержание Введение...................................................................................................................... 3
-
Знакомство с интерфейсом интегрированной среды разработки Delphi. Создание и запуск приложения
Слободской государственный колледж педагогики и социальных отношений Дисциплина: Основы объектно-ориентрованного программирования Лабораторная работа
-
Графика на ПЭВМ
Графика на ПК 1) Растровая и векторная графика. 2) Графические редакторы. 3) Форматы файлов для хранения растровых графических изображений. 1)Все создаваемые с помощью компьютера изображения можно разделить на две большие части – растровую и векторную графику. Растровые изображения представляют собой однослойную сетку точек, называемых пикселами, каждая из которых может иметь определенный цвет.
-
Программа решения трансцендентного уравнения на языке Pascal
Министерство науки и образования РТ Казанский Государственный Технический Университет имени А.Н. Туполева Отчёт по расчетно-графической работ Выполнил студент гр. 3108
-
Использование COM-объектов в хранимых процедурах SQL Server
Использование COM-объектов в хранимых процедурах SQL Server Рассмотрим, например, ситуацию, когда хранимая процедура по входному параметру паролю брала бы его MD5 значение и заносила полученное значение в таблицу.
-
Разработка программы на языке высокого уровня Паскаль
Лабораторная работа «Разработка программы на языке высокого уровня Паскаль» Цель и задачи работы Освоить основные приемы алгоритмизации и составления программ на языке высокого уровня Паскаль.