image — wizja maszynowa

Moduł image jest sercem stosu wizji maszynowej OpenMV. Udostępnia klasę Image – bufor pikseli w pamięci, na którym operuje każda procedura rysowania, filtrowania, transformacji i ekstrakcji cech – wraz z pomocniczymi obiektami wyników zwracanymi przez te procedury (Blob, Line, Circle, Rect, QRCode, AprilTag, DataMatrix, BarCode, …) oraz klasami pomocniczymi służącymi do ich konfiguracji (Threshold, Histogram, Statistics, HaarCascade, Similarity, Percentile, Displacement, ImageIO).

Pozyskiwanie obrazu

Istnieją cztery sposoby umieszczenia obiektu Image w pamięci RAM:

  • Przechwytywanie na żywo z sensora kamery. Wywołaj csi.CSI.snapshot(), aby przechwycić następną ramkę bezpośrednio do bufora ramki; zwrócony obiekt Image odwołuje się do tego bufora.

  • Z pliku. Przekaż ścieżkę do konstruktora Image (image.Image("/sd/photo.jpg")); obsługiwane formaty na dysku to BMP, PPM/PGM, JPEG, PNG oraz format nagrywania OpenMV ImageIO.

  • Z ndarray. Przekaż do konstruktora Image tablicę ndarray typu float32 o kształcie (h, w) lub (h, w, 3). Piksele są skalowane z zakresu 0.0 -- 255.0 odpowiednio do obrazu GRAYSCALE lub RGB565. Użyj tego, aby przenieść tensor wyjściowy z ml (lub dowolnego potoku ulab) z powrotem do obrazu, na którym można rysować.

  • Pusty bufor. Skonstruuj obiekt Image o zadanym rozmiarze i formacie pikseli (image.Image(320, 240, image.RGB565)), aby rysować na nim od zera lub używać go jako powierzchni roboczej do operacji arytmetycznych na obrazach.

Formaty pikseli

Każdy obiekt Image ma jeden z poniższych formatów pikseli; wybór jest kompromisem między zużyciem pamięci, kosztem przetwarzania a tym, jakie algorytmy mogą na nim działać. Użyj BINARY, GRAYSCALE, RGB565, BAYER, YUV422, JPEG lub PNG jako argumentu pixformat podczas konstruowania obrazu lub konfigurowania sensora kamery:

  • BINARY (1 bpp) – jeden bit na piksel. Najmniejszy format; używany wewnętrznie przez procedury progowania i morfologii, ale rzadko przechwytywany bezpośrednio z sensora.

  • GRAYSCALE (8 bpp) – jeden bajt na piksel (kanał Y z YUV422). Najszybszy format dla większości algorytmów wizji komputerowej (AprilTag, wykrywanie krawędzi, przepływ optyczny).

  • RGB565 (16 bpp) – dwa bajty na piksel, 5-bitowy czerwony / 6-bitowy zielony / 5-bitowy niebieski. Domyślny format kolorowy.

  • BAYER (8 bpp) – surowe dane kolorowe wzorca Bayera prosto z sensora. Przydatne do niestandardowego demozaikowania lub do przechowywania większej liczby pikseli w mniejszej ilości pamięci przed debayeringiem na żądanie.

  • YUV422 (16 bpp) – kolor z podpróbkowaniem chrominancji 4:2:2, dwa bajty na piksel. Przydatne, gdy chcesz stosować algorytmy specyficzne dla chrominancji bez ponoszenia pełnego kosztu RGB.

  • JPEG / PNG – skompresowane bufory. Najlepsze do przechowywania i transmisji sieciowej. Operacje na poziomie pikseli wymagają najpierw Image.to_grayscale() lub Image.to_rgb565().

Praca z wynikami

Metody wykrywania / ekstrakcji cech klasy Image zwracają obiekty, które możesz iterować i łączyć – wywołanie Image.find_blobs() zwraca listę obiektów Blob, wywołanie Image.find_apriltags() zwraca listę obiektów AprilTag itd. Każda klasa wyniku udostępnia geometryczne właściwości wykrycia (centroid, ramkę ograniczającą, pole, wartość kodu itd.), dzięki czemu możesz działać na nich bezpośrednio lub przekazać je z powrotem do metod rysowania (Image.draw_rectangle(), Image.draw_string(), …).

