代码之家  ›  专栏  ›  技术社区  ›  Tirth

如何使用iphone中的objective-c计算uiimage中的红色像素?

  •  3
  • Tirth  · 技术社区  · 15 年前

    我是iPhone软件开发的初学者。 我开发了一个皮肤癌的应用程序,我想从iphone相机拍摄的uiimage中计算或计数红色像素,可以从uiimage中计数红色像素吗?

    1 回复  |  直到 13 年前
        1
  •  8
  •   Stefan Arentz    15 年前

    因为这个问题几乎每周都会被问到,所以我决定做一个小的示例项目来演示如何做到这一点。您可以在以下位置查看代码:

    http://github.com/st3fan/iphone-experiments/tree/master/Miscellaneous/PixelAccess/

    重要的一点是下面的代码,它需要 UIImage 然后计算纯红色像素的数量。它是一个示例,您可以使用它并对其进行修改以用于您自己的算法:

    /**
     * Structure to keep one pixel in RRRRRRRRGGGGGGGGBBBBBBBBAAAAAAAA format
     */
    
    struct pixel {
        unsigned char r, g, b, a;
    };
    
    /**
     * Process the image and return the number of pure red pixels in it.
     */
    
    - (NSUInteger) processImage: (UIImage*) image
    {
        NSUInteger numberOfRedPixels = 0;
    
        // Allocate a buffer big enough to hold all the pixels
    
        struct pixel* pixels = (struct pixel*) calloc(1, image.size.width * image.size.height * sizeof(struct pixel));
        if (pixels != nil)
        {
            // Create a new bitmap
    
            CGContextRef context = CGBitmapContextCreate(
                (void*) pixels,
                image.size.width,
                image.size.height,
                8,
                image.size.width * 4,
                CGImageGetColorSpace(image.CGImage),
                kCGImageAlphaPremultipliedLast
            );
    
            if (context != NULL)
            {
                // Draw the image in the bitmap
    
                CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, image.size.width, image.size.height), image.CGImage);
    
                // Now that we have the image drawn in our own buffer, we can loop over the pixels to
                // process it. This simple case simply counts all pixels that have a pure red component.
    
                // There are probably more efficient and interesting ways to do this. But the important
                // part is that the pixels buffer can be read directly.
    
                NSUInteger numberOfPixels = image.size.width * image.size.height;
    
                while (numberOfPixels > 0) {
                    if (pixels->r == 255) {
                        numberOfRedPixels++;
                    }
                    pixels++;
                    numberOfPixels--;
                }
    
                CGContextRelease(context);
            }
    
            free(pixels);
        }
    
        return numberOfRedPixels;
    }
    

    下面是一个简单的例子:

    - (IBAction) processImage
    {
        NSUInteger numberOfRedPixels = [self processImage: [UIImage imageNamed: @"DutchFlag.png"]];
        label_.text = [NSString stringWithFormat: @"There are %d red pixels in the image", numberOfRedPixels];
    }
    

    github上的示例项目包含一个完整的工作示例。