Morphological operations คือชุดการดำเนินการที่ประมวลผลภาพตามรูปร่างที่กำหนด Erosion และ dilation เป็น 2 operations พื้นฐาน
- ใน dilation จะเพิ่มพิกเซลเข้าไปที่ขอบเขตภาพ
- ใน erosion จะลบพิกเซลออกจากขอบเขตภาพ
จำนวนพิกเซลที่เพิ่ม/ลบ ขึ้นอยู่กับมิติของ structuring element ที่ใช้ คุณสามารถทำ erosion และ dilation ได้ด้วยเมธอด erode() และ dilate() ตามลำดับ
นอกจากนี้ OpenCV ยังมี morphological transformations อื่นๆ ได้แก่ Opening, Closing, Morphological Gradient, Top Hat, Black Hat
Morphological Closing
เป็นการดำเนินการที่เทียบเท่าการใช้ dilation บนภาพแล้วตามด้วย erosion ผลลัพธ์ ใช้กำจัด/เติมรูเล็กๆ ในภาพ สรุปคือ Morphological Closing ใช้กำจัด noise จากภาพ
คุณสามารถใช้ได้ด้วยเมธอด morphologyEx() ซึ่งรับ:
- สองอ็อบเจ็กต์ Mat แทน source และ destination images
- ตัวแปร integer แทนประเภทของ Morphological operation
- อ็อบเจ็กต์ Mat แทน kernel matrix
เพื่อใช้ Morphological closing ให้เรียกเมธอดข้างต้นโดยส่ง Imgproc.MORPH_CLOSE เป็นพารามิเตอร์ที่ 3 พร้อม source, destination และ kernel matrices
ตัวอย่างโค้ด
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
public class MorphologicalClosing extends Application {
@Override
public void start(Stage stage) throws IOException {
// โหลด OpenCV core library
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
// อ่านข้อมูลภาพ
String file = "D:\\Images\\morph_input2.jpg";
Mat src = Imgcodecs.imread(file);
// สร้าง destination matrix
Mat dst = new Mat(src.rows(), src.cols(), src.type());
// เตรียม kernel matrix
Mat kernel = Mat.ones(5, 5, CvType.CV_32F);
// ใช้ morphologyEx แบบ CLOSE
Imgproc.morphologyEx(src, dst, Imgproc.MORPH_CLOSE, kernel);
// แปลง matrix เป็น JavaFX writable image
Image img = HighGui.toBufferedImage(dst);
WritableImage writableImage = SwingFXUtils.toFXImage((BufferedImage) img, null);
// ตั้งค่า ImageView
ImageView imageView = new ImageView(writableImage);
imageView.setX(10);
imageView.setY(10);
imageView.setFitWidth(575);
imageView.setPreserveRatio(true);
// ตั้งค่า Scene
Group root = new Group(imageView);
Scene scene = new Scene(root, 595, 400);
stage.setTitle("Dilation Example");
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
รูปภาพ Input

ผลลัพธ์
เมื่อรันโปรแกรมจะได้ผลลัพธ์ดังนี้:
