median_imagemedian_imageMedianImageMedianImagemedian_image (Operator)

Name

median_imagemedian_imageMedianImageMedianImagemedian_image — Medianfilterung mit verschiedenen Masken.

Signatur

median_image(Image : ImageMedian : MaskType, Radius, Margin : )

Herror median_image(const Hobject Image, Hobject* ImageMedian, const char* MaskType, const Hlong Radius, const char* Margin)

Herror T_median_image(const Hobject Image, Hobject* ImageMedian, const Htuple MaskType, const Htuple Radius, const Htuple Margin)

void MedianImage(const HObject& Image, HObject* ImageMedian, const HTuple& MaskType, const HTuple& Radius, const HTuple& Margin)

HImage HImage::MedianImage(const HString& MaskType, Hlong Radius, const HTuple& Margin) const

HImage HImage::MedianImage(const HString& MaskType, Hlong Radius, const HString& Margin) const

HImage HImage::MedianImage(const char* MaskType, Hlong Radius, const char* Margin) const

HImage HImage::MedianImage(const wchar_t* MaskType, Hlong Radius, const wchar_t* Margin) const   (Nur Windows)

static void HOperatorSet.MedianImage(HObject image, out HObject imageMedian, HTuple maskType, HTuple radius, HTuple margin)

HImage HImage.MedianImage(string maskType, int radius, HTuple margin)

HImage HImage.MedianImage(string maskType, int radius, string margin)

def median_image(image: HObject, mask_type: str, radius: int, margin: Union[int, float, str]) -> HObject

Beschreibung

median_imagemedian_imageMedianImageMedianImageMedianImagemedian_image führt eine Medianfilterung des Eingabebildes ImageImageImageImageimageimage mit einer quadratischen oder kreisförmigen Maske durch und liefert das gefilterte Bild in ImageMedianImageMedianImageMedianImageMedianimageMedianimage_median zurück. Die Form der Maske kann mit MaskTypeMaskTypeMaskTypeMaskTypemaskTypemask_type gewählt werden. Der Radius der Maske wird mit RadiusRadiusRadiusRadiusradiusradius bestimmt.

Konzeptuell sortiert der Medianfilter alle Grauwerte innerhalb der Maske aufsteigend und wählt dann den Median der Grauwerte aus. Der Median ist der „mittlere“ der sortierten Grauwerte, d.h. der Grauwert mit dem Rang (Position) (N - 1) / 2 + 1 der sortierten Grauwerte, wobei N die Anzahl der Pixel der Filtermaske ist. Hierbei entspricht der Rang 1 dem kleinsten Grauwert und der Rang N dem größten Grauwert innerhalb der Maske (siehe auch rank_imagerank_imageRankImageRankImageRankImagerank_image).

Die Filtermaske wird über die Parameter RadiusRadiusRadiusRadiusradiusradius und MaskTypeMaskTypeMaskTypeMaskTypemaskTypemask_type festgelegt. Dabei bestimmt RadiusRadiusRadiusRadiusradiusradius die Größe der Maske und MaskTypeMaskTypeMaskTypeMaskTypemaskTypemask_type die Form mit folgenden Optionen:

'circle'"circle""circle""circle""circle""circle"

Die Maske besteht aus den Pixeln innerhalb eines Kreises mit RadiusRadiusRadiusRadiusradiusradius um das Pixel des Maskenzentrums.

'square'"square""square""square""square""square"

Die Maske besteht aus den Pixeln innerhalb eines Quadrats mit einer Kantenlänge von RadiusRadiusRadiusRadiusradiusradius Pixel.

median_imagemedian_imageMedianImageMedianImageMedianImagemedian_image kann unter anderem zur Glättung von Bildern, zum Unterdrücken unerwünschter Objekte (z.B. Punkte und Linienstrukturen), die kleiner als die Maske sind, und somit zur Schätzung der Hintergrundbeleuchtung für eine Shading-Korrektur oder als Vorverarbeitung für die dynamische Schwellenwertoperation (siehe dyn_thresholddyn_thresholdDynThresholdDynThresholdDynThresholddyn_threshold) verwendet werden.

