Use OpenCV para implementar el algoritmo Halcon (8) enfatizar la mejora de la imagen

El principio del operador se puede encontrar en la documentación oficial.

C:/Archivos de programa/MVTec/HALCON-18.11-Steady/doc/html/reference/operators/emphasize.html

El operador enfatiza las regiones de alta frecuencia (bordes y esquinas) de la imagen. La imagen resultante se ve más nítida.

Primero, el proceso usa un paso bajo (mean_image) para filtrar. El valor de gris resultante (res) se calcula a partir del valor de gris obtenido (media) y el valor de gris original (orig) de la siguiente manera:

                 res := round((orig - mean) * Factor) + orig
 
factor se usa como una medida de aumento de contraste. La división está determinada por el tamaño de la matriz del filtro: cuanto mayor sea la matriz, menor será la división.

Como procesamiento de bordes, los valores de la escala de grises se reflejan en los bordes de la imagen. Se recorta el desbordamiento y/o subdesbordamiento de los valores de escala de grises.

void CImagePreprocessing::emphasize(const cv::Mat &input, cv::Mat &output, int MaskWidth, int MaskHeight, float Factor)
{
    //公式res := round((orig - mean) * Factor) + orig
    //等价于在MaskHeight、MaskWidth的空间内中心化后增加方差
    cv::Mat mean;

    //等价于求指定范围窗口内的均值
    cv::blur(input, mean, cv::Size(MaskWidth, MaskHeight));
    output.create(input.size(), input.type());
    if (input.type() == CV_8UC1)
    {
        for (int i = 0; i < input.rows; i++)
        {
            const uchar *rptr = input.ptr<uchar>(i);
            uchar *mptr = mean.ptr<uchar>(i);
            uchar *optr = output.ptr<uchar>(i);
            for (int j = 0; j < input.cols; j++)
            {
                optr[j] = cv::saturate_cast<uchar>(round((rptr[j] - mptr[j]) * Factor) + rptr[j] * 1.0f);
            }
        }
    }
    else if (input.type() == CV_8UC3)
    {
        for (int i = 0; i < input.rows; i++)
        {
            const uchar *rptr = input.ptr<uchar>(i);
            uchar *mptr = mean.ptr<uchar>(i);
            uchar *optr = output.ptr<uchar>(i);
            for (int j = 0; j < input.cols; j++)
            {
                //饱和转换 小于0的值会被置为0 大于255的值会被置为255
                optr[j * 3] = cv::saturate_cast<uchar>(round((rptr[j * 3] - mptr[j * 3]) * Factor) + rptr[j * 3] * 1.0f);
                optr[j * 3 + 1] = cv::saturate_cast<uchar>(round((rptr[j * 3 + 1] - mptr[j * 3 + 1]) * Factor) + rptr[j * 3 + 1] * 1.0f);
                optr[j * 3 + 2] = cv::saturate_cast<uchar>(round((rptr[j * 3 + 2] - mptr[j * 3 + 2]) * Factor) + rptr[j * 3 + 2] * 1.0f);
            }
        }
    }
}

---

referencias

Opencv implementa la mejora de la imagen, modelada en la función de énfasis de halcon (Imagen: ImageEmphasize: MaskWidth, MaskHeight, Factor:)

Opencv realiza la mejora de la imagen C ++ media)*factor))+entrada//equivalente a agregar varianza Mat media después de centrar en el espacio de MaskHeight y MaskWidth;//equivalente a encontrar la media en el rango especificado ventana blur(input, mean , Tamaño (Ancho de máscara, Altura de máscara)); o https://blog.csdn.net/qq_39969166/article/details/112367716

Supongo que te gusta

Origin blog.csdn.net/libaineu2004/article/details/122485196
Recomendado
Clasificación