Quiero convertir una imagen de color a blanco y negro (es decir, no en escala de grises, solo en blanco y negro). ¿Alguien tiene una buena matriz de colores para lograr esto?¿Cuál sería una buena colormatrix en blanco y negro?
Respuesta
fin he encontrado una solución a mi problema:
- transformar la imagen a escala de grises, utilizando así una conocida colormatriz.
- Usar Método SetThreshold de ImageAttributes clase para establecer el umbral que separa el negro de blanco.
Este es el código C#:
using (Graphics gr = Graphics.FromImage(SourceImage)) // SourceImage is a Bitmap object
{
var gray_matrix = new float[][] {
new float[] { 0.299f, 0.299f, 0.299f, 0, 0 },
new float[] { 0.587f, 0.587f, 0.587f, 0, 0 },
new float[] { 0.114f, 0.114f, 0.114f, 0, 0 },
new float[] { 0, 0, 0, 1, 0 },
new float[] { 0, 0, 0, 0, 1 }
};
var ia = new System.Drawing.Imaging.ImageAttributes();
ia.SetColorMatrix(new System.Drawing.Imaging.ColorMatrix(gray_matrix));
ia.SetThreshold(0.8); // Change this threshold as needed
var rc = new Rectangle(0, 0, SourceImage.Width, SourceImage.Height);
gr.DrawImage(SourceImage, rc, 0, 0, SourceImage.Width, SourceImage.Height, GraphicsUnit.Pixel, ia);
}
He Benchmarked este código y es aproximadamente 40 veces más rápido que el píxel por píxel manipulación.
Si desea que parezca medio decente, es probable que desee aplicar algún tipo de oscilación.
Aquí hay una discusión completa, aunque un poco anticuado:
quiero blanco y negro, porque esto sería parte de un proceso de reconocimiento de imágenes, es decir, la detección de algunas formas, independientemente de sus colores. – vbocan
En ese caso, probablemente pueda salirse con la suya en la línea de "Pixel [x, y] = ((R (x, y) + G (x, y) + B (x, y))/3) > = 127? 1: 0 ". –
Esto es lo que ya he intentado, pero alterando la imagen píxel por píxel muy lentamente. – vbocan
versión VB.NET:
Using gr As Graphics = Graphics.FromImage(SourceImage) 'SourceImage is a Bitmap object'
Dim gray_matrix As Single()() = {
New Single() {0.299F, 0.299F, 0.299F, 0, 0},
New Single() {0.587F, 0.587F, 0.587F, 0, 0},
New Single() {0.114F, 0.114F, 0.114F, 0, 0},
New Single() {0, 0, 0, 1, 0},
New Single() {0, 0, 0, 0, 1}
}
Dim ia As New System.Drawing.Imaging.ImageAttributes
ia.SetColorMatrix(New System.Drawing.Imaging.ColorMatrix(gray_matrix))
ia.SetThreshold(0.8)
Dim rc As New Rectangle(0, 0, SourceImage.Width, SourceImage.Height)
gr.DrawImage(SourceImage, rc, 0, 0, SourceImage.Width, SourceImage.Height, GraphicsUnit.Pixel, ia)
End Using
Esa matriz de color BW corrompe el archivo, desde 300dpi fuente el resultado es 96 ppp con 200-300kb tamaño final. Puedo convertir Kofax para jugar, pero el TIF está corrupto para ser procesado en el servidor. También el tamaño no puede ser aceptado.
La mejor manera es simplemente cambiar la codificación a CCITT, que solo BW. El resultado sigue siendo correcto, se mantiene a 300 ppp y el tamaño del archivo resultante es de 30-50 kb. También mucho más eficiente y más rápido que System.DrawImage
.
Ésta es la solución perfecta:
public void toCCITT(string tifURL)
{
byte[] imgBits = File.ReadAllBytes(tifURL);
using (MemoryStream ms = new MemoryStream(imgBits))
{
using (Image i = Image.FromStream(ms))
{
EncoderParameters parms = new EncoderParameters(1);
ImageCodecInfo codec = ImageCodecInfo.GetImageDecoders()
.FirstOrDefault(decoder => decoder.FormatID == ImageFormat.Tiff.Guid);
parms.Param[0] = new EncoderParameter(Encoder.Compression, (long)EncoderValue.CompressionCCITT4);
i.Save(@"c:\test\result.tif", codec, parms);
}
}
}
- 1. ncurses y blanco sobre negro
- 2. ¿Diferenciar entre iPhones en blanco y negro?
- 3. Cómo convertir una imagen a blanco y negro en PHP
- 4. Filtro CI para crear una imagen en blanco y negro?
- 5. Transición de blanco y negro a color?
- 6. Graphics2D: ¿Dibujo negro sobre blanco?
- 7. ¿Cuál es el mejor filtro de imagen central para producir efectos en blanco y negro?
- 8. ¿Por qué blanco/gris/negro en GC?
- 9. NSTextField - Texto blanco sobre fondo negro, pero cursor negro
- 10. Programación con texto blanco sobre fondo negro?
- 11. Histograma apilado de Gnuplot en blanco y negro
- 12. un mapa binario blanco y negro en matplotlib
- 13. MATLAB: Dibujando una línea sobre una imagen en blanco y negro
- 14. ¿Usaría particiones sería una buena idea en tal situación?
- 15. ¿Cuál sería una buena aplicación para una versión mejorada de MapReduce que comparte información entre Mappers?
- 16. Usando python PIL para convertir una imagen RGB en una imagen pura en blanco y negro
- 17. Conversión de una imagen en escala de grises en blanco y negro mediante Aforge.Net
- 18. ¿Cuál sería una buena aplicación de iota_n (falta algoritmo de la STL)
- 19. ¿Cómo puedo visualizar una matriz binaria 2D como un gráfico en blanco y negro?
- 20. ¿Cómo puedo eliminar el fondo negro en Aptana y convertirlo en el blanco normal?
- 21. ¿Cuál sería getDesktopProperty() para Linux?
- 22. cómo hacer que la imagen en color sea en blanco y negro en Android
- 23. CSS: cómo convertir una imagen en color a una imagen de color gris o negro/blanco
- 24. Desplazar un ListView cambia todo, desde Blanco a Negro
- 25. ¿Qué sería una alternativa a [SetUp] y [TearDown] en MSTest?
- 26. ¿Cuál es una buena manera de dibujar imágenes usando pygame?
- 27. ggplot: ¿Paletas de colores recomendadas también se distinguen para la impresión en blanco y negro?
- 28. Mejor umbral para convertir escala de grises a blanco y negro
- 29. Extracto de la imagen en blanco y negro del formato NV21 de la cámara Android
- 30. ¿Cuál es una forma correcta y buena de implementar __hash __()?
Esto hará en blanco y negro (no en escala de grises): 'Nuevo ColorMatrix (New Single()() _ {New Single() {1.5, 1.5, 1.5, 0, 0}, _ New Single() {1.5, 1.5, 1.5 , 0, 0}, _ Nuevo single() {1.5, 1.5, 1.5, 0, 0}, _ Nuevo single() {0, 0, 0, 1, 0}, _ New Single() {-1, - 1, -1, 0, 1}}) ' –
@Otaku: No, su código no funcionará. Le dará un borde más nítido, pero aún valores grises. – Pedery
@Pedery: no debe implementarlo correctamente, eso es exactamente cómo hacer en blanco y negro (sin matices de gris). –