DIP Java - Applicazione del filtro box

Applichiamo il filtro Box che sfoca un'immagine. Un filtro Box potrebbe essere di dimensioni 3x3, 5x5, 9x9 ecc.

Noi usiamo OpenCV funzione filter2Dper applicare il filtro Box alle immagini. Può essere trovato sottoImgprocpacchetto. La sua sintassi è data di seguito:

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

Gli argomenti della funzione sono descritti di seguito:

Sr.No. Argomento e descrizione
1

src

È l'immagine di origine.

2

dst

È l'immagine di destinazione.

3

depth

È la profondità di dst. Un valore negativo (come -1) indica che la profondità è la stessa della sorgente.

4

kernel

È il kernel da sottoporre a scansione attraverso l'immagine.

5

anchor

È la posizione dell'ancora rispetto al suo nucleo. Il punto di posizione (-1, -1) indica il centro per impostazione predefinita.

6

delta

È un valore da aggiungere a ogni pixel durante la convoluzione. Di default è 0.

7

BORDER_DEFAULT

Lasciamo questo valore per impostazione predefinita.

Oltre al metodo filter2D (), ci sono altri metodi forniti dalla classe Imgproc. Sono descritti brevemente:

Sr.No. Metodo e descrizione
1

cvtColor(Mat src, Mat dst, int code, int dstCn)

Converte un'immagine da uno spazio colore a un altro.

2

dilate(Mat src, Mat dst, Mat kernel)

Dilata un'immagine utilizzando uno specifico elemento strutturante.

3

equalizeHist(Mat src, Mat dst)

Equalizza l'istogramma di un'immagine in scala di grigi.

4

filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta)

Convolge un'immagine con il kernel.

5

GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)

Sfoca un'immagine utilizzando un filtro gaussiano.

6

integral(Mat src, Mat sum)

Calcola l'integrale di un'immagine.

Esempio

L'esempio seguente mostra l'uso della classe Imgproc per applicare il filtro Box a un'immagine in scala di grigi.

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 = 9;
         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 = Mat.ones(kernelSize,kernelSize, CvType.CV_32F);	      
         
         for(int i=0; i<kernel.rows(); i++) {
            for(int j=0; j<kernel.cols(); j++) {
            
               double[] m = kernel.get(i, j);
               
               for(int k =0; k<m.length; k++) {
                  m[k] = m[k]/(kernelSize * kernelSize);
               }
               kernel.put(i,j, m);
            }
         }	   
         
         Imgproc.filter2D(source, destination, -1, kernel);
         Highgui.imwrite("output.jpg", destination);
         
      } catch (Exception e) {
         System.out.println("Error: " + e.getMessage());
      }
   }
}

Produzione

Quando esegui il codice dato, viene visualizzato il seguente output:

Immagine originale

In questo esempio convolgiamo la nostra immagine con il seguente filtro (kernel). Questo filtro produce la sfocatura di un'immagine all'aumentare delle sue dimensioni.

Questa immagine originale è stata convoluta con il filtro a scatola di dimensione 5, che è dato di seguito -

Filtro a scatola di misura 5

1/25 1/25 1/25 1/25 1/25
1/25 1/25 1/25 1/25 1/25
1/25 1/25 1/25 1/25 1/25
1/25 1/25 1/25 1/25 1/25
1/25 1/25 1/25 1/25 1/25

Immagine convoluta (con filtro a scatola di dimensione 5)

Immagine convoluta (con filtro a scatola di dimensione 9)