gpt4 book ai didi

iphone - iPhone 上的灰度图像的图像数据是如何解释的?

转载 作者:行者123 更新时间:2023-12-03 21:21:14 26 4
gpt4 key购买 nike

在给定以下场景的情况下,如何理解灰度图像的图像数据:我从“样本缓冲区”捕获视频数据并提取 80x20 部分,然后将其转换为灰度 UIImage。但是,当我检查原始像素字节时,我无法以一种允许我继续“二值化”它们(我真正的目标)的方式理解它们。

当我简单地使用 UIImageWriteToSavedPhotosAlbum 将 UIImage 保存到相册来验证我拥有的图像数据类型时,我确实得到了一个普通的白色 80x20 图像(实际上是浅灰色的)。为了简化操作,我捕获了一张纯白色图像,希望只能看到 200 左右到 255 之间的值,但图像数据的某些部分全是零,这清楚地表明了黑色像素行。任何帮助表示赞赏。相关代码和图像数据(一次16个像素)如下。

以下是我如何从 CMSampleBufferRef 视频数据的一部分创建 80x20 灰度图像:

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];
}

然后,当我使用以下代码将像素数据转储到控制台时:

    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]);
}

我始终得到如下输出:

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

(此模式对剩余字节重复,200 字节中的 80 字节像素数据,具体取决于光照,后跟 240 字节零 - 由于图像为 80x20,因此总共 1600 字节)

最佳答案

这个:

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

应该是:

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

换句话来说,对于8位灰度图像,每行的字节数与宽度相同。

关于iphone - iPhone 上的灰度图像的图像数据是如何解释的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4433969/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com