2017-02-16 8 views
0

Я совершенно новый в openCV, но застрял в одном месте.Как нормализовать изображение в openCV?

У меня есть изображение с серой шкалой, но мне нужно нормализовать это изображение. например, у меня есть cv :: mat image у него может быть матрица, содержащая некоторые значения и каждый индекс. Поскольку у меня есть серое изображение, оно может содержать только 1 значение за один индекс. Теперь мне нужно разделить каждое значение на 255.

Есть ли какой-либо метод или средство в openCV на C++. Этот сценарий называется нормировкой в ​​openCV.

cv::Mat originalMat = [OSInference cvMatFromUIImage:imgBeforeProccessing]; 
cv::Mat img2; 

cv::cvtColor(originalMat, img2,CV_BGR2GRAY); 
cv::resize(img2, img2, cv::Size(128, 128), 0, 0, CV_INTER_CUBIC); 
cv::Mat img3; 

Теперь, как нормализовать (означает деление каждого значения в матрице на 255)?

Преобразования матого изображения в IOS изображения следующего

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

    CGColorSpaceRef colorspace; 

    if (cvMat.elemSize() == 1) { 
     colorspace = CGColorSpaceCreateDeviceGray(); 
    }else{ 
     colorspace = CGColorSpaceCreateDeviceRGB(); 
    } 

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

    // Create CGImage from cv::Mat 
    CGImageRef imageRef = CGImageCreate(cvMat.cols, cvMat.rows, 8, 8 * cvMat.elemSize(), cvMat.step[0], colorspace, kCGImageAlphaNone | kCGBitmapByteOrderDefault, provider, NULL, false, kCGRenderingIntentDefault); 

    // get uiimage from cgimage 
    UIImage *finalImage = [UIImage imageWithCGImage:imageRef]; 
    CGImageRelease(imageRef); 
    CGDataProviderRelease(provider); 
    CGColorSpaceRelease(colorspace); 

    return finalImage; 
} 
+0

посмотреть на [это] (http://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html?highlight=mean#normalize) –

+0

Нормализация означает ** мин ** -> 0 и ** max ** -> 1 –

ответ

1

OpenCV есть функция делает именно то, что вы хотите. Это называется convertTo.

cv::Mat img3; 
img2.convertTo(img3, CV_32F, 1.0/255, 0); 
+0

, если я использую мое изображение с серым изображением на несколько цветное изображение (желтоватое), это возможно? – sss

+0

@sss Я не совсем понимаю, что вы имеете в виду – slawekwin

+0

Как я преобразую цветное изображение в серый, а затем применяю метод convertTo .... но после этого мое изображение становится желтоватым ... по моему мнению, серое изображение должно оставаться серым даже после метода convertTo – sss

1

Для нормализации cv :: Mat вы можете использовать cv :: normalize. Я пишу код, который поможет вам.

uchar data[] = {0, 63, 127, 255}; 
cv::Mat im(2, 2, CV_8UC1, data), output; 
# this what you need 0 -> min value after norm 
# 1 -> max value after nom 
# cv::NORM_MINMAX normalize for min and max values 
cv::normalize(im, output, 0, 1, cv::NORM_MINMAX); 
std::cout 
    << im  << '\n' 
    << output << '\n'; 
#================================================== 
# output 
[ 0, 63; 
    127, 255] 
[ 0, 0; 
    0, 1] 
+0

- это нормализация, это то же самое, что я хочу? – sss

+0

@sss Я считаю, что он будет вести себя так же, как решение в моем ответе, но также должен рассчитать коэффициент (1/255), чтобы умножить все значения на себя (см. [Docs] (http: //docs.opencv. org/2.4/modules/core/doc/operations_on_arrays.html # normalize)) – slawekwin

+1

@slawekwin Это не то же самое, что и ваш вопрос (и на самом деле ** неверен **). Это то же самое, только если входное изображение имеет значения 0 и 255, иначе коэффициент масштабирования не равен «1/255» – Miki

Смежные вопросы