图像减均值除方差_图像规范化之OpenCV实现
目录
1、理论基础
2、具体步骤
(1)先计算出图像的方差 var 和 mean
(2)重新计算图像对应位置的灰度值
3、算法实现
4、结果
图像归规范化可以消除其采集过程中造成的灰度变化,使图像自身的均值和方差符合设定值。不仅有增强视觉效果的作用,还可以利用图像像的一致性,给后续的操作提供相同基准。
系统环境:Windows 10 64 位+OpenCV3.4.1 64 位
1、理论基础
图像的灰度均值代表整幅图像灰度平均水平,方差代表图像灰度偏离平均灰度的幅度。因而可以以原图像的灰度均值和均方差为参照,利用设定的基准灰度均值和均方差(标准差),重新调整图像的灰度分布。
根据原图像标准差和给定的标准差比值乘以原图像灰度值与灰度均值的差来调整对应位置的灰度值。调整后整幅图像的灰度值分布在给定均值上下,原图中对应位置灰度小于均值的,调整后图像灰度值仍然小于设定均值,反之亦然。
2、具体步骤
(1)先计算出图像的方差var和mean
其中,W和H分别指图像的宽度和高度,I(x,y)表示图像在(x,y)处的灰度值。
(2)重新计算图像对应位置的灰度值
遍历整幅图像,根据给定的m0均值和标准差v0(m0=80,v0=50),重新计算图像对应位置的灰度值:
3、算法实现
本文以指纹图像的灰度规范化为例,实现图像规范化程序
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
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<uchar>(i, j)-floor(mean[0])));
if (temp > 255)
{
temp = 255;
}else
if (temp < 0)
{
temp = 0;
}
out.at<uchar>(i, j) = temp;
}
}
imshow("src", input);
imshow("normalize", out);
waitKey(0);
system("pause");
return 0;
}
4、结果
上图左侧为输入图像,右侧为调整后的图像。可以发现,在调整后指纹图像中,指纹纹线更清晰,图像整体灰度分布比较均匀。
还没有评论,来说两句吧...