Color Similarity mit RGB-Referenz-Farbe

In diesem Beispiel wird über die Funktion F_VN_ReferenceColorSimilarityExp_TcVnVector3_LREAL die Ähnlichkeit jedes Pixels zu 3 Referenzfarben berechnet und jeweils als Grauwertbild zurückgegeben. Anhand dieser Grauwertbilder werden anschließend die Objekte in den Referenzfarben detektiert.

Variablen

hr                  :   HRESULT;

// Images
ipImageIn           :   ITcVnImage;
ipImageInDisp       :   ITcVnDisplayableImage;

ipImageThres        :   ITcVnImage;
ipImageThresDisp    :   ARRAY [0..2] OF ITcVnDisplayableImage;
ipImageWorkCol      :   ITcVnImage;
ipImageWorkColDisp  :   ARRAY [0..2] OF ITcVnDisplayableImage;

ipImageRes          :   ITcVnImage;
ipImageResDisp      :   ITcVnDisplayableImage;

// Color
iColor              :   INT;
aColorTxt           :   ARRAY[0..2] OF STRING := [ 'RED', 'GREEN', 'BLUE' ];
aColor              :   ARRAY[0..2] OF TcVnVector4_LREAL := [ [150, 0, 0], [0, 255, 0], [0, 0, 255] ];
aColorRef           :   ARRAY[0..2] OF TcVnVector3_LREAL := [ [255, 75, 60], [40, 140, 95], [40, 140, 190] ];

// Contours
ipContourList       :   ITcVnContainer;
ipIterator          :   ITcVnForwardIterator;
aOffset             :   TcVnPoint;
ipContour           :   ITcVnContainer;
fArea               :   LREAL;
aCenter             :   TcVnPoint2_LREAL;

Code

// Attention: With other images another color space transformation could be necessary
hr := F_VN_ConvertColorSpace(ipImageIn, ipImageRes, TCVN_CST_Bayer_RG_TO_RGB, hr);

FOR iColor := 0 TO 2 DO

   // Compute the Color Similarity to a Reference Color
   hr := F_VN_ReferenceColorSimilarityExp_TcVnVector3_LREAL(
                  ipSrcImage        := ipImageRes,
                  ipDestImage       := ipImageWorkCol,
                  aRefColor         := aColorRef[iColor],
                  fVariance         := 0.1,
                  fLuminanceWeight  := 0.2,
                  hrPrev            := hr);

   hr := F_VN_Threshold(ipImageWorkCol, ipImageThres, 200, 255, TCVN_TT_Binary, hr);

   // Find all objects / contours in the black and white image
   hr := F_VN_FindContours(ipImageThres, ipContourList, hr);
   hr := F_VN_GetForwardIterator(ipContourList, ipIterator, hr);

   // Filter the objects by size and draw the contours
   WHILE SUCCEEDED(hr) AND_THEN ipIterator.CheckIfEnd() <> S_OK DO
      hr := F_VN_GetContainer(ipIterator, ipContour, hr);
      hr := F_VN_IncrementIterator(ipIterator, hr);

      // Filter contours by size
      hr := F_VN_ContourArea(ipContour, fArea, hr);
      IF fArea > 5000 THEN
         // Draw Results into an Image
         hr := F_VN_DrawContours(ipContour, -1, ipImageRes, aColor[iColor], 3, hr);
         hr := F_VN_ContourCenterOfMass(ipContour, aCenter, hr);
         hr := F_VN_PutText(aColorTxt[iColor], ipImageRes, LREAL_TO_UDINT(aCenter[0])-30, LREAL_TO_UDINT(aCenter[1])+10, TCVN_FT_HERSHEY_PLAIN, 2, aColor[iColor],hr);
      END_IF
   END_WHILE

   // Display effect of the Color-Similarity-Function
   hr := F_VN_TransformIntoDisplayableImage(ipImageThres, ipImageThresDisp[iColor], hr);
   hr := F_VN_TransformIntoDisplayableImage(ipImageWorkCol, ipImageWorkColDisp[iColor], hr);
END_FOR

Ergebnis

Das Eingangsbild im Bayer RG Format

Color Similarity mit RGB-Referenz-Farbe 1:

Nach der Konvertierung des Eingangsbildes mit der F_VN_ConvertColorSpace Funktion in ein RGB Bild, kann mit der F_VN_ReferenceColorSimilarityExp_TcVnVector3_LREAL die Farbähnlichkeit jedes Pixels zur Referenzfarbe ermittelt werden. Im zurück gegebenen Ergebnisbild entspricht:

// Compute the Color Similarity to a Reference Color
hr := F_VN_ReferenceColorSimilarityExp_TcVnVector3_LREAL(
               ipSrcImage        := ipImageRes,
               ipDestImage       := ipImageWorkCol,
               aRefColor         := aColorRef[iColor],
               fVariance         := 0.1,
               fLuminanceWeight  := 0.2,
               hrPrev            := hr);
Color Similarity mit RGB-Referenz-Farbe 2:

Über einen Schwellwert (F_VN_Threshold) wird anschließend definiert, wie stark die Übereinstimmung zur Referenzfarbe sein soll, um ihr zugeordnet zu werden.

hr := F_VN_Threshold(ipImageWorkCol, ipImageThres, 200, 255, TCVN_TT_Binary, hr);
Color Similarity mit RGB-Referenz-Farbe 3:

Das Ergebnisbild, nach anschließender Detektion.

Color Similarity mit RGB-Referenz-Farbe 4:

Ähnliches Beispiel