天天看点

数字图像处理——灰度变换灰度变换函数

灰度变换

  • 灰度变换函数
    • 1、反转变换
      • 参考代码
      • 效果图与应用场景
    • 2、对数变换
      • 参考代码
      • 效果图与应用场景
    • 3、伽马变换(幂律变换)
      • 参考代码
      • 效果图与应用场景
    • 4、比特平面分层
      • 参考代码
      • 效果图与应用场景

灰度变换函数

对于以像素存储的数字图像来说,可对像素进行相应的操作,可得到处理过后的图像。而对像素邻域进行计算的的叫滤波,对单像素进行变换的叫映射,而这个映射关系就是变换函数。
本文主要介绍的一些主要的灰度变换函数。

1、反转变换

反转变换可将图像的灰度级进行反转,公式可参考下式:

s = L − r − 1 s = L - r -1 s=L−r−1

其中,[0, L-1]为灰度级范围, r为原图像灰度级, s为变换图像灰度级。

参考代码

void inverse(Mat &img)
{
	// 初始化图像迭代器
	MatIterator_<uchar> srcIterStart = img.begin<uchar>();
	MatIterator_<uchar> srcIterEnd = img.end<uchar>();

	while (srcIterStart != srcIterEnd)
	{
		*srcIterStart = 255 - *srcIterStart;
		srcIterStart++;
	}
}

           

效果图与应用场景

数字图像处理——灰度变换灰度变换函数
数字图像处理——灰度变换灰度变换函数

反转图像的使用场景一般用于对原始图像难以分析出不同之处,例如分析乳房组织时,用反转图像更易观察。

2、对数变换

对数变换可分为对数变换和反对数变换,而反对数变换是属于伽马变化(幂律变换)的范围。对数变换公式可参考下列公式:

s = c l o g ( 1 + r ) s = clog(1 + r) s=clog(1+r)

对数变换可拉伸暗像素值,压缩亮像素值。

参考代码

void log_image(Mat &img, uchar rate = 1)
{
	// 初始化图像迭代器
	MatIterator_<uchar> srcIterStart = img.begin<uchar>();
	MatIterator_<uchar> srcIterEnd = img.end<uchar>();

	while (srcIterStart != srcIterEnd)
	{
		*srcIterStart = static_cast <uchar> (rate * log(1 + *srcIterStart));
		srcIterStart++;
	}
}
// 单通道图像标定
Mat standardImageSingle(Mat &src, int rank = 255)
{
	Mat dst = src.clone();
	// 查找数组内的最大值与最小值
	int min = 255, max = 0;
	for (int i = 0; i < src.rows; i++)
		for (int j = 0; j < src.cols; j++)
		{
			if (dst.at<uchar>(i, j) < min)
				min = dst.at<uchar>(i, j);
			if (dst.at<uchar>(i, j) > max)
				max = dst.at<uchar>(i, j);
			// cout << num[i*src.rows + j] <<endl;
		}

	// 对图像像素值进行标定
	for (int i = 0; i < src.rows; i++)
		for (int j = 0; j < src.cols; j++)
		{
			dst.at<uchar>(i, j) = saturate_cast<int>(rank * ((dst.at<uchar>(i, j) - min) * 1.0 / (max - min)));
		}

	return dst;
}
           

效果图与应用场景

数字图像处理——灰度变换灰度变换函数
数字图像处理——灰度变换灰度变换函数

对数变换一般不用于图像的明暗拉伸变换,主要用于傅里叶频谱的缩放,保证低频细节不会被线性缩放丢失,使得频谱可见细节更加明显。因此,对数变换主要用于频谱的标定。

3、伽马变换(幂律变换)

伽马变换是一种常用的变换函数,其公式主要参考下列公式:

s = c r γ s = cr^\gamma s=crγ

参考代码

