Java DIP - Hiểu Convolution

Tích phân là một phép toán trên hai hàm f và g. Hàm f và g trong trường hợp này là ảnh, vì ảnh cũng là hàm hai chiều.

Thực hiện chuyển đổi

Để thực hiện tích chập trên một hình ảnh, các bước sau được thực hiện:

  • Chỉ lật mặt nạ (theo chiều ngang và chiều dọc) một lần.
  • Trượt mặt nạ lên hình ảnh.
  • Nhân các phần tử tương ứng và sau đó cộng chúng.
  • Lặp lại quy trình này cho đến khi tất cả các giá trị của hình ảnh đã được tính toán.

Chúng tôi sử dụng OpenCV chức năng filter2Dđể áp dụng tích chập cho hình ảnh. Nó có thể được tìm thấy dướiImgprocgói hàng. Cú pháp của nó được đưa ra dưới đây:

filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );

Các đối số của hàm được mô tả bên dưới:

Sr.No. Lập luận & Mô tả
1

src

Nó là hình ảnh nguồn.

2

dst

Nó là hình ảnh đích.

3

depth

Nó là độ sâu của dst. Giá trị âm (chẳng hạn như -1) chỉ ra rằng độ sâu giống với nguồn.

4

kernel

Nó là hạt nhân được quét qua ảnh.

5

anchor

Nó là vị trí của neo so với nhân của nó. Vị trí Điểm (-1, -1) cho biết trung tâm theo mặc định.

6

delta

Nó là một giá trị được thêm vào mỗi pixel trong quá trình tích chập. Theo mặc định, nó là 0.

7

BORDER_DEFAULT

Chúng tôi để giá trị này theo mặc định.

Thí dụ

Ví dụ sau minh họa việc sử dụng lớp Imgproc để thực hiện tích chập trên hình ảnh của Thang độ xám.

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;

import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

public class convolution {
   public static void main( String[] args ) {
   
      try {
         int kernelSize = 3;
         System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
         
         Mat source = Highgui.imread("grayscale.jpg",  Highgui.CV_LOAD_IMAGE_GRAYSCALE);
         Mat destination = new Mat(source.rows(),source.cols(),source.type());
         
         Mat kernel = new Mat(kernelSize,kernelSize, CvType.CV_32F) {
            {
               put(0,0,0);
               put(0,1,0);
               put(0,2,0);

               put(1,0,0);
               put(1,1,1);
               put(1,2,0);

               put(2,0,0);
               put(2,1,0);
               put(2,2,0);
            }
         };
         
         Imgproc.filter2D(source, destination, -1, kernel);
         Highgui.imwrite("original.jpg", destination);
         
      } catch (Exception e) {
          System.out.println("Error:" + e.getMessage());
      }
   }
}

Đầu ra

Trong ví dụ này, chúng ta chuyển đổi hình ảnh của mình với bộ lọc (nhân) sau. Bộ lọc này tạo ra hình ảnh gốc như nó vốn có -

0 0 0
0 1 0
0 0 0

Ảnh gốc

Hình ảnh được chuyển đổi