如何在OpenCV中标准化图像

How to normalize image in openCV?

本文关键字:标准化 图像 OpenCV      更新时间:2023-10-16

我在opencv中是全新的,并且卡在某一时刻。

我有一个灰度图像,但我需要标准化此图像。例如:我有一个 cv :: mat 图像,它可能具有包含一些值和每个索引的矩阵。由于我有灰色图像,因此每个索引可能只包含1个值。现在,我需要将每个值除以255。

C 中的OPENCV中是否有任何方法或功能?对于这种情况,我相信我要使用的方法在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;
}

openCV具有一个函数,正是您想要的。它称为 convertTo

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

为了正常化的cv ::垫子,您可以使用cv ::正常化。我编写一些代码来帮助您。

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]