Bei der Filterung kann über MarginMarginMarginMarginmarginmargin zwischen verschiedenen Randbehandlungen gewählt werden:

Wird eine quadratische Maske mit RadiusRadiusRadiusRadiusradiusradius 1 oder 2 (und somit eine 3x3 oder 5x5 Pixel Filtermaske) mit der Randbehandlung 'mirrored'"mirrored""mirrored""mirrored""mirrored""mirrored" verwendet, kann median_imagemedian_imageMedianImageMedianImageMedianImagemedian_image auf OpenCL-Geräten ausgeführt werden.

Das Konzept der Glättungsfilter ist in der Einleitung zum Kapitel Filter / Glättung beschrieben.

Achtung

median_imagemedian_imageMedianImageMedianImageMedianImagemedian_image verwendet einen Algorithmus mit einer Laufzeit pro Pixel, die von der Maskenhöhe 2 * RadiusRadiusRadiusRadiusradiusradius + 1 abhängt. Daher ist median_imagemedian_imageMedianImageMedianImageMedianImagemedian_image für quadratische Masken mit einer großen Maskenhöhe langsamer als median_rectmedian_rectMedianRectMedianRectMedianRectmedian_rect. Die genaue Maskenhöhe, ab der median_rectmedian_rectMedianRectMedianRectMedianRectmedian_rect schneller ist, ist abhängig von der Rechnerarchitektur (Prozessortyp, Verfügbarkeit von SIMD-Befehlen wie SSE2 oder MMX, Cachegröße und -durchsatz, Speicherdurchsatz). Typischerweise ist das für eine Maskenhöhe > 15 der Fall, kann aber z.B. bei nicht vorhandenen SIMD-Befehlen und langsamem Speicher auch erst für größere Maskenhöhen zutreffen.

Weiterhin ist zu beachten, dass median_rectmedian_rectMedianRectMedianRectMedianRectmedian_rect aufgrund der rekursiven Implementierung die Filterantwort intern auf dem kleinsten umschließenden Rechteck der Region des Bildes berechnet. Falls die Region nur einen sehr kleinen Teil des umschließenden Rechtecks abdeckt, kann es daher vorkommen, dass median_imagemedian_imageMedianImageMedianImageMedianImagemedian_image auch für größere Maskenhöhen schneller als median_rectmedian_rectMedianRectMedianRectMedianRectmedian_rect ist.

Aus Laufzeitgründen wird das Eingabebild ImageImageImageImageimageimage nicht auf NaNs überprüft. Die Verwendung eines Eingabebildes mit NaNs führt zum Absturz von HALCON.

Beachten Sie, dass Filteroperatoren eventuell unerwartete Resultate ausgeben, wenn ein Bild mit einer reduzierten Domäne als Input übergeben wird. Weitere Informationen können im Kapitel Filter gefunden werden.

Ausführungsinformationen

Parameter

ImageImageImageImageimageimage (input_object)  (multichannel-)image(-array) objectHImageHObjectHImageHobject (byte* / int2* / uint2* / int4* / real*) *erlaubt für Compute Devices

Zu filterndes Bild.

ImageMedianImageMedianImageMedianImageMedianimageMedianimage_median (output_object)  (multichannel-)image(-array) objectHImageHObjectHImageHobject * (byte / int2 / uint2 / int4 / real)

Gefiltertes Bild.

MaskTypeMaskTypeMaskTypeMaskTypemaskTypemask_type (input_control)  string HTuplestrHTupleHtuple (string) (string) (HString) (char*)

Art der Filtermaske.

Defaultwert: 'circle' "circle" "circle" "circle" "circle" "circle"

Werteliste: 'circle'"circle""circle""circle""circle""circle", 'square'"square""square""square""square""square"

Werteliste (für Compute Devices): 'square'"square""square""square""square""square"

