Допомога у написанні освітніх робіт...
Допоможемо швидко та з гарантією якості!

Программа фільтрації шумов

РефератДопомога в написанніДізнатися вартістьмоєї роботи

Текущем пикселе на середню яскравість, вирахувану з його 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. Результат інверсії зображення.

Показати весь текст
Заповнити форму поточною роботою