2017-08-24 226 views
0

我在這裏經歷了許多類似的問題,但它沒有給出我需要的特定輸出。我曾嘗試將圖像轉換爲黑白圖像,但由於某些原因,某些文字看起來不清晰,或者我們可能會說變形。下面這裏是我想要的是here,我至今嘗試過的代碼......使用OpenCV iOS將圖像轉換爲黑白(非灰度)Objective C

+(UIImage *)grayImage:(UIImage *)processedImage{ 

     cv::Mat grayImage = [MMOpenCVHelper cvMatGrayFromAdjustedUIImage:processedImage]; 

     cv::adaptiveThreshold(grayImage, grayImage, 255, cv::ADAPTIVE_THRESH_GAUSSIAN_C, cv::THRESH_BINARY, 11, 2); 

     cv::GaussianBlur(grayImage, grayImage, cv::Size(1,1), 50.0); 

     UIImage *grayeditImage=[MMOpenCVHelper UIImageFromCVMat:grayImage]; 
     grayImage.release(); 

     return grayeditImage; 

    } 

+ (cv::Mat)cvMatGrayFromAdjustedUIImage:(UIImage *)image { 
    cv::Mat cvMat = [self cvMatFromAdjustedUIImage:image]; 
    cv::Mat grayMat; 
    if (cvMat.channels() == 1) { 
     grayMat = cvMat; 
    } 
    else { 
     grayMat = cv :: Mat(cvMat.rows,cvMat.cols, CV_8UC1); 
     cv::cvtColor(cvMat, grayMat, cv::COLOR_BGR2GRAY); 
    } 
    return grayMat; } 

+ (cv::Mat)cvMatFromAdjustedUIImage:(UIImage *)image { 
    CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage); 
    CGFloat cols = image.size.width; 
    CGFloat rows = image.size.height; 

    cv::Mat cvMat(rows, cols, CV_8UC4); // 8 bits per component, 4 channels 

    CGContextRef contextRef = CGBitmapContextCreate(cvMat.data,     // Pointer to backing data 
                cols,      // Width of bitmap 
                rows,      // Height of bitmap 
                8,       // Bits per component 
                cvMat.step[0],    // Bytes per row 
                colorSpace,     // Colorspace 
                kCGImageAlphaNoneSkipLast | 
                kCGBitmapByteOrderDefault); 

    CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), image.CGImage); 
    CGContextRelease(contextRef); 
    return cvMat; } 

+ (UIImage *)UIImageFromCVMat:(cv::Mat)cvMat { 
    NSData *data = [NSData dataWithBytes:cvMat.data length:cvMat.elemSize()*cvMat.total()]; 
    CGColorSpaceRef colorSpace; 
    CGBitmapInfo bitmapInfo; 

    if (cvMat.elemSize() == 1) { 
     colorSpace = CGColorSpaceCreateDeviceGray(); 
     bitmapInfo = kCGImageAlphaNone | kCGBitmapByteOrderDefault; 

    } else { 
     colorSpace = CGColorSpaceCreateDeviceRGB(); 
     bitmapInfo = kCGBitmapByteOrder32Little | (
                cvMat.elemSize() == 3? kCGImageAlphaNone : kCGImageAlphaNoneSkipFirst 
                ); 
    } 

    CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data); 

    // Creating CGImage from cv::Mat 
    CGImageRef imageRef = CGImageCreate(cvMat.cols,         //width 
             cvMat.rows,         //height 
             8,           //bits per component 
             8 * cvMat.elemSize(),      //bits per pixel 
             cvMat.step[0],       //bytesPerRow 
             colorSpace,         //colorspace 
             bitmapInfo,// bitmap info 
             provider,         //CGDataProviderRef 
             NULL,          //decode 
             false,          //should interpolate 
             kCGRenderingIntentDefault     //intent 
             ); 



    // Getting UIImage from CGImage 
    UIImage *finalImage = [UIImage imageWithCGImage:imageRef]; 
    CGImageRelease(imageRef); 
    CGDataProviderRelease(provider); 
    CGColorSpaceRelease(colorSpace); 
    return finalImage; } 

,我從上面的代碼是here得到的輸出,結果,任何幫助將是巨大的..!謝謝

EDITED: - 原始圖片here

+0

請添加原始輸入圖像。 –

+0

請檢查編輯問題@DanMašek –

+0

使用cv :: threshold函數.http://stackoverflow.com/questions/19762959/proper-thresholding-function-in-opencv-c –

回答

0

我想回答我的問題,我可能會有所幫助。我通過改變自適應閾值算法和塊大小來獲得B/W輸出,下面是使用的代碼:

+(UIImage *)grayImage:(UIImage *)processedImage{ // B/W 

    cv::Mat grayImage = [MMOpenCVHelper cvMatGrayFromAdjustedUIImage:processedImage]; 
    cv::adaptiveThreshold(grayImage, grayImage, 255, cv::ADAPTIVE_THRESH_MEAN_C, cv::THRESH_BINARY, 11, 7); 
    cv::GaussianBlur(grayImage, grayImage, cv::Size(1,1), 50.0); 

    UIImage *grayeditImage=[MMOpenCVHelper UIImageFromCVMat:grayImage]; 
    grayImage.release(); 

    return grayeditImage; 
}