Solución:
Un procedimiento general se describe en el artículo de Wikipedia sobre el enmascaramiento de enfoque:
Utiliza un filtro de suavizado gaussiano y resta la versión suavizada de la imagen original (de forma ponderada para que los valores de un área constante permanezcan constantes).
Para obtener una versión mejorada de frame
dentro image
: (ambos cv::Mat
)
cv::GaussianBlur(frame, image, cv::Size(0, 0), 3);
cv::addWeighted(frame, 1.5, image, -0.5, 0, image);
Los parámetros hay algo que debe ajustar usted mismo.
También está el afilado laplaciano, deberías encontrar algo en eso cuando busques en Google.
Puedes probar un simple núcleo y el filter2D función, por ejemplo, en Python:
kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]])
im = cv2.filter2D(im, -1, kernel)
Wikipedia tiene una buena descripción general de los núcleos con algunos ejemplos más aquí: https://en.wikipedia.org/wiki/Kernel_(image_processing)
En el procesamiento de imágenes, un núcleo, una matriz de convolución o una máscara es una matriz pequeña. Se utiliza para difuminar, afilar, grabar en relieve, detectar bordes y más. Esto se logra haciendo una convolución entre un kernel y una imagen.
Puede enfocar una imagen usando una máscara de enfoque. Puede encontrar más información sobre el enmascaramiento de enfoque aquí. Y aquí hay una implementación de Python usando OpenCV:
import cv2 as cv
import numpy as np
def unsharp_mask(image, kernel_size=(5, 5), sigma=1.0, amount=1.0, threshold=0):
"""Return a sharpened version of the image, using an unsharp mask."""
blurred = cv.GaussianBlur(image, kernel_size, sigma)
sharpened = float(amount + 1) * image - float(amount) * blurred
sharpened = np.maximum(sharpened, np.zeros(sharpened.shape))
sharpened = np.minimum(sharpened, 255 * np.ones(sharpened.shape))
sharpened = sharpened.round().astype(np.uint8)
if threshold > 0:
low_contrast_mask = np.absolute(image - blurred) < threshold
np.copyto(sharpened, image, where=low_contrast_mask)
return sharpened
def example():
image = cv.imread('my-image.jpg')
sharpened_image = unsharp_mask(image)
cv.imwrite('my-sharpened-image.jpg', sharpened_image)