Программа фільтрації шумов
Створити програму, яка здійснює фільтрацію шумів в растрових зображеннях. Зміни після однократної обробки, не змінюються, й після повторної обробки. Половини ширини вікна. Фільтр також викликає сплощення вершини трикутною. Кольорі заповнення можна домогтися заповнення об'єктів будь-яким цветом. Медианный фільтр тільки в випадках забезпечує придушення шуму, а інших; Якщо різницю між значенням… Читати ще >
Программа фільтрації шумов (реферат, курсова, диплом, контрольна)
Программа фільтрації шумов.
Задание.
Створити програму, яка здійснює фільтрацію шумів в растрових зображеннях.
методами усредняющего, порогового і медианного фильтров.
Програма написана мовою Object Pascal і виконується серед Win32. Загальний вид.
програми показаний на рис. № 1.
Рис. № 2. Загальний вид головного вікна програми з загруженным вихідним изображением.
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 92621.Picture.Bitmap.PixelFormat = pf8bit then.
begin.
for I := 0 to 92621.Picture.Bitmap.Height — 1 do.
begin.
CurrentLine := 92621.Picture.Bitmap.ScanLine[I];
for J := 0 to 92621.Picture.Bitmap.Width — 1 do.
begin.
Summ := 0;
if I > 0 then.
begin.
PrevisionLine := 92621.Picture.Bitmap.ScanLine[I — 1];
if J > 0 then.
begin.
Summ := Summ + PrevisionLine^[J — 1];
end;
Summ := Summ + PrevisionLine^[J];
if J + 1 < 92621.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 < 92621.Picture.Bitmap.Width then>
begin.
Summ := Summ + CurrentLine^[J + 1];
end;
if I + 1 < 92621.Picture.Bitmap.Height then>
begin.
NextLine := 92621.Picture.Bitmap.ScanLine[I + 1];
if J > 0 then.
begin.
Summ := Summ + NextLine^[J — 1];
end;
Summ := Summ + NextLine^[J];
if J + 1 < 92621.Picture.Bitmap.Width then>
begin.
Summ := Summ + NextLine^[J + 1];
end;
end;
if (Summ divx 9).
CurrentLine^[J] := Summ divx 9;
end;
end;
92621.Visible := False;
92621.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 92621.Picture.Bitmap.PixelFormat = pf8bit then.
begin.
for Vert := 0 to 92621.Picture.Bitmap.Height — 1 do.
begin.
CurrentLine := 92621.Picture.Bitmap.ScanLine[Vert];
for Hor := 0 to 92621.Picture.Bitmap.Width — 1 do.
begin.
// Заносимо все пікселі віконця в массив.
Counter := 0;
for VertB := (Vert — (Value divx 2)) to (Vert + (Value divx 2)) do.
begin.
if (VertB >= 0) and (VertB < 92621.Picture.Bitmap.Height) then>
BoxCurrentLine := 92621.Picture.Bitmap.ScanLine[VertB];
for HorB := (Hor — (Value divx 2)) to (Hor + (Value divx 2)) do.
begin.
if (HorB >= 0) and (VertB >= 0) and.
(HorB < 92621.Picture.Bitmap.Width) and>
(VertB < 92621.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) divx 2) + 1];
end;
end;
92621.Visible := False;
92621.Visible := True;
N4.Enabled := True;
end.
else.
MessageBox (Handle, «Такий формат файла доки підтримується… » ,.
" Слабенький поки що… ", MB_OK or MB_ICONSTOP or MB_APPLMODAL);
end;
end;
Результат роботи фільтра помітні на рис. № 6.
Рис. № 6. Початок роботи медианного фільтра — запит на розмір вікна фильтра.
4. Заповнення об'єкта іншим цветом.
Для спрощення алгоритму слудующая процедура заповнює графічні об'єкти лише.
білим кольором, проте шляхом простого додавання діалогового вікна з аналогічним запитанням про.
кольорі заповнення можна домогтися заповнення об'єктів будь-яким цветом.
procedure TMainForm.9262_1MouseDown (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 92621.Picture.Bitmap.PixelFormat = pf8bit then.
begin.
// Запам’ятовуємо значення пиксела у якому клацнули мышкой.
TargetPixel := pByteArray (92621.Picture.Bitmap.ScanLine[Y])^[X];
YOffset := 0;
// Поки число замін стане рівним 0 рухаємося вверх.
repeat.
ChangeCount := 0;
if Y — YOffset < 0 then>
Break;
// Беремо линию.
CurrentLine := 92621.Picture.Bitmap.ScanLine[Y — YOffset];
PrevLine := 92621.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 < 92621.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 > 92621.Picture.Bitmap.Width — 1 then.
Break;
end;
Inc (YOffset);
until ChangeCount = 0;
YOffset := 1;
// Поки число замін стане рівним 0 рухаємося вниз.
repeat.
ChangeCount := 0;
if Y + YOffset > 92621.Picture.Bitmap.Width — 1 then.
Break;
// Беремо линию.
CurrentLine := 92621.Picture.Bitmap.ScanLine[Y + YOffset];
NextLine := 92621.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 < 92621.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 > 92621.Picture.Bitmap.Width — 1 then.
Break;
end;
Inc (YOffset);
until ChangeCount = 0;
92621.Visible := False;
92621.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 92621.Picture.Bitmap.Height — 1 do.
begin.
Line := 92621.Picture.Bitmap.ScanLine[I];
case 92621.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 92621.Picture.Bitmap.Width * Bits — 1 do.
Line^[J] := 255 — Line^[J];
end;
92621.Visible := False;
92621.Visible := True;
N4.Enabled := True;
end;
Рис. № 10. Вихідний зображення для инверсии.
Рис. № 11. Результат інверсії изображения.