Funkcje pomocnicze przestrzeni barw

Moduł udostępnia także małe czyste funkcje do konwersji pojedynczych wartości pikseli pomiędzy przestrzeniami barw binary / grayscale / RGB / LAB / YUV. Są przydatne, gdy potrzebujesz przekonwertować wartości progów lub wpisy palety w Pythonie przed przekazaniem ich do operacji na obrazach – do konwersji całego obrazu użyj metod to_* klasy Image, które są znacznie szybsze niż wywoływanie tych funkcji pomocniczych w pętli.

Klasy

Funkcje

Funkcje pomocnicze konwersji przestrzeni barw

Każda z poniższych funkcji X_to_Y wykonuje pojedynczą konwersję wartości piksela. Wszystkie przyjmują/zwracają wartości w kanonicznych zakresach OpenMV:

  • binary – int 0 – 1.

  • grayscale – int 0 – 255.

  • RGB – krotka (r, g, b) 8-bitowych liczb całkowitych (każda 0 – 255).

  • LAB – krotka (l, a, b), gdzie L mieści się w zakresie 0 – 100, a A/B w zakresie -128 – 127.

  • YUV – krotka (y, u, v), gdzie Y mieści się w zakresie 0 – 255, a U/V w zakresie -128 – 127.

Do konwersji całego obrazu użyj metod to_* klasy Image, które są znacznie szybsze niż wywoływanie tych funkcji pomocniczych w pętli.

image.binary_to_grayscale(value: int) int

Konwertuje wartość binarną na wartość w skali szarości.

image.binary_to_rgb(value: int) Tuple[int, int, int]

Konwertuje wartość binarną na krotkę RGB.

image.binary_to_lab(value: int) Tuple[int, int, int]

Konwertuje wartość binarną na krotkę LAB.

image.binary_to_yuv(value: int) Tuple[int, int, int]

Konwertuje wartość binarną na krotkę YUV.

image.grayscale_to_binary(value: int) int

Konwertuje wartość w skali szarości na wartość binarną.

image.grayscale_to_rgb(value: int) Tuple[int, int, int]

Konwertuje wartość w skali szarości na krotkę RGB.

image.grayscale_to_lab(value: int) Tuple[int, int, int]

Konwertuje wartość w skali szarości na krotkę LAB.

image.grayscale_to_yuv(value: int) Tuple[int, int, int]

Konwertuje wartość w skali szarości na krotkę YUV.

image.rgb_to_binary(value: Tuple[int, int, int]) int

Konwertuje krotkę RGB na wartość binarną.

image.rgb_to_grayscale(value: Tuple[int, int, int]) int

Konwertuje krotkę RGB na wartość w skali szarości.

image.rgb_to_lab(value: Tuple[int, int, int]) Tuple[int, int, int]

Konwertuje krotkę RGB na krotkę LAB.

image.rgb_to_yuv(value: Tuple[int, int, int]) Tuple[int, int, int]

Konwertuje krotkę RGB na krotkę YUV.

image.lab_to_binary(value: Tuple[int, int, int]) int

Konwertuje krotkę LAB na wartość binarną.

image.lab_to_grayscale(value: Tuple[int, int, int]) int

Konwertuje krotkę LAB na wartość w skali szarości.

image.lab_to_rgb(value: Tuple[int, int, int]) Tuple[int, int, int]

Konwertuje krotkę LAB na krotkę RGB.

image.lab_to_yuv(value: Tuple[int, int, int]) Tuple[int, int, int]

Konwertuje krotkę LAB na krotkę YUV.

image.yuv_to_binary(value: Tuple[int, int, int]) int

Konwertuje krotkę YUV na wartość binarną.

image.yuv_to_grayscale(value: Tuple[int, int, int]) int

Konwertuje krotkę YUV na wartość w skali szarości.

