Efecto de matriz de convolución

Use el efecto de matriz de convolve para aplicar un kernel 2D arbitrario a una imagen. Puede usar este efecto para desenfocar, detectar bordes, relieves o afilar una imagen.

El CLSID de este efecto es CLSID_D2D1ConvolveMatrix.

Imagen de ejemplo

En el ejemplo siguiente se muestra la entrada y salida del efecto de matriz de convolución con un kernel de 3 x 3.

Antes
La imagen antes del efecto.
Después
La imagen después de la transformación.
ComPtr<ID2D1Effect> convolveMatrixEffect;
m_d2dContext->CreateEffect(CLSID_D2D1ConvolveMatrix, &convolveMatrixEffect);

convolveMatrixEffect->SetInput(0, bitmap);
float matrix[9] = {-1, -1, -1, -1, 9, -1, -1, -1, -1};
convolveMatrixEffect->SetValue(D2D1_CONVOLVEMATRIX_PROP_KERNEL_MATRIX, matrix);

m_d2dContext->BeginDraw();
m_d2dContext->DrawImage(convolveMatrixEffect.Get());
m_d2dContext->EndDraw();

Propiedades del efecto

Nombre para mostrar y enumeración del índice Descripción
KernelUnitLength
D2D1_CONVOLVEMATRIX_PROP_KERNEL_UNIT_LENGTH
El tamaño de una unidad en el kernel. Las unidades están en (DIP/unidad de kernel), donde una unidad de kernel es el tamaño del elemento en el kernel de convolución. Un valor de 1 (UNIDAD DIP/kernel) corresponde a un píxel de una imagen con 96 PPP.
El tipo es FLOAT.
El valor predeterminado es 1.0f.
ScaleMode
D2D1_CONVOLVEMATRIX_PROP_SCALE_MODE
Modo de interpolación que usa el efecto para escalar la imagen a la longitud de la unidad de kernel correspondiente. Hay seis modos Escalar que varían en calidad y velocidad.
El tipo es D2D1_CONVOLVEMATRIX_SCALE_MODE.
El valor predeterminado es D2D1_CONVOLVEMATRIX_SCALE_MODE_LINEAR.
KernelSizeX
D2D1_CONVOLVEMATRIX_PROP_KERNEL_SIZE_X
El ancho de la matriz del kernel. Las unidades se especifican en unidades de kernel. El tipo es UINT32.
El valor predeterminado es 3.
KernelSizeY
D2D1_CONVOLVEMATRIX_PROP_KERNEL_SIZE_Y
El alto máximo de la matriz kernel. Las unidades se especifican en unidades de kernel. El tipo es UINT32.
El valor predeterminado es 3.
KernelMatrix
D2D1_CONVOLVEMATRIX_PROP_KERNEL_MATRIX
Matriz del kernel que se va a aplicar a la imagen. Los elementos kernel no están enlazados y se especifican como flotantes.
El primer conjunto de números kernelSizeX de FLOAT[] corresponde a la primera fila del kernel. El segundo conjunto de números kernelSizeX corresponde a la segunda fila y así sucesivamente hasta las filas KernelSizeY.
El tipo es FLOAT[].
El valor predeterminado es {0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f}.
Divisor
D2D1_CONVOLVEMATRIX_PROP_DIVISOR
La matriz del kernel se aplica a un píxel y, a continuación, el resultado se divide por este valor.
0 se comporta como un valor de epsilon float.
El tipo es FLOAT.
El valor predeterminado es 1.0f.
Bias
D2D1_CONVOLVEMATRIX_PROP_BIAS
El efecto aplica la matriz del kernel, el divisor y, a continuación, el sesgo se agrega al resultado. El sesgo no está enlazado y sin unidad. El tipo es FLOAT.
El valor predeterminado es 0.0f.
KernelOffset
D2D1_CONVOLVEMATRIX_PROP_KERNEL_OFFSET
Desplaza el kernel de convolución desde una posición centrada en el píxel de salida a una posición que especifique izquierda/derecha y arriba/abajo. El desplazamiento se define en unidades de kernel.
Con algunos desplazamientos y tamaños de kernel, los ejemplos del kernel de convolución no se colocarán en un centro de imágenes de píxeles. Los valores de píxeles del ejemplo de kernel se calculan mediante interpolación bilineal.
El tipo es D2D1_VECTOR_2F.
El valor predeterminado es {0.0f, 0.0f}.
PreserveAlpha
D2D1_CONVOLVEMATRIX_PROP_PRESERVE_ALPHA
Especifica si el kernel de convolución se aplica al canal alfa o solo a los canales de color.
Si establece esta opción en VERDADERO, el kernel de convolución solo se aplica a los canales de color.
Si establece esto en FALSO, el kernel de convolución se aplica a todos los canales.
El tipo es BOOL.
El valor predeterminado es FALSO.
BorderMode
D2D1_CONVOLVEMATRIX_PROP_BORDER_MODE
Modo que se usa para calcular el borde de la imagen, suave o dura. Consulte Modos de borde para obtener más información.
El tipo es D2D1_BORDER_MODE.
El valor predeterminado es D2D1_BORDER_MODE_SOFT.
ClampOutput
D2D1_CONVOLVEMATRIX_PROP_CLAMP_OUTPUT
Si el efecto fija los valores de color a entre 0 y 1 antes de que el efecto pase los valores al siguiente efecto del gráfico. El efecto fija los valores antes de que premultiplique el alfa.
Si establece esto en VERDADERO, el efecto fijará los valores. Si se establece en FALSO, el efecto no sujetará los valores de color, pero otros efectos y la superficie de salida pueden sujetar los valores si no son de precisión suficiente.
El tipo es BOOL.
El valor predeterminado es FALSO.