// 单通道图像标定——数组存储
void standardImageSingleArray(Mat &src, double* num, int rank = 255)
{
	// 查找数组内的最大值与最小值
	double min = 1000000000, max = -1000000000;
	for (int i = 0; i < src.rows; i++)
		for (int j = 0; j < src.cols; j++)
		{
			if (num[i*src.cols + j] < min)
				min = num[i*src.cols + j];
			if (num[i*src.cols + j] > max)
				max = num[i*src.cols + j];
			// cout << num[i*src.cols + j] <<endl;
		}

	// 对图像像素值进行标定
	for (int i = 0; i < src.rows; i++)
		for (int j = 0; j < src.cols; j++)
		{
			src.at<uchar>(i, j) = saturate_cast<int>(rank * ((num[i*src.cols + j] - min) / (max - min)));
		}
}

void gama_image(Mat &img, double gama, double rate = 1)
{
	double* num = new double[img.rows*img.cols];
	int n = 0;
	// 初始化图像迭代器
	MatIterator_<uchar> srcIterStart = img.begin<uchar>();
	MatIterator_<uchar> srcIterEnd = img.end<uchar>();

	while (srcIterStart != srcIterEnd)
	{
		if (*srcIterStart == 0)
			num[n] = 1.0;
		else
			num[n] = rate * pow(*srcIterStart, gama);
		n++;
		srcIterStart++;
	}
	standardImageSingleArray(img, num);
}
           

效果图与应用场景

数字图像处理——灰度变换灰度变换函数
数字图像处理——灰度变换灰度变换函数
数字图像处理——灰度变换灰度变换函数
数字图像处理——灰度变换灰度变换函数
伽马变换一般用于明暗变换,增强对比度, 将暗像素图像变换到亮像素图像,将亮像素图像变换到安像素图像。用于获取,显示图像的各种设备一般都是根据幂律来产生相应的,此现象称之为幂律相应现象。而幂律相应会导致获取或显示的图像过于阴暗(一般幂律响应的指数大于1),所以就需要进行伽马变换,这一操作通常称之为伽马校正。一般各类显示器件中都会内置伽马校正。

上图中,原图就好比输入,经 γ = 2.5 \gamma=2.5 γ=2.5的变换相当于器件类的幂律响应。可见比原图要阴暗的多。

在原图的基础上先进行 γ = 0.4 \gamma=0.4 γ=0.4的变换相当于先进行伽马校正,可见图像明显变明亮了许多,之后再经过幂律响应后,图像效果对比未经过校正的图像要明亮一些。

4、比特平面分层

像素值通常以8bit、16比特、32bit、64bit来存储像素值的,而每个比特都相当于以一个通道,我们可以获取每个比特平面的图像,下列实验以8bit图像为例为大家展示。我们可以通过与操作获取相应的比特平面值。

参考代码

// 获取图像细节
Mat getImageDetails(Mat src, uchar bite = 1)
{
	Mat dst = src.clone();
	for (int i = 0; i < src.rows; i++)
		for (int j = 0; j < src.cols; j++)
		{
			dst.at<uchar>(i, j) = src.at<uchar>(i, j) & bite;
		}
	return dst;
}
           

效果图与应用场景

各比特平面效果图:

数字图像处理——灰度变换灰度变换函数
数字图像处理——灰度变换灰度变换函数
数字图像处理——灰度变换灰度变换函数
数字图像处理——灰度变换灰度变换函数
数字图像处理——灰度变换灰度变换函数
数字图像处理——灰度变换灰度变换函数
数字图像处理——灰度变换灰度变换函数
数字图像处理——灰度变换灰度变换函数
数字图像处理——灰度变换灰度变换函数

比特平面叠加效果图:

数字图像处理——灰度变换灰度变换函数
数字图像处理——灰度变换灰度变换函数
数字图像处理——灰度变换灰度变换函数
上图中低比特平面是图像的细节部分,高比特是轮廓部分。图像叠加高四层比特平面后的图像与原图像差别不大,因为丢失的细节部分对于人类的视觉来说基本是不可见的,因此此项实验可得出,对于图像的存储可只存储高四层比特平面,减少了50%的存储空间。