image.yuv_to_rgb(value: Tuple[int, int, int]) Tuple[int, int, int]

Konwertuje krotkę YUV na krotkę RGB.

image.yuv_to_lab(value: Tuple[int, int, int]) Tuple[int, int, int]

Konwertuje krotkę YUV na krotkę LAB.

Deskryptory cech

image.HaarCascade(path: str, stages: int = -1) Cascade

Wczytuje kaskadę Haara i zwraca uchwyt Cascade do użycia z Image.find_features().

path może być jednym z dwóch:

  • literalnym łańcuchem "frontalface" lub "eye", aby wczytać jedną z dwóch kaskad wbudowanych w pamięć ROM oprogramowania układowego, albo

  • ścieżką w systemie plików do niestandardowego pliku binarnego .cascade wytworzonego przez narzędzia konwertera kaskad OpenMV.

stages wybiera, ile etapów kaskady ma zostać przetworzonych w czasie wykrywania. Wartość -1 używa każdego etapu zapisanego w pliku. Zmniejszenie tej wartości przyspiesza wykrywanie kosztem większej liczby fałszywych trafień.

image.load_descriptor(path: str) kp_desc | lbp_desc

Wczytuje deskryptor z pliku w ścieżce path i zwraca go. Wewnętrzny znacznik typu pliku decyduje, która klasa deskryptora zostanie odtworzona:

image.save_descriptor(descriptor: kp_desc | lbp_desc, path: str) None

Serializuje descriptor (deskryptor punktów kluczowych ORB lub deskryptor LBP) do pliku w ścieżce path w formacie pliku deskryptora OpenMV. Ten sam plik można później ponownie wczytać za pomocą image.load_descriptor().

image.match_descriptor(descriptor0, descriptor1, threshold: int = 85, filter_outliers: bool = False) int | kptmatch

Dopasowuje dwa deskryptory tego samego typu.

  • Dla dwóch deskryptorów LBP – zwraca całkowitą odległość Hamminga między nimi (mniejsza oznacza bliższe dopasowanie).

  • Dla dwóch deskryptorów punktów kluczowych ORB – zwraca obiekt kptmatch opisujący klaster dopasowanych punktów kluczowych lub None, jeśli żadne dopasowanie nie przekroczy progu threshold.

threshold (0 – 100) określa, jak restrykcyjne jest dopasowywanie ORB przy akceptowaniu pary punktów kluczowych. Niższe wartości zaostrzają dopasowywanie, odrzucając słabe dopasowania najbliższych sąsiadów.

filter_outliers włącza odrzucanie wartości odstających w stylu RANSAC w obrębie zbioru dopasowanych punktów kluczowych. Użyj go, gdy oczekujesz pojedynczej sztywnej transformacji między dwoma widokami; wyłącz go, gdy dopasowane punkty kluczowe obejmują wiele obiektów.

Funkcje pomocnicze geometrii plam (blob)

Te funkcje pomocnicze przyjmują obiekt Blob (zwracany przez Image.find_blobs()) i na żądanie obliczają dodatkowe właściwości geometryczne. Znajdują się w zakresie modułu – a nie w Blob – dzięki czemu podstawowa ścieżka find_blobs() nie ponosi ich kosztu, dopóki o nie nie poprosisz.

image.get_solidity(blob: blob) float

Zwraca zwartość (blob.pixels / convex_hull_area) obiektu blob. Liczba zmiennoprzecinkowa, 0 – 1; wartość 1.0 oznacza, że plama całkowicie wypełnia swoją otoczkę wypukłą.

image.get_convexity(blob: blob) float

Zwraca wypukłość (convex_hull_perimeter / blob.perimeter) obiektu blob. Liczba zmiennoprzecinkowa, 0 – 1; wartość 1.0 oznacza idealnie wypukłą plamę.

image.get_major_axis_line(blob: blob) line

Zwraca obiekt Line wzdłuż osi głównej obiektu blob (dłuższej z dwóch osi głównych prostokąta obróconego o minimalnym polu).

image.get_minor_axis_line(blob: blob) line

