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:

lenaObraz oryginalny lenaFiltracja kolorów
lenaKonwersja do odcieni szarości lenaRozciąganie histogramu
lenaInwersja lenaSzkic piórem
lenaSzkieletyzacja lenaFiltr 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