computer-vision Samouczek
Rozpoczęcie pracy z wizją komputerową
Szukaj…
Uwagi
Cyfrowe przetwarzanie obrazu i widzenie komputerowe jest interesującą dziedziną, ponieważ jest pięknie położone między matematyką a informatyką. Dlatego bardzo pomocne jest zrozumienie podstaw i zastosowanie ich przy użyciu programowania w celu zrozumienia tematu.
Obrazy cyfrowe to dyskretyzacja sygnałów 2 lub 3 wymiarowych. Innymi słowy, obrazy cyfrowe są próbkowanymi zestawami pikseli lub wokseli ciągłych domen.
f : R² ⊃ Ω → R
Gdzie f jest obrazem cyfrowym powyżej Ω: Prostokątna domena obrazu
Dla uproszczenia omówimy tylko dwuwymiarowe obrazy cyfrowe, takie jak te z naszych awatarów StackOverflow.
Informacje o pikselach: Szybki komentarz na temat wartości pikseli, zanim zaczniemy omawiać typy obrazów. Zasadniczo piksele zaczynają się od wartości 0, która oznacza brak światła (czarny), osiąga 1, maksymalną intensywność (np. Biały) i są reprezentowane w liczbach całkowitych.
Obrazy binarne: Obrazy tylko czarno-białe. Każdy piksel ma wartość 0 lub 1, każdy piksel może być reprezentowany przez bit. Nie są one bardzo popularne, ponieważ są powszechnie stosowane w aplikacjach naukowych lub do innych operacji przetwarzania obrazu, na przykład jako maska.
Przykład obrazu binarnego. (Ostrzeżenie, że wartości pikseli obrazu w tym pliku niekoniecznie są binarne, służy to do celów demonstracyjnych, również Lena, gwiazda świata przetwarzania obrazów)
Obrazy w skali szarości: Dzięki filtrom internetowym wszyscy nadal dobrze znają te obrazy. Te obrazy mają na ogół jeden bajt na piksel, przy czym 0 oznacza kolor czarny, a 255 kolor biały, wszystko pomiędzy to inny odcień szarości, biorąc pod uwagę, że ludzie potrafią odróżnić tylko 40 odcieni szarości, zakres ten jest wystarczający dla wielu aplikacji (zwróć uwagę, że wartości pikseli tutaj jest mapowanych od 0 do 1 na wartości bajtów 0 - 255)
Kolorowe obrazy: wreszcie najbardziej popularny typ obrazów cyfrowych, kolorowe obrazy. Musimy tu wspomnieć o koncepcji kanałów. Obrazy cyfrowe również mają kanały, w rzeczywistości opisane powyżej obrazy binarne i w skali szarości również mają kanały. Najczęstszym opisem byłby model RGB (czerwono-zielono-niebieski), w takim przypadku obraz ma 3 kanały (nie myl go z wymiarami, to wciąż obrazy 2D), aby opisać zaczerwienienie, błękit i zieleń obrazu. W tym przypadku każdy piksel jest tripletem, o wartości od 0 do 255 (brak czerwonego do najbardziej czerwonego), 0 do 255 (brak zielonego do najbardziej zielonego), 0 - 255 (brak niebieskiego do najbardziej niebieskiego). W tym modelu piksel {0,0,0} jest czarny, {255,255,255} jest biały, {255,0,0} jest czerwony, {255, 255, 0} jest żółty. Jednak kolor jest bardzo szerokim tematem i można sprawdzić odniesienia, aby uzyskać więcej informacji.
Obrazy hiper-spektralne:
Po omówieniu kanałów łatwiej jest mówić o obrazach hiper spektralnych. Te obrazy mogą mieć setki kanałów i są powszechnie stosowane w mikroskopii, obrazowaniu satelitarnym itp.
Odczyty
Próbkowanie sygnałów: https://en.wikipedia.org/wiki/Sampling_(signal_processing)
Biblia cyfrowego przetwarzania obrazu: RC Gonzalez, RE Woods: Cyfrowe przetwarzanie obrazu. Trzecie wydanie, Pearson Prentice Hall, Upper Saddle River, 2008.
Przegląd wizji komputera (do głębokiego uczenia się): R. Szeliski: Wizja komputera: algorytmy i zastosowania. Springer, Nowy Jork, 2010.
Aby zrozumieć binarne, w skali szarości, kolorowe obrazy: https://en.wikipedia.org/wiki/Grayscale
Instalacja lub konfiguracja
Szczegółowe instrukcje dotyczące konfiguracji lub instalacji wizji komputerowej.
W tym i następnych seriach wizji komputerowej będę używać języka Python 2 jako języka programowania. Python jest powszechnym wyborem dla społeczności naukowej, jest bezpłatny, ma wiele bibliotek do darmowego i open-source, a jeśli dopiero zaczynasz programować, jest to jedna z najprostszych do nauczenia się i rozpoczęcia programowania.
Teraz skonfiguruj, jeśli używasz Linuksa, prawdopodobnie masz już Pythona, po prostu otwórz terminal i wpisz „python”, aby sprawdzić, czy wszystko już działa. Inni mogą sprawdzić ten link i pobrać Python 2.7.
Po drugie, będziemy musieli zainstalować biblioteki, których będziemy używać w kodzie źródłowym. Teraz uwaga tutaj, ta konfiguracja została zaprojektowana dla tego przykładu, w późniejszych etapach dodamy różne biblioteki i, oczywiście, różne aplikacje do wizji komputerowej mogą wymagać określonych bibliotek, takich jak OpenCV. Będziemy potrzebować tylko jednej biblioteki do zainstalowania w naszym systemie, aby uruchomić kod. Podczas używania Pythona generalnie instaluję zależności za pomocą 'pip'. Jest to proste narzędzie do instalacji modułów Pythona, możesz je również sprawdzić za pomocą tego linku
Teraz jesteśmy gotowi zainstalować potrzebną bibliotekę, PyPNG. Jeśli używasz pip, wszystko co musisz zrobić, to
pip zainstaluj PyPNG
w terminalu, jeśli używasz systemu Linux / Mac, w wierszu polecenia, jeśli używasz systemu Windows.
Ponadto do tego ćwiczenia musisz uzyskać obrazy, które można znaleźć w linku github obok kodu źródłowego i notesów ipython.
https://github.com/Skorkmaz88/compvis101
Teraz powinniśmy dobrze ćwiczyć
Przykłady
Jest to bardzo prosta seria ćwiczeń do przetwarzania obrazów i wizji komputerowej w języku Python, zaprojektowana z myślą o wprowadzeniu tych tematów przy odrobinie praktyczności. Z góry przepraszam za błędy w debiucie, wciąż jest w fazie rozwoju. W tej serii będę ograniczać obrazy cyfrowe, których możemy użyć, do plików PNG ze względu na prostotę, co również omówię temat kompresji obrazu.
Sklonuj repozytorium, jeśli jeszcze tego nie zrobiłeś, lub możesz po prostu pobrać go tutaj za pośrednictwem Github:
git clone https://github.com/Skorkmaz88/compvis101
Istnieją dwa pliki, z których możesz korzystać, jeden z nich to tutorial0.py, a drugi to ReadingImages.ipynb, drugi to notatnik ipython, jeśli wolisz, możesz to zrobić. Ale dwa pliki robią to samo.
Kod ma wyjaśnienia w komentarzach, jestem
# libs
import png
# We create a greyscale image as described in our text.
# To do that simply, we create a 2D array in python.
# x and y, x being horizontal and y being vertical directions.
x = []
y = []
# Play around with these pixels values to get different grayscale images, they shoud be
# in range of 0 - 255.
white = 255
gray = 128
black = 0
width = 100
height = 300
# Add 100 x 100 rectangle as just white(255) valued pixels
for i in range(0, 100):
for j in range(0,100):
y.append(white); # Pixel (i,j) is being set to a value, rest is coding trick to nest two lists
x.append(y)
y = []
# Add 100 x 100 rectangle as just mid-gray(128) valued pixels
for i in range(0, 100):
for j in range(0,100):
y.append(gray);
x.append(y)
y = []
# Add 100 x 100 rectangle as just black(0) valued pixels
for i in range(0, 100):
for j in range(0,100):
y.append(black);
x.append(y)
y = []
# output image file
f = open('out.png', 'wb')
w = png.Writer(width, height , greyscale=True, bitdepth=8)
w.write(f, x)
f.close()
# If everything went well, you should have 3 vertically aligned rectangles white, gray and black
# Check your working folder
# PART 2
# Read a grayscale image and convert it to binary
# This time we will binarize a grayscale image, to do that we will read pixels and according to threshold we set
# we will decide if that pixel should be white or black
# This file is originally 8 bit png image, can be found in github repository, you should use only this type of
# images if you want to change the image.
f = open('./img/lenaG.png', 'r')
r=png.Reader(file=f)
# You will the details about the image, for now pay attention to size and bitdepth only.
img = r.read()
width = img[0]
height = img[1]
# Threshold value for binarizing images,
threshold = 128
print "Input image size is: "+ str(width)+ " pixels as width, " + str(height) + " pixels as height"
f_out = open('lenaBinary.png', 'wb')
w = png.Writer(width, height , greyscale=True, bitdepth=1)
pixels = img[2]
x = []
y = []
# Let's traverse the Lena image
for row in pixels:
for pixel in row:
p_value = pixel
# Now here we binarize image in pixel level
if p_value > threshold:
p_value = 1
else:
p_value = 0
y.append(p_value);
x.append(y)
y = []
w.write(f_out, x)
f_out.close()
Jeśli wszystko działało dobrze, gratulacje! Utworzyłeś obraz od zera i przeprowadziłeś transformację pierwszego poziomu pikseli na istniejącym obrazie. Sprawdź folder roboczy, aby zobaczyć nowe obrazy