Zwraca obiekt Line wzdłuż osi pomocniczej obiektu blob (krótszej z dwóch osi głównych prostokąta obróconego o minimalnym polu).

image.get_enclosing_circle(blob: blob) circle

Zwraca obiekt Circle, który otacza obiekt blob.

image.get_enclosed_ellipse(blob: blob) Tuple[int, int, int, int, int]

Zwraca 5-elementową krotkę (cx, cy, a, b, rotation) opisującą elipsę wpisaną w prostokąt obrócony o minimalnym polu wokół obiektu blob:

  • cx / cy – środek elipsy w pikselach (liczba całkowita).

  • a / b – długości półosi w pikselach (liczba całkowita).

  • rotation – obrót elipsy w stopniach (liczba całkowita).

Jest to zwykła krotka, a nie attrtuple, więc pola są dostępne wyłącznie przez indeks.

Stałe

Formaty pikseli

Przekaż dowolną z poniższych wartości jako argument pixformat do konstruktora Image lub do csi.CSI.pixformat().

image.BINARY: int

Bitmapa 1 bit na piksel. Najmniejszy format – używany wewnętrznie przez progowanie i morfologię, rzadko przechwytywany bezpośrednio z sensora.

image.GRAYSCALE: int

Skala szarości 8 bitów na piksel (jeden bajt na piksel). Najszybszy format dla większości algorytmów wizji komputerowej (AprilTag, wykrywanie krawędzi, przepływ optyczny).

image.RGB565: int

Kolor 16 bitów na piksel upakowany jako 5 bitów czerwonego / 6 bitów zielonego / 5 bitów niebieskiego. Domyślny format kolorowy.

image.BAYER: int

Surowe dane Bayera 8 bitów na piksel prosto z sensora. Większość metod przetwarzania obrazu nie jest dostępna dla obrazów Bayera; użyj tego formatu, gdy chcesz debayerować na żądanie lub przechowywać więcej pikseli w mniejszej ilości pamięci.

image.YUV422: int

Kolor z podpróbkowaniem chrominancji 4:2:2, dwa bajty na piksel, upakowane jako Y1, U, Y2, V na parę pikseli. Tylko niektóre metody przetwarzania obrazu działają bezpośrednio na YUV422.

image.JPEG: int

Skompresowany bufor JPEG. Operacje na poziomie pikseli wymagają najpierw Image.to_grayscale() lub Image.to_rgb565().

image.PNG: int

Skompresowany bufor PNG. Operacje na poziomie pikseli wymagają najpierw Image.to_grayscale() lub Image.to_rgb565().

Palety kolorów

Przekaż dowolną z poniższych wartości do Image.to_rainbow(), Image.to_ironbow(), Image.draw_image() (color_palette=) lub do csi.CSI.color_palette(), aby pokolorować obraz w skali szarości.

image.PALETTE_RAINBOW: int

Gładkie tęczowe koło barw. Domyślna paleta OpenMV dla obrazów termicznych.

image.PALETTE_IRONBOW: int

Nieliniowa paleta „ironbow”, która naśladuje wygląd celownika termicznego FLIR Lepton.

image.PALETTE_DEPTH: int

Paleta obrazu głębi. Dostępna tylko w kompilacjach z obsługą sensora głębi (potok ToF – np. OpenMV Cam AE3 lub dowolna kamera z dołączonym modułem ToF Pmod).

image.PALETTE_EVT_DARK: int

Paleta do wizualizacji ramek z kamery zdarzeniowej GENX320 na ciemnym tle. Przekaż ją do csi.CSI.color_palette, aby sterownik GENX320 emitował pokolorowane ramki RGB565 w trybie histogramu, lub do Image.draw_image() color_palette= podczas kolorowania obrazu zdarzeń w skali szarości.

Dostępna tylko w kompilacjach z obsługą GENX320 (OpenMV Cam AE3 oraz moduł GENX320 Pmod).

image.PALETTE_EVT_LIGHT: int

Paleta do wizualizacji ramek z kamery zdarzeniowej GENX320 na jasnym tle. Ten sam mechanizm dyspozycji i dostępność jak PALETTE_EVT_DARK.

