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());
}
}
}
เอาต์พุต
เมื่อคุณรันโค้ดที่กำหนดจะเห็นผลลัพธ์ต่อไปนี้ -