Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

Morphological Closing ใน OpenCV ด้วย Java

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

Morphological Closing ใน OpenCV ด้วย Java

ผลลัพธ์

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

Morphological Closing ใน OpenCV ด้วย Java