Modos Escalar

Enumeración Descripción
D2D1_CONVOLVEMATRIX_SCALE_MODE_NEAREST_NEIGHBOR Muestra el punto único más cercano y lo usa. Este modo usa menos tiempo de procesamiento, pero genera la imagen de menor calidad.
D2D1_CONVOLVEMATRIX_SCALE_MODE_LINEAR Usa un ejemplo de cuatro puntos y una interpolación lineal. Este modo genera una imagen de mayor calidad que el modo vecino más cercano.
D2D1_CONVOLVEMATRIX_SCALE_MODE_CUBIC Usa un kernel cúbico de 16 muestras para la interpolación. Este modo usa el tiempo de procesamiento más alto, pero genera una imagen de mayor calidad.
D2D1_CONVOLVEMATRIX_SCALE_MODE_MULTI_SAMPLE_LINEAR Usa 4 muestras lineales dentro de un solo píxel para un buen suavizado de contornos. Este modo es bueno para reducir verticalmente por pequeñas cantidades en imágenes con pocos píxeles.
D2D1_CONVOLVEMATRIX_SCALE_MODE_ANISOTROPIC Usa el filtrado anisotrópico para muestrear un patrón según la forma transformada del mapa de bits.
D2D1_CONVOLVEMATRIX_SCALE_MODE_HIGH_QUALITY_CUBIC Usa un kernel cúbico de alta calidad de tamaño variable para realizar una escala previa de la imagen si la reducción vertical está implicada en la matriz de transformación. A continuación, usa el modo de interpolación cúbica para la salida final.

Nota:

Si no selecciona un modo, el efecto se establece de forma predeterminada en D2D1_CONVOLVEMATRIX_SCALE_MODE_LINEAR.

Modos de borde

Nombre Descripción
D2D1_BORDER_MODE_SOFT El efecto rellena la imagen de entrada con píxeles negros transparentes para muestras fuera de los límites de entrada cuando aplica el kernel de convolución. Esto crea un borde suave para la imagen y, en el proceso, expande el mapa de bits de salida por el tamaño del kernel.
D2D1_BORDER_MODE_HARD El efecto extiende la imagen de entrada con una transformación de borde de tipo reflejado para muestras fuera de los límites de entrada. El tamaño del mapa de bits de salida es igual al tamaño del mapa de bits de entrada.

Mapa de bits de salida

El tamaño de la salida del efecto depende del tamaño del kernel de convolución, el desplazamiento del kernel, la longitud de la unidad de kernel y la configuración del modo de borde.

Requisitos

Requisito Valor
Cliente mínimo compatible Windows 8 y Platform Update para Windows 7 [aplicaciones de escritorio | aplicaciones de la Tienda Windows]
Servidor mínimo admitido Windows 8 y Platform Update para Windows 7 [aplicaciones de escritorio | aplicaciones de la Tienda Windows]
Encabezado d2d1effects.h
Biblioteca d2d1.lib, dxguid.lib

ID2D1Effect