Java DIP - Anwenden des Boxfilters
Wir wenden den Box-Filter an, der ein Bild verwischt. Ein Box-Filter kann die Abmessungen 3x3, 5x5, 9x9 usw. haben.
Wir gebrauchen OpenCV Funktion filter2DBox-Filter auf Bilder anwenden. Es kann unter gefunden werdenImgprocPaket. Die Syntax ist unten angegeben -
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
Die Funktionsargumente werden unten beschrieben -
Sr.Nr. | Argument & Beschreibung |
---|---|
1 | src Es ist ein Quellbild. |
2 | dst Es ist ein Zielbild. |
3 | depth Es ist die Tiefe von dst. Ein negativer Wert (z. B. -1) zeigt an, dass die Tiefe der Quelle entspricht. |
4 | kernel Es ist der Kernel, der durch das Bild gescannt werden soll. |
5 | anchor Dies ist die Position des Ankers relativ zu seinem Kernel. Der Positionspunkt (-1, -1) gibt standardmäßig die Mitte an. |
6 | delta Dies ist ein Wert, der während der Faltung zu jedem Pixel hinzugefügt wird. Standardmäßig ist es 0. |
7 | BORDER_DEFAULT Wir lassen diesen Wert standardmäßig. |
Neben der filter2D () -Methode gibt es weitere Methoden, die von der Imgproc-Klasse bereitgestellt werden. Sie werden kurz beschrieben -
Sr.Nr. | Methode & Beschreibung |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) Es konvertiert ein Bild von einem Farbraum in einen anderen. |
2 | dilate(Mat src, Mat dst, Mat kernel) Es erweitert ein Bild mithilfe eines bestimmten Strukturierungselements. |
3 | equalizeHist(Mat src, Mat dst) Es gleicht das Histogramm eines Graustufenbildes aus. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) Es faltet ein Bild mit dem Kernel. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) Es verwischt ein Bild mit einem Gaußschen Filter. |
6 | integral(Mat src, Mat sum) Es berechnet das Integral eines Bildes. |
Beispiel
Das folgende Beispiel zeigt die Verwendung der Imgproc-Klasse zum Anwenden des Box-Filters auf ein Graustufenbild.
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());
}
}
}
Ausgabe
Wenn Sie den angegebenen Code ausführen, wird die folgende Ausgabe angezeigt:
Original Bild
In diesem Beispiel falten wir unser Bild mit dem folgenden Filter (Kernel). Dieser Filter führt dazu, dass ein Bild mit zunehmender Größe unscharf wird.
Dieses Originalbild wurde mit dem unten angegebenen Boxfilter der Größe 5 gefaltet -
Kastenfilter der Größe 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 |