Java DIP - filtr średniej ważonej
W filtrze średniej ważonej przypisaliśmy większą wagę wartości środkowej, przez co wkład środka staje się większy niż reszta wartości. Dzięki filtrowaniu średniej ważonej możemy kontrolować rozmycie obrazu.
Używamy OpenCV funkcjonować filter2Daby zastosować do obrazów filtr średniej ważonej. Można go znaleźć podImgprocpakiet. Jego składnia jest podana poniżej -
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
Argumenty funkcji opisano poniżej -
Sr.No. | Argument i opis |
---|---|
1 | src To jest obraz źródłowy. |
2 | dst To jest obraz docelowy. |
3 | ddepth To jest głębia zachodu słońca. Wartość ujemna (taka jak -1) wskazuje, że głębokość jest taka sama jak źródło. |
4 | kernel Jest to jądro, które ma być skanowane poprzez obraz. |
5 | anchor Jest to pozycja kotwicy względem jej jądra. Punkt lokalizacji (-1, -1) domyślnie wskazuje środek. |
6 | delta Jest to wartość dodawana do każdego piksela podczas splotu. Domyślnie jest to 0. |
7 | BORDER_DEFAULT Domyślnie pozwalamy na tę wartość. |
Oprócz metody filter2D () istnieją inne metody udostępniane przez klasę Imgproc. Są one krótko opisane -
Sr.No. | Metoda i opis |
---|---|
1 | cvtColor(Mat src, Mat dst, int code, int dstCn) Konwertuje obraz z jednej przestrzeni kolorów na inną. |
2 | dilate(Mat src, Mat dst, Mat kernel) Rozszerza obraz za pomocą określonego elementu strukturyzującego. |
3 | equalizeHist(Mat src, Mat dst) Wyrównuje histogram obrazu w skali szarości. |
4 | filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) Łączy obraz z jądrem. |
5 | GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) Rozmywa obraz za pomocą filtra Gaussa. |
6 | integral(Mat src, Mat sum) Oblicza całkę obrazu. |
Przykład
Poniższy przykład ilustruje użycie klasy Imgproc do zastosowania filtru średniej ważonej do obrazu Graycale.
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++) {
if(i==1 && j==1) {
m[k] = 10/18;
}
else{
m[k] = m[k]/(18);
}
}
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());
}
}
}
Wynik
Po wykonaniu podanego kodu widoczne są następujące dane wyjściowe -
Oryginalny obraz
Ten oryginalny obraz jest spleciony z filtrem średniej ważonej, jak podano poniżej -
Filtr średniej ważonej
1 | 1 | 1 |
1 | 10 | 1 |
1 | 1 | 1 |