Java DIP - stosowanie znaku wodnego

W tym rozdziale poznamy dwa sposoby umieszczania znaku wodnego na obrazach. Te sposoby to -

  • Stosowanie tekstowego znaku wodnego
  • Stosowanie znaku wodnego obrazu

Stosowanie tekstowego znaku wodnego

Używamy OpenCV funkcjonować putTextaby zastosować tekstowy znak wodny do obrazu. Można go znaleźć podCorepakiet. Jego składnia jest podana poniżej -

Core.putText(source, Text, Point, fontFace ,fontScale , color);

Parametry tej funkcji opisano poniżej -

Sr.No. Parametr i opis
1

Source

To jest obraz źródłowy.

2

Text

Jest to ciąg tekstowy, który pojawiłby się na obrazku.

3

Point

Jest to punkt, w którym tekst powinien pojawić się na obrazie.

4

fontFace

Typ czcionki. Na przykład - FONT_HERSHEY_SIMPLEX, FONT_HERSHEY_PLAIN, FONT_HERSHEY_COMPLEX itp.

5

fontScale

Jest to współczynnik skali czcionki pomnożony przez rozmiar podstawowy danej czcionki.

6

color

To jest kolor tekstu.

Oprócz metody putText istnieją inne metody dostarczane przez klasę Core. Są one krótko opisane -

Sr.No. Metoda i opis
1

normalize(Mat src, Mat dst, double alpha, double beta, int norm_type)

Normalizuje normę lub zakres wartości tablicy.

2

perspectiveTransform(Mat src, Mat dst, Mat m)

Wykonuje perspektywiczną transformację macierzy wektorów.

3

phase(Mat x, Mat y, Mat angle)

Oblicza kąt obrotu wektorów 2D.

4

rectangle(Mat img, Point pt1, Point pt2, Scalar color)

Rysuje prosty, gruby lub wypełniony prostokąt w prawo.

5

reduce(Mat src, Mat dst, int dim, int rtype, int dtype)

Redukuje macierz do wektora.

6

transform(Mat src, Mat dst, Mat m)

Wykonuje transformację macierzy każdego elementu tablicy.

Przykład

Poniższy przykład demonstruje użycie klasy Core do zastosowania tekstowego znaku wodnego na obrazie -

import org.opencv.core.Core;
import org.opencv.core.Mat;

import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class Main {
   public static void main( String[] args ) {
   
      try{
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         Mat source = Highgui.imread("digital_image_processing.jpg",  Highgui.CV_LOAD_IMAGE_COLOR);
         Mat destination = new Mat(source.rows(),source.cols(), source.type());  
         
         Core.putText(source, "Tutorialspoint.com", new Point  (source.rows()/2,source.cols()/2), Core.FONT_ITALIC,new Double(1),new  Scalar(255));

         Highgui.imwrite("watermarked.jpg", source);
         
      } catch (Exception e) {
         System.out.println("Error: "+e.getMessage());
      }
   }
}

Wynik

Po wykonaniu podanego kodu widoczne są następujące dane wyjściowe -

Oryginalny obraz

Obraz ze znakiem wodnym tekstu

Stosowanie znaku wodnego obrazu na obrazie

Będziemy używać OpenCV funkcjonować addWeightedaby zastosować znak wodny obrazu do obrazu. Można go znaleźć podCorepakiet. Jego składnia jest podana poniżej -

Core.addWeighted(InputArray src1, alpha, src2 (Watermark image), beta, gamma, OutputArray dst);

Parametry tej funkcji opisano poniżej -

Sr.No. Parametr i opis
1

src1

Jest to pierwsza tablica wejściowa.

2

alpha

Jest to waga pierwszych elementów tablicy.

3

src2

Jest to druga tablica wejściowa o takim samym rozmiarze i numerze kanału jak src1.

4

beta

Jest to waga drugich elementów tablicy.

5

gamma

Jest to wartość skalarna dodawana do każdej sumy.

6

dst

Jest to tablica wyjściowa, która ma taki sam rozmiar i liczbę kanałów jak tablice wejściowe.

Przykład

Poniższy przykład demonstruje użycie klasy Core do zastosowania znaku wodnego obrazu do obrazu -

import org.opencv.core.Core;
import org.opencv.core.Mat;

import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class Main {
   public static void main( String[] args ) {
   
      try{
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         
         Mat source = Highgui.imread("digital_image_processing.jpg",  Highgui.CV_LOAD_IMAGE_COLOR);
         Mat waterMark = Highgui.imread("watermark.png",  Highgui.CV_LOAD_IMAGE_COLOR);
         Rect ROI = new Rect(waterMark.rows() * 4,waterMark.cols(),  waterMark.cols(),waterMark.rows());
         
         Core.addWeighted(source.submat(ROI), 0.8, waterMark, 0.2, 1,  source.submat(ROI));
         Highgui.imwrite("watermarkedImage.jpg", source);
         
      } catch (Exception e) {
         System.out.println("Error: " + e.getMessage());
      }
   }
}

Wynik

Po wykonaniu podanego kodu widoczne są następujące dane wyjściowe -

Oryginalny obraz

Obraz znaku wodnego

Obraz ze znakiem wodnym