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:)