RadiusRadiusRadiusRadiusradiusradius (input_control)  integer HTupleintHTupleHtuple (integer) (int / long) (Hlong) (Hlong)

Radius der Filtermaske.

Defaultwert: 1

Werteliste (für Compute Devices): 1, 2

Wertevorschläge: 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 15, 19, 25, 31, 39, 47, 59

Typischer Wertebereich: 1 ≤ Radius Radius Radius Radius radius radius ≤ 4095

Minimale Schrittweite: 1

Empfohlene Schrittweite: 2

MarginMarginMarginMarginmarginmargin (input_control)  string HTupleUnion[int, float, str]HTupleHtuple (string / integer / real) (string / int / long / double) (HString / Hlong / double) (char* / Hlong / double)

Randbehandlung.

Defaultwert: 'mirrored' "mirrored" "mirrored" "mirrored" "mirrored" "mirrored"

Werteliste (für Compute Devices): 'mirrored'"mirrored""mirrored""mirrored""mirrored""mirrored"

Wertevorschläge: 'mirrored'"mirrored""mirrored""mirrored""mirrored""mirrored", 'cyclic'"cyclic""cyclic""cyclic""cyclic""cyclic", 'continued'"continued""continued""continued""continued""continued", 0, 30, 60, 90, 120, 150, 180, 210, 240, 255

Beispiel (HDevelop)

read_image (Image, 'fabrik')
median_image (Image, Median, 'circle', 3, 'continued')
dev_display(Median)

Komplexität

Pro Bildpunkt: O(2 * RadiusRadiusRadiusRadiusradiusradius + 1).

Ergebnis

Sind die Parameterwerte korrekt, dann liefert median_imagemedian_imageMedianImageMedianImageMedianImagemedian_image den Wert 2 (H_MSG_TRUE). Das Verhalten bei leerer Eingabe (keine Eingabebilder vorhanden) lässt sich mittels set_system('no_object_result',<Result>)set_system("no_object_result",<Result>)SetSystem("no_object_result",<Result>)SetSystem("no_object_result",<Result>)SetSystem("no_object_result",<Result>)set_system("no_object_result",<Result>) festlegen. Gegebenenfalls wird eine Fehlerbehandlung durchgeführt.

Vorgänger

read_imageread_imageReadImageReadImageReadImageread_image

Nachfolger

thresholdthresholdThresholdThresholdThresholdthreshold, dyn_thresholddyn_thresholdDynThresholdDynThresholdDynThresholddyn_threshold, regiongrowingregiongrowingRegiongrowingRegiongrowingRegiongrowingregiongrowing

Alternativen

median_rectmedian_rectMedianRectMedianRectMedianRectmedian_rect, rank_imagerank_imageRankImageRankImageRankImagerank_image, rank_rectrank_rectRankRectRankRectRankRectrank_rect

Siehe auch

gray_erosion_rectgray_erosion_rectGrayErosionRectGrayErosionRectGrayErosionRectgray_erosion_rect, gray_dilation_rectgray_dilation_rectGrayDilationRectGrayDilationRectGrayDilationRectgray_dilation_rect, gray_erosion_shapegray_erosion_shapeGrayErosionShapeGrayErosionShapeGrayErosionShapegray_erosion_shape, gray_dilation_shapegray_dilation_shapeGrayDilationShapeGrayDilationShapeGrayDilationShapegray_dilation_shape, gray_erosiongray_erosionGrayErosionGrayErosionGrayErosiongray_erosion, gray_dilationgray_dilationGrayDilationGrayDilationGrayDilationgray_dilation

Literatur

T.S. Huang, G.J. Yang, G.Y. Tang; „A Fast Two-Dimensional Median Filtering Algorithm“; IEEE Transactions on Acoustics, Speech, and Signal Processing, vol. 27, no. 1, pp. 13-18, 1979.
R. Haralick, L. Shapiro; „Computer and Robot Vision“; Addison-Wesley, 1992, pp. 318-320.

Modul

Foundation