Java DIP - Применение водяного знака

В этой главе мы узнаем о двух способах нанесения водяных знаков на изображения. Эти способы -

  • Применение текстового водяного знака
  • Применение водяного знака изображения

Применение текстового водяного знака

Мы используем OpenCV функция putTextприменить текстовый водяной знак к изображению. Его можно найти вCoreпакет. Его синтаксис приведен ниже -

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

Параметры этой функции описаны ниже -

Sr. No. Параметр и описание
1

Source

Это исходное изображение.

2

Text

Это текстовая строка, которая появится на изображении.

3

Point

Это точка, в которой на изображении должен отображаться текст.

4

fontFace

Тип шрифта. Например - FONT_HERSHEY_SIMPLEX, FONT_HERSHEY_PLAIN, FONT_HERSHEY_COMPLEX и т. Д.

5

fontScale

Коэффициент масштабирования шрифта умножается на базовый размер шрифта.

6

color

Это цвет текста.

Помимо метода putText, есть другие методы, предоставляемые классом Core. Они кратко описаны -

Sr. No. Метод и описание
1

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

Он нормализует норму или диапазон значений массива.

2

perspectiveTransform(Mat src, Mat dst, Mat m)

Выполняет перспективное матричное преобразование векторов.

3

phase(Mat x, Mat y, Mat angle)

Он вычисляет угол поворота 2D-векторов.

4

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

Он рисует простой, толстый или заполненный прямоугольник вправо.

5

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

Он сводит матрицу к вектору.

6

transform(Mat src, Mat dst, Mat m)

Он выполняет матричное преобразование каждого элемента массива.

пример

В следующем примере демонстрируется использование класса Core для применения текстового водяного знака к изображению.

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());
      }
   }
}

Вывод

Когда вы выполняете данный код, виден следующий вывод -

Исходное изображение

Текст с водяными знаками

Применение водяного знака к изображению

Мы собираемся использовать OpenCV функция addWeightedприменить водяной знак изображения к изображению. Его можно найти вCoreпакет. Его синтаксис приведен ниже -

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

Параметры этой функции описаны ниже -

Sr. No. Параметр и описание
1

src1

Это первый входной массив.

2

alpha

Это вес первых элементов массива.

3

src2

Это второй входной массив того же размера и номера канала, что и src1.

4

beta

Это вес вторых элементов массива.

5

gamma

Это скаляр, добавленный к каждой сумме.

6

dst

Это выходной массив, который имеет тот же размер и количество каналов, что и входные массивы.

пример

В следующем примере демонстрируется использование класса Core для применения водяного знака изображения к изображению.

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());
      }
   }
}

Вывод

Когда вы выполняете данный код, виден следующий вывод -

Исходное изображение

Изображение водяного знака

Изображение с водяным знаком