Java DIP - Aplicar filtro de caja
Aplicamos un filtro de caja que difumina una imagen. Un filtro de caja puede tener unas dimensiones de 3x3, 5x5, 9x9, etc.
Usamos OpenCV función filter2Dpara aplicar el filtro de caja a las imágenes. Se puede encontrar enImgprocpaquete. Su sintaxis se da a continuación:
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
Los argumentos de la función se describen a continuación:
No Señor. | Argumento y descripción |
---|---|
1 |
src Es la imagen de origen. |
2 |
dst Es imagen de destino. |
3 |
depth Es la profundidad de dst. Un valor negativo (como -1) indica que la profundidad es la misma que la fuente. |
4 |
kernel Es el núcleo que se va a escanear a través de la imagen. |
5 |
anchor Es la posición del ancla en relación con su núcleo. El punto de ubicación (-1, -1) indica el centro por defecto. |
6 |
delta Es un valor que se agrega a cada píxel durante la convolución. Por defecto es 0. |
7 |
BORDER_DEFAULT Dejamos este valor por defecto. |
Aparte del método filter2D (), hay otros métodos proporcionados por la clase Imgproc. Se describen brevemente:
No Señor. | Método y descripción |
---|---|
1 |
cvtColor(Mat src, Mat dst, int code, int dstCn) Convierte una imagen de un espacio de color a otro. |
2 |
dilate(Mat src, Mat dst, Mat kernel) Dilata una imagen utilizando un elemento estructurante específico. |
3 |
equalizeHist(Mat src, Mat dst) Ecualiza el histograma de una imagen en escala de grises. |
4 |
filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) Convierte una imagen con el kernel. |
5 |
GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) Desenfoca una imagen usando un filtro gaussiano. |
6 |
integral(Mat src, Mat sum) Calcula la integral de una imagen. |
Ejemplo
El siguiente ejemplo demuestra el uso de la clase Imgproc para aplicar el filtro de caja a una imagen de escala de grises.
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());
}
}
}
Salida
Cuando ejecuta el código dado, se ve el siguiente resultado:
Imagen original
En este ejemplo convolvemos nuestra imagen con el siguiente filtro (kernel). Este filtro hace que la imagen se vuelva borrosa a medida que aumenta su tamaño.
Esta imagen original ha sido convolucionada con el filtro de caja de tamaño 5, que se muestra a continuación:
Filtro de caja de tamaño 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 |