Algoritmo de filtrado de ruido de imagen OpenCV Java binario (blanco y negro)



Algoritmo de filtrado de ruido de imagen OpenCV Java binario (blanco y negro)

En las aplicaciones de procesamiento de imágenes, a menudo nos encontramos con la situación de que los puntos de ruido en la imagen afectan la segmentación y el procesamiento de la imagen. No hay muchos ejemplos de Java de OpenCV . Este artículo proporciona un algoritmo de filtrado de ruido de imagen en el entorno OpenCV + Java .

Versión OpenCV : 3.4

Java : 1.8

 

Filtre los puntos de ruido en la imagen en blanco y negro (binaria), puede especificar el tamaño del área de filtro.

Descripción del algoritmo:

  1. Ingrese la imagen a filtrar (binario en blanco y negro).

  2. Extender la imagen (aumentar la longitud y el ancho en 2 cada uno ) equivale a agregar un círculo alrededor de la imagen para facilitar el procesamiento y reducir muchas operaciones de detección de límites.

  3. Comience a hacer un bucle desde el primer píxel.

  4. Con el píxel especificado como centro (y se debe considerar el tamaño del área de filtro), extraiga la subimagen del área especificada. El tamaño del área extraída es el tamaño del área a filtrar más un círculo que lo encierra.

  5. Asigne un valor de 0 (negro) a la parte central rodeada por el área extraída excepto ;

  6. Encuentre la media de las subimágenes ( Core.mean() );

  7. Si el valor medio no es 0 , significa que hay puntos (puntos blancos) que no son 0 y no se realiza ningún filtrado.

  8. Si el valor medio es 0 , significa que el borde exterior es un círculo de puntos negros ( 0 ), luego realice el filtrado (asigne el área central de la imagen original a 0 ).

 

código fuente:

    // Filtrado de imágenes, eliminación de puntos de ruido

    /**

     * @param src : la imagen binaria de entrada (en blanco y negro), el algoritmo modificará directamente la imagen de entrada y el resultado devuelto también es este parámetro

     * @param size : el tamaño del bloque de ruido que debe filtrarse, el valor predeterminado es un bloque cuadrado con tamaño como tamaño

     */

    public static void noiseFilter(Mat src , int size ) {

        // alto de la imagen, ancho

        int filas = src .rows();

        int cols = src .cols();

        if ( tamaño < 1 || tamaño > filas || tamaño > columnas || src .channels() != 1) {

            volver ;

        }

        // extender la imagen

        Mat rslt = Mat. ceros ( filas +2, columnas +2, CvType. CV_8UC1 );

        // Copia la imagen original a la imagen extendida

        Rect roi = new Rect(1, 1, cols , filas );

        Mat m = rslt.submat ( roi );

        src .copyTo( m );

        // Preparación de parámetros de filtro

        Mat mCheque = Mat. ceros ( tamaño +2, tamaño +2, CvType. CV_8UC1 );

        Mat mMask =  Mat.zeros(size, size, CvType.CV_8UC1);

        Rect roiCheck = new Rect(0, 0, size+2, size+2);

        Rect roiMask = new Rect(1, 1, size, size);

        Mat mRoiSrc, mRoiMask;

        Scalar mean;

        for(int i=1; i<=(rows-size+1); i++) {

            for(int j=1; j<=(cols-size+1); j++) {

                roiCheck.x = j-1;

                roiCheck.y = i-1;

                // 截取原图(实际是基于扩展后的图像操作)一部分执行检测

                mRoiSrc = rslt.submat(roiCheck);

                // 拷贝到检测对象以免操作影响到原图

                mRoiSrc.copyTo(mCheck);

                // 以黑点覆盖检测图像中心部分

                mRoiMask = mCheck.submat(roiMask);

                mMask.copyTo(mRoiMask);

                // 求图像均值,如果不为0,则继续循环;如果为0,则执行过滤操作

                mean = Core.mean(mCheck);

                if((byte)mean.val[0] != 0) {

                    continue;

                }

                // 执行过滤操作

                // mRoiMask为空(全黑),则以黑色小方块覆盖原图

                mRoiMask = src.submat(new Rect(j-1,i-1,size,size));

                mMask.copyTo(mRoiMask);

            }

        }

    }

 

 

说明:

  1. 所示例算法基于图像背景为黑色点(值为0),前景为白色点(值为255)计算,如果黑白反转,可方便的调整代码适应。

  2. 算法的效率还有改进之处,当图片比较大时,可能需要秒级的处理时间。

 

 

Supongo que te gusta

Origin blog.csdn.net/wangyulj/article/details/79082896
Recomendado
Clasificación