Tryby skalowania

Przekaż dowolną z poniższych wartości jako argument hint do Image.draw_image(), Image.scale() lub podobnych metod skalowania.

image.AREA: int

Skaler uśredniający obszary. Używany przy zmniejszaniu; do powiększania używany jest Nearest-Neighbor.

image.BILINEAR: int

Skaler dwuliniowy. Podpróbkuje przy zmniejszaniu.

image.BICUBIC: int

Skaler dwukubiczny. Wyższa jakość niż BILINEAR, ale wolniejszy. Podpróbkuje przy zmniejszaniu.

Wskazówki rysowania / draw_image

Połącz dowolne z tych wartości operacją bitową OR i przekaż jako argument hint metody Image.draw_image().

image.VFLIP: int

Odwraca źródło w pionie podczas rysowania.

image.HMIRROR: int

Odbija źródło w poziomie podczas rysowania.

image.TRANSPOSE: int

Transponuje (zamienia x/y) źródło podczas rysowania.

image.CENTER: int

Centruje źródło na celu. Wszelkie jawne przesunięcia x/y stają się wtedy przesunięciami od środka, a nie od lewego górnego rogu.

image.EXTRACT_RGB_CHANNEL_FIRST: int

Podczas ekstrakcji kanału RGB za pomocą Image.draw_image() wyodrębnia kanał przed skalowaniem. Bez tej wskazówki kanał jest wyodrębniany po skalowaniu.

image.APPLY_COLOR_PALETTE_FIRST: int

Podczas stosowania palety kolorów za pomocą Image.draw_image() stosuje paletę przed skalowaniem. Bez tej wskazówki paleta jest stosowana po skalowaniu.

image.SCALE_ASPECT_KEEP: int

Skaluje źródło tak, aby zmieściło się wewnątrz celu z zachowaniem proporcji (dodaje czarne pasy, gdy proporcje się różnią).

image.SCALE_ASPECT_EXPAND: int

Skaluje źródło tak, aby wypełniło cel z zachowaniem proporcji (przycina, gdy proporcje się różnią).

image.SCALE_ASPECT_IGNORE: int

Skaluje źródło tak, aby wypełniło cel, ignorując proporcje.

image.BLACK_BACKGROUND: int

Informuje ścieżkę mieszania alfa, że cel jest znany jako czarny, dzięki czemu może pominąć odczyt zwrotny piksela celu. Przyspiesza efekty alfa na świeżo wyczyszczonych buforach.

image.ROTATE_90: int

Skrót dla VFLIP | TRANSPOSE (obrót o 90 stopni zgodnie z ruchem wskazówek zegara).

image.ROTATE_180: int

Skrót dla HMIRROR | VFLIP (obrót o 180 stopni).

image.ROTATE_270: int

Skrót dla HMIRROR | TRANSPOSE (obrót o 270 stopni zgodnie z ruchem wskazówek zegara).

Podpróbkowanie JPEG

Przekaż dowolną z poniższych wartości jako argument subsampling do Image.to_jpeg(), Image.compress() lub Image.save() podczas zapisu pliku JPEG.

image.JPEG_SUBSAMPLING_AUTO: int

Automatycznie wybiera podpróbkowanie chrominancji na podstawie ustawienia jakości JPEG.

image.JPEG_SUBSAMPLING_444: int

Wymusza podpróbkowanie chrominancji 4:4:4 (brak kompresji chrominancji).

image.JPEG_SUBSAMPLING_422: int

Wymusza podpróbkowanie chrominancji 4:2:2. Zalecane podczas strumieniowania MJPEG do zewnętrznych odtwarzaczy wideo, które źle obsługują 4:2:0.

image.JPEG_SUBSAMPLING_420: int

Wymusza podpróbkowanie chrominancji 4:2:0.

Dopasowywanie szablonów

Przekaż jedną z poniższych wartości jako argument search do Image.find_template().

image.SEARCH_EX: int

Wyszukiwanie wyczerpujące – ocenia każdą pozycję w ROI. Najwolniejsze, ale gwarantuje znalezienie najlepszego dopasowania.

