Przetwarzanie obrazów cyfrowych
Wstęp
Jakiś czas temu wpadło mi w ręce fantastyczne opracowanie Jakuba Szymanowskiego dotyczącego podstaw przetwarzania obrazów: Fundamentals of Image Processing - behind the scenes. Aż przypomniały mi się stare, dobre studenckie czasy, kiedy to byłem maglowany na Przetwarzaniu Obrazów Cyfrowych. Postanowiłem więc stworzyć trochę kodu na podstawie wspomnianego opracowania i spróbować swoich sił w implementacji większości omawianych w nim algorytmów. Tym sposobem powstała biblioteka ImageProcessingLib. Całość dostępna jest jako pojedyncza biblioteka .NET Standard bez żadnych dodatkowych zależności.
Kod oczywiście dostępny jest na moim GitHubie: ImageProcessingLib
Funkcje
W ramach biblioteki dostępne są następujące operacje na obrazach:
- uzupełnienie, przycięcie, wstawianie, zmiana rozmiaru
- odbicie, obroty
-
filtry:
- wykrywanie krawędzi: filtr Laplace'a, Sobela, Prewitta
- filtry liniowe: Gaussa, dolnoprzepustowe, górnoprzepustowe
- filtr medianowy
- filtr Kuwahara
- filtr SDROM
- filtracja kolorów
- konwersja do odcieni szarości oraz do czerni i bieli
- efekty: rysunek olejny, karykatura, szkic węglem, szkic piórem
- operacje morfologiczne: dylatacja, erozja, otwarcie, zamknięcie, szkieletyzacja
- próbkowanie
- akcentowanie
- korekcja gamma
- operacje na histogramie: wyrównywanie, skalowanie, przesuwanie, rozciąganie
- inwersja, negatyw
- kwantyzacja
- sepia
Z użyciem biblioteki możliwe jest również wyznaczenie histogramu, obliczenie dyskretnej transformaty Fouriera, obliczenia wskaźników jakości (MSE i PSNR) oraz dodawania różnego rodzaju szumów. Są dostępne również klasy umożliwiające przeliczanie różnych przestrzeni barw (RGB, CMYK, HSV).
W ramach biblioteki dostępne są 3 rodzaje pikseli: Pixel32 (ARGB), Pixel8 (odcienie szarości) oraz Pixel1 (czerń i biel). Niektóre z wymienionych wyżej operacji są dostępne tylko dla konkretnego typu obrazu (np. operacje morfologiczne dostępne są tylko dla obrazów binarnych).
Krótki opis użycia
Podstawą biblioteki jest klasa Image<> która jest niejako zwykłą kolekcją pikseli. Przykład jej użycia przedstawiono poniżej:
// utworzenie bitmapy z pliku oraz konwersja do obrazu
var inputImagePath = @"inputImage.bmp";
var bitmap = new Bitmap(inputImagePath);
var image = ImageProcessingLibConverter.CreateImageFromBitmap(bitmap);
// zmiana rozmiaru
image.Resize(512, 512, ResizeMethod.BilinearInterpolation);
// obrót i odbicie
image.RotationClockwise()
.FlipHorizontal();
// wyznaczenie histogramu
var histogram = image.Histogram();
// obliczenie dyskretnej transformaty Fouriera
var dft = image.DFT();
// konwersja do obrazu binarnego
var binaryImage = image.CopyAs(p => p.ToPixel1());
// zamknięcie oraz szkieletyzacja
binaryImage.Closing(3)
.Skeletonization();
// konwersja obrazu binarnego z powrotem do obrazu w przestrzeni ARGB, konwersja do bitmapy oraz zapis do pliku
var resultImage = binaryImage.CopyAs(p => p.ToPixel32());
var resultBitmap = ImageProcessingLibConverter.CreateBitmapFromImage(resultImage);
var outputImagePath = @"outputImage.bmp";
resultBitmap.Save(outputImagePath);
Zawartość projektu
W skład solucji wchodzi kilka projektów:
- ImageProcessingLib - główna biblioteka projektu
- ImagesFolder - projekt zawierający przykładowe obrazy
- FIP - projekt zawierający klasę FIP
- Converters - 3 projekty zawierające konwertery umożliwiające przejścia pomiędzy obiektami Image<Pixel32>, Bitmap i BitmapSource
-
Apps
- Benchmarking - szereg testów wydajnościowych, część stworzona z czystej ciekawości, część służąca za wskazówkę w dalszej implementacji biblioteki
- ImageProcessingLibExamples - aplikacja WinForms (w duchu MVP) umożliwiająca przegląd wszystkich funkcji biblioteki
- ImageProcessingLibToFIPComparison - aplikacja służąca do porównania wydajności oraz dokładności wyników uzyskanych z użyciem IPL i FIP
- TestApp.WF i TestApp.WPF - trywialne aplikacje do sprawdzenia poprawności działania konwerterów
Przykłady
Wszystkie funkcje zawarte w bibliotece można uruchomić z użyciem ImageProcessingLibExamples. Efekt działania można zobaczyć na poniższym filmie:
Przykładowe obrazy wynikowe przedstawiono w tabeli poniżej:
Obraz oryginalny | Filtracja kolorów |
Konwersja do odcieni szarości | Rozciąganie histogramu |
Inwersja | Szkic piórem |
Szkieletyzacja | Filtr Sobela |
Użyte biblioteki i zasoby
W ramach projektu użyto następujących bibliotek:
Przykładowe obrazy zaczerpnięto z: http://www.hlevkin.com/06testimages.htm