gpt4 book ai didi

ios - 将 RGB 图像转换为灰度并将灰度转换为 RGB 图像?

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:16:10 27 4
gpt4 key购买 nike

我已成功将图像转换为灰度图像,我想将灰度图像恢复为 RGB 图像。请帮忙。提前致谢。

-(UIImage *) toGrayscale
{

const int RED = 1;
const int GREEN = 2;
const int BLUE = 3;

Create image rectangle with current image width/height
CGRect imageRect = CGRectMake(0, 0, self.size.width * self.scale, self.size.height * self.scale);

int width = imageRect.size.width;
int height = imageRect.size.height;

// the pixels will be painted to this array
uint32_t *pixels = (uint32_t *) malloc(width * height * sizeof(uint32_t));

// clear the pixels so any transparency is preserved
memset(pixels, 0, width * height * sizeof(uint32_t));

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

// create a context with RGBA pixels
CGContextRef context = CGBitmapContextCreate(pixels, width, height, 8, width * sizeof(uint32_t), colorSpace,
kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedLast);

// paint the bitmap to our context which will fill in the pixels array
CGContextDrawImage(context, CGRectMake(0, 0, width, height), [self CGImage]);

for(int y = 0; y < height; y++) {
for(int x = 0; x < width; x++) {
uint8_t *rgbaPixel = (uint8_t *) &pixels[y * width + x];

// convert to grayscale using recommended method: http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale
uint8_t gray = (uint8_t) ((30 * rgbaPixel[RED] + 59 * rgbaPixel[GREEN] + 11 * rgbaPixel[BLUE]) / 100);

// set the pixels to gray
rgbaPixel[RED] = gray;
rgbaPixel[GREEN] = gray;
rgbaPixel[BLUE] = gray;
}
}

// create a new CGImageRef from our context with the modified pixels
CGImageRef image = CGBitmapContextCreateImage(context);

// we're done with the context, color space, and pixels
CGContextRelease(context);
CGColorSpaceRelease(colorSpace);
free(pixels);

// make a new UIImage to return
UIImage *resultUIImage = [UIImage imageWithCGImage:image
scale:self.scale
orientation:UIImageOrientationUp];

// we're done with image now too
CGImageRelease(image);

return resultUIImage;
}

最佳答案

要回答关于转换的问题,您的灰度代码:

uint8_t gray = (uint8_t) ((30 * rgbaPixel[RED] + 59 * rgbaPixel[GREEN] + 11 * rgbaPixel[BLUE]) / 100);

给出关系:

S = 0.3R + 0.59G + 0.11B

RGBS 涉及用一个方程求解一个未知数 (S)(很好!)。转换 就像在给定一个不可能的方程式的情况下尝试三个未知数 (RGB)。

进行灰度着色的一种技巧是将灰度视为强度,并设置

R = G = B = S - 但这不会正确恢复您的颜色(显然)。所以简而言之,转换为灰度是一个不可逆的函数,就像一个数字的平方(是正数还是负数?)- 信息丢失并且无法检索。

关于ios - 将 RGB 图像转换为灰度并将灰度转换为 RGB 图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23133469/

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