image.SEARCH_DS: int

Wyszukiwanie diamentowe – wyszukiwanie od zgrubnego do dokładnego, które jest znacznie szybsze niż SEARCH_EX, ale może pominąć globalne optimum w przypadku silnie samopodobnych szablonów.

Wykrywanie krawędzi

Przekaż jedną z poniższych wartości jako argument algorithm do Image.find_edges().

image.EDGE_CANNY: int

Detektor krawędzi Canny’ego – amplituda gradientu + tłumienie niemaksimów + histereza. Wyższa jakość, wolniejszy.

image.EDGE_SIMPLE: int

Detektor krawędzi oparty na progowanym filtrze górnoprzepustowym. Szybszy, ale produkuje grubsze, bardziej zaszumione krawędzie niż EDGE_CANNY.

Detektory narożników ORB

Przekaż jedną z poniższych wartości jako argument corner_detector do Image.find_keypoints().

image.CORNER_FAST: int

Detektor narożników FAST. Szybszy niż CORNER_AGAST, ale mniej dokładny.

image.CORNER_AGAST: int

Detektor narożników AGAST. Wolniejszy niż CORNER_FAST, ale produkuje bardziej stabilne punkty kluczowe.

Rodziny AprilTag

Połącz dowolną kombinację poniższych wartości operacją bitową OR i przekaż jako argument families do Image.find_apriltags(). Każda rodzina jest sterowana własną opcją kompilacji w oprogramowaniu układowym; nieobsługiwane rodziny są nieobecne w czasie wykonywania, a nie zawsze zerowe.

image.TAG16H5: int

Rodzina AprilTag 16h5 (30 unikalnych identyfikatorów, korekcja błędów 0-bitowa).

image.TAG25H9: int

Rodzina AprilTag 25h9 (35 unikalnych identyfikatorów, korekcja błędów do 3 bitów).

image.TAG36H10: int

Rodzina AprilTag 36h10 (2320 unikalnych identyfikatorów, korekcja błędów do 3 bitów).

image.TAG36H11: int

Rodzina AprilTag 36h11 (587 unikalnych identyfikatorów, korekcja błędów do 4 bitów). Najczęściej używana rodzina.

image.TAGCIRCLE21H7: int

Rodzina AprilTag Circle21h7.

image.TAGCIRCLE49H12: int

Rodzina AprilTag Circle49h12.

image.TAGCUSTOM48H12: int

Rodzina AprilTag Custom48h12.

image.TAGSTANDARD41H12: int

Rodzina AprilTag Standard41h12.

image.TAGSTANDARD52H13: int

Rodzina AprilTag Standard52h13.

Symboliki kodów kreskowych

Wartości zgłaszane w BarCode.type dla wpisów zwracanych przez Image.find_barcodes().

image.EAN2: int

Uzupełniający kod kreskowy EAN-2.

image.EAN5: int

Uzupełniający kod kreskowy EAN-5.

image.EAN8: int

Kod kreskowy EAN-8.

image.UPCE: int

Kod kreskowy UPC-E.

image.ISBN10: int

Kod kreskowy ISBN-10.

image.UPCA: int

Kod kreskowy UPC-A.

image.EAN13: int

Kod kreskowy EAN-13.

image.ISBN13: int

Kod kreskowy ISBN-13.

image.I25: int

Kod kreskowy Interleaved 2-of-5.

image.DATABAR: int

Kod kreskowy GS1 DataBar.

image.DATABAR_EXP: int

Kod kreskowy GS1 DataBar Expanded.

image.CODABAR: int

Kod kreskowy Codabar.

image.CODE39: int

Kod kreskowy Code 39.

image.PDF417: int

Dwuwymiarowy warstwowy kod kreskowy PDF417. Stała istnieje dla kompletności, ale dekoder kodów kreskowych obecnie nie implementuje PDF417 – Image.find_barcodes() nie zwróci wykryć tego typu.

image.CODE93: int

Kod kreskowy Code 93.

image.CODE128: int

Kod kreskowy Code 128.