Pregunta

¿Cómo dar sentido a los datos de imagen de una imagen en escala de grises dado el siguiente escenario: los datos de captura de vídeo I de la "tampón de muestra" y el extracto de una sección de 80x20 y luego convertir eso en una escala de grises UIImage. Pero cuando examino el píxel prima bytes no estoy en condiciones de dar sentido a ellos de una manera que me permitiera seguir y "binarización en" ellos (mi verdadero objetivo).

Cuando Basta con guardar la UIImage al álbum de fotos usando UIImageWriteToSavedPhotosAlbum para verificar qué tipo de datos de imagen que tengo, de hecho consigo una imagen de blanco normal 80x20 (en realidad es la luz grisácea). Me capturaron una imagen en blanco llano para simplificar las cosas, esperando ver sólo los valores entre, por ejemplo, 200 o menos y 255, y sin embargo, hay secciones de los datos de imágenes llenas de ceros, que sugieren claramente filas de píxeles negros. Cualquier ayuda es apreciada. El código relevante y los datos de imagen (16 píxeles a la vez) son a continuación.

Aquí es cómo creo la imagen en escala de grises 80x20 de una parte de los datos de vídeo CMSampleBufferRef:

UIImage *imageFromImage(UIImage *image, CGRect rect)
{   
    CGImageRef sourceImageRef = [image CGImage];  
    CGImageRef newImageRef = CGImageCreateWithImageInRect(sourceImageRef, rect);  

    CGImageRef grayScaleImg = grayscaleCGImageFromCGImage(newImageRef);
    CGImageRelease(newImageRef);  

    UIImage *newImage = [UIImage imageWithCGImage:grayScaleImg scale:1.0 orientation:UIImageOrientationLeft]; 

    return newImage;  
}  

CGImageRef grayscaleCGImageFromCGImage(CGImageRef inputImage) 
{
    size_t width = CGImageGetWidth(inputImage);
    size_t height = CGImageGetHeight(inputImage);

    // Create a gray scale context and render the input image into that
    CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceGray();
    CGContextRef context = CGBitmapContextCreate(NULL, width, height, 8, 
                    4*width, colorspace, kCGBitmapByteOrderDefault);

    CGContextDrawImage(context, CGRectMake(0,0, width,height), inputImage);

    // Get an image representation of the grayscale context which the input
    //    was rendered into.
    CGImageRef outputImage = CGBitmapContextCreateImage(context);

    // Cleanup
    CGContextRelease(context);
    CGColorSpaceRelease(colorspace);

    return (CGImageRef)[(id)outputImage autorelease];
}

y, a continuación, cuando se utiliza el código siguiente para volcar los datos de píxeles de la consola:

    CGImageRef inputImage = [imgIn CGImage];
CGDataProviderRef dataProvider = CGImageGetDataProvider(inputImage);
CFDataRef imageData = CGDataProviderCopyData(dataProvider);
const UInt8 *rawData = CFDataGetBytePtr(imageData);

size_t width = CGImageGetWidth(inputImage);
    size_t height = CGImageGetHeight(inputImage);

    size_t numPixels = height * width;
for (int i = 0; i < numPixels ; i++)
{   
   if ((i % 16) == 0)
          NSLog(@" -%i-%i-%i-%i-%i-%i-%i-%i-%i-%i-%i-%i-%i-%i-%i-%i-\n\n", rawData[i],         
             rawData[i+1], rawData[i+2], rawData[i+3], rawData[i+4], rawData[i+5], 
             rawData[i+6], rawData[i+7], rawData[i+8], rawData[i+9], rawData[i+10], 
             rawData[i+11], rawData[i+12], rawData[i+13], rawData[i+14], rawData[i+15]);
}

Me consistentemente obtener una salida como la siguiente:

-216-217-214-215-217-215-216-213-214-214-214-215-215-217-216-216 -

-219-219-216-219-220-217-212-214-215-214-217-220-219-217-214-219 -

-216-216-218-217-218-221-217-213-214-212-214-212-212-214-214-213 -

-213-213-212-213-212-214-216-214-212-210-211-210-213-210-213-208 -

-212-208-208-210-206-207-206-207-210-205-206-208-209-210-210-207 -

-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0 -

-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0 -

-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0 -

-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0 -

-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0 -

-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0 -

-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0 -

-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0 -

-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0 -

-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0 -

-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0 -

-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0 -

-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0 -

-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0 -

-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0 -

(Esto se repite patrón para los bytes restantes, 80 bytes de datos de píxeles en los 200 de, en función de la iluminación, seguido de 240 bytes de ceros - hay un total de 1600 bytes ya que la imagen es 80x20)

¿Fue útil?

Solución

Este:

CGContextRef context = CGBitmapContextCreate(NULL, width, height, 8, 
                4*width, colorspace, kCGBitmapByteOrderDefault);

En caso de ser:

CGContextRef context = CGBitmapContextCreate(NULL, width, height, 8, 
                width, colorspace, kCGBitmapByteOrderDefault);

En otras palabras, para una imagen gris de 8 bits, el número de bytes por fila es la misma que la anchura.

Otros consejos

Usted probablemente ha olvidado zancada imagen - que está asumiendo que sus imágenes se almacenan como * ancho alto pero varios sistemas de almacenarlos como zancada * altura donde zancada> ancho. Los ceros son relleno que usted debe saltar.

Por cierto, ¿qué quiere decir "de binarización"? Te supongo cuantización media a unos niveles menos grises?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top