图像规范化之OpenCV实现

目录

1、理论基础

2、具体步骤

(1)先计算出图像的方差var和mean

(2)重新计算图像对应位置的灰度值

3、算法实现

4、结果


图像归规范化可以消除其采集过程中造成的灰度变化,使图像自身的均值和方差符合设定值。不仅有增强视觉效果的作用,还可以利用图像像的一致性,给后续的操作提供相同基准。

系统环境:Windows10 64 位+OpenCV3.4.1 64 位

1、理论基础

图像的灰度均值代表整幅图像灰度平均水平,方差代表图像灰度偏离平均灰度的幅度。因而可以以原图像的灰度均值和方差为参照,利用设定的基准灰度均值和均方差,重新调整图像的灰度分布。

根据原有图像标准差和给定标准差(均方差)比值乘以原图像灰度值与灰度均值的差来调整对应位置的灰度值。调整后整幅图像的灰度值分布在给定均值上下,原图中对应位置灰度小于均值的,调整后图像灰度值仍小于设定均值,反之亦然。

2、具体步骤

(1)先计算出图像的方差var和mean

image.png

其中,WH分别指图像的宽度和高度,I(x,y)​表示图像在(x,y)处的灰度值。

(2)重新计算图像对应位置的灰度值

遍历整幅图像,根据给定的m0均值和标准差v0(m0=80,v0=50),重新计算图像对应位置的灰度值:


image.png

3、算法实现

本文以指纹图像的灰度规范化为例,实现图像规范化程序

#include
#include
using namespace cv;

int main(int argc, char *argv[]) 
{
    Mat input = imread("fingerprint.jpg", 0);

    Scalar mean;  //均值
    Scalar stddev;  //标准差

    cv::meanStdDev(input, mean, stddev);  //计算均值和标准差

    double mean_pxl = mean.val[0];
    double stddev_pxl = stddev.val[0];

    //cout << "mean:" << floor(mean[0]) << " " << "stddev:" << floor(stddev[0]) << endl;

    Mat out(input.size(), CV_8UC1, Scalar(0));

    int m0 = 80, f0 = 50;

    for (int i = 0; i < input.rows; i++)    
    {
        for (int j = 0; j < input.cols; j++)
        {
            int temp = 0; 
            temp = m0 + (f0 / floor(stddev[0]))*((input.at(i, j)-floor(mean[0])));

    if (temp > 255)
    {
        temp = 255;
    }else 
    if (temp < 0)
    {
        temp = 0;
    }

       out.at(i, j) = temp;

       }
    }

    imshow("src", input);
    imshow("normalize", out);

    waitKey(0);
    system("pause");

    return 0;
}
image.gif

4、结果

image.png

上图左侧为输入图像,右侧为调整后的图像。可以发现,在调整后指纹图像中,指纹纹线更清晰,图像整体灰度分布比较均匀。


关注公众号【Slater】,回复“1024”即可免费领取110本经典编程电子书。

你可能感兴趣的:(图像规范化之OpenCV实现)