Java DIP - การใช้ลายน้ำ

ในบทนี้เราจะเรียนรู้สองวิธีในการใช้ลายน้ำบนรูปภาพ วิธีเหล่านี้คือ -

  • การใช้ลายน้ำข้อความ
  • การใช้ลายน้ำภาพ

การใช้ลายน้ำข้อความ

เราใช้ OpenCV ฟังก์ชัน putTextเพื่อใช้ลายน้ำข้อความกับรูปภาพ สามารถดูได้ที่ด้านล่างCoreแพ็คเกจ ไวยากรณ์ได้รับด้านล่าง -

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

พารามิเตอร์ของฟังก์ชันนี้อธิบายไว้ด้านล่าง -

ซีเนียร์ พารามิเตอร์และคำอธิบาย
1

Source

เป็นภาพต้นฉบับ

2

Text

เป็นข้อความสตริงที่จะปรากฏบนรูปภาพ

3

Point

เป็นจุดที่ข้อความควรปรากฏบนรูปภาพ

4

fontFace

แบบอักษร ตัวอย่างเช่น - FONT_HERSHEY_SIMPLEX, FONT_HERSHEY_PLAIN, FONT_HERSHEY_COMPLEX เป็นต้น

5

fontScale

เป็นตัวคูณมาตราส่วนแบบอักษรที่คูณด้วยขนาดฐานเฉพาะแบบอักษร

6

color

เป็นสีข้อความ

นอกเหนือจากวิธีการ putText แล้วยังมีวิธีการอื่น ๆ ที่จัดเตรียมโดยคลาส Core มีการอธิบายสั้น ๆ -

ซีเนียร์ วิธีการและคำอธิบาย
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)

คำนวณมุมการหมุนของเวกเตอร์ 2 มิติ

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

พารามิเตอร์ของฟังก์ชันนี้อธิบายไว้ด้านล่าง -

ซีเนียร์ พารามิเตอร์และคำอธิบาย
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());
      }
   }
}

เอาต์พุต

เมื่อคุณรันโค้ดที่กำหนดจะเห็นผลลัพธ์ต่อไปนี้ -

ภาพต้นฉบับ

รูปภาพลายน้ำ

ภาพลายน้ำ