?>
Die Aktion `annotateImages` im Aktionssatz `image` wird verwendet, um Bilder in einer CAS-Tabelle mit Metadaten zu versehen, die in derselben oder einer anderen Tabelle enthalten sind. Dies ermöglicht das Zeichnen von Formen, Text oder das Überlagern von Segmentierungsmasken direkt auf die Bilder. Diese Funktion ist besonders nützlich für die Visualisierung von Ergebnissen der Bildanalyse, wie z. B. Objekterkennung, oder zur Vorbereitung von Trainingsdaten für Deep-Learning-Modelle.
| Parameter | Beschreibung |
|---|---|
| annotations | Gibt eine Liste von Annotationen an, die auf die Bilder angewendet werden sollen. Jede Annotation wird als Wörterbuch mit einem `annotationType` und den entsprechenden Parametern definiert. |
| casOut | Gibt die Ausgabetabelle an, in der die annotierten Bilder gespeichert werden sollen. |
| copyVars | Gibt eine Liste von Variablen an, die von der Eingabetabelle in die Ausgabetabelle kopiert werden sollen. |
| decode | Gibt an, ob die Bilder vor der Annotation dekodiert werden sollen. Dies ist erforderlich, wenn die Bilder in einem komprimierten Format vorliegen. |
| images | Gibt die Eingabetabelle an, die die zu annotierenden Bilder enthält, sowie die Spalten, die Bilddaten, IDs und andere Metadaten enthalten. |
| annotationType | Gibt den Typ der durchzuführenden Annotation an. Mögliche Werte sind 'LINES', 'POINTS', 'PROTOBUF' und 'SEGMENTATION'. |
| thickness | Gibt die Dicke (in Pixel) für Linienannotationen an. |
| radius | Gibt den Radius (in Pixel) für Punktannotationen an. |
| colorMap | Gibt die Farbkarte an, die für Segmentierungsannotationen verwendet wird. |
| transparency | Gibt die Transparenz (in Prozent) für Segmentierungsüberlagerungen an. |
Dieser Code lädt Bilder aus einem angegebenen Pfad in eine CAS-Tabelle. Die Tabelle `my_images` enthält dann die Bilder, die für die Annotation verwendet werden können. Zusätzlich wird eine zweite Tabelle `annotations_data` erstellt, die die Koordinaten für die Annotationen enthält.
proc cas;
loadactionset 'image';
/* Laden von Bildern in eine CAS-Tabelle */
image.loadImages /
path='path/to/your/images/'
casOut={name='my_images', caslib='CASUSER'};
/* Erstellen einer Tabelle mit Annotationsdaten (z.B. für Rechtecke) */
data casuser.annotations_data;
length _image_ $200;
_image_ = 'image1.jpg'; _x_=50; _y_=50; _width_=100; _height_=80; _label_='Objekt1'; output;
_image_ = 'image2.png'; _x_=20; _y_=30; _width_=120; _height_=100; _label_='Objekt2'; output;
run;
/* Zusammenführen der Bildtabelle mit den Annotationsdaten */
proc sql;
create table casuser.images_with_annotations as
select a.*, b._x_, b._y_, b._width_, b._height_, b._label_
from casuser.my_images as a
join casuser.annotations_data as b
on a._path_ = b._image_;
quit;
run;Dieses Beispiel zeichnet einen einzelnen roten Punkt mit einem Radius von 5 Pixeln in jedes Bild der Tabelle `my_images`.
| 1 | PROC CAS; |
| 2 | image.annotateImages / |
| 3 | images={TABLE={name='my_images', caslib='CASUSER'}} |
| 4 | annotations={{ |
| 5 | annotation={annotationType='POINTS', representation={representationType='SINGLE_COLUMN', columnName='_points_'}, r=255, radius=5} |
| 6 | }} |
| 7 | casOut={name='annotated_points', caslib='CASUSER', replace=true}; |
| 8 | RUN; |
Dieses Beispiel verwendet die zuvor erstellte Tabelle `images_with_annotations`, um Rechtecke um Objekte zu zeichnen. Die Koordinaten (`_x_`, `_y_`, `_width_`, `_height_`) und die Farbe werden verwendet, um Linien zu zeichnen, die ein Rechteck bilden. Es wird davon ausgegangen, dass die Tabelle `images_with_annotations` Spalten für die Koordinaten und eine Beschriftung enthält.
| 1 | PROC CAS; |
| 2 | image.annotateImages / |
| 3 | images={TABLE={name='images_with_annotations', caslib='CASUSER'}} |
| 4 | annotations={{ |
| 5 | /* Zeichnet die obere Linie des Rechtecks */ |
| 6 | annotation={annotationType='LINES', representation={representationType='MULTI_COLUMN', x1='_x_', y1='_y_', x2_expr='_x_ + _width_', y2='_y_'}, r=255, g=0, b=0, thickness=3} |
| 7 | },{ |
| 8 | /* Zeichnet die untere Linie des Rechtecks */ |
| 9 | annotation={annotationType='LINES', representation={representationType='MULTI_COLUMN', x1='_x_', y1_expr='_y_ + _height_', x2_expr='_x_ + _width_', y2_expr='_y_ + _height_'}, r=255, g=0, b=0, thickness=3} |
| 10 | },{ |
| 11 | /* Zeichnet die linke Linie des Rechtecks */ |
| 12 | annotation={annotationType='LINES', representation={representationType='MULTI_COLUMN', x1='_x_', y1='_y_', x2='_x_', y2_expr='_y_ + _height_'}, r=255, g=0, b=0, thickness=3} |
| 13 | },{ |
| 14 | /* Zeichnet die rechte Linie des Rechtecks */ |
| 15 | annotation={annotationType='LINES', representation={representationType='MULTI_COLUMN', x1_expr='_x_ + _width_', y1='_y_', x2_expr='_x_ + _width_', y2_expr='_y_ + _height_'}, r=255, g=0, b=0, thickness=3} |
| 16 | }} |
| 17 | casOut={name='annotated_rectangles', caslib='CASUSER', replace=true}; |
| 18 | RUN; |
Dieses Beispiel überlagert eine Segmentierungsmaske auf die Originalbilder. Es wird angenommen, dass eine Tabelle `segmentation_masks` existiert, die eine Spalte `_image_` mit den Maskenbinärdaten enthält. Die Maske wird mit einer Transparenz von 50% und der 'JET'-Farbkarte überlagert.
| 1 | PROC CAS; |
| 2 | image.annotateImages / |
| 3 | images={TABLE={name='my_images', caslib='CASUSER'}} |
| 4 | annotations={{ |
| 5 | annotation={annotationType='SEGMENTATION', TABLE={name='segmentation_masks', caslib='CASUSER'}, colorMap='JET', transparency=50} |
| 6 | }} |
| 7 | casOut={name='annotated_segmentation', caslib='CASUSER', replace=true}; |
| 8 | RUN; |