Программа фільтрації шумов
Текущем пикселе на середню яскравість, вирахувану з його 8 околицях, зокрема й сам елемент. Цей фільтр є простим. До вад може бути віднести згладжування східчастих і пилообразных функцій. З іншого боку пікселі, має істотно чудове значення яскравості та є шумовими можуть вносити значний внесок у результат обробки. Ця процедура здійснює алгоритм усредняющего фільтра стосовно об'єкту TBitmap… Читати ще >
Программа фільтрації шумов (реферат, курсова, диплом, контрольна)
Программа фільтрації шумів.
Задание.
Создать програму, яка здійснює фільтрацію шумів в растрових зображеннях методами усредняющего, порогового і медианного фільтрів.
Программа написана мовою 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) = 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. Результат інверсії зображення.