图像处理 01反转变换+对数变换+幂律变换
目录
2.3 幂律变换(Power-Law Transformations)
1、定义
图像增强就是指通过某种图像处理方法对退化的某些图像特征,如边缘、轮廓、对比度等进行处理,以改善图像的视觉效果,提高图像的清晰度,或是突出图像中的某些“有用”,压缩其他“无用”信息,将图像转换为更适合人或计算机分析处理的形式。
图像增强可以分为两类:空间域法和频域法。
空间域可以简单地理解为包含图像像素的空间,空间域法是指空间域中,也就是图像本身,直接对图像进行各种线性或非线性运算,对图像的像素灰度值做增强处理。
频域法则是在图像的变换域中把图像看成一种二维信号,对其进行基于二维傅里叶变换的信号增强。对其进行基于二维傅里叶变换的信号增强。
2、三种基本函数
2.1 反转变换(Image Negatives)
反转变换就是负片特效所使用的图像变换,其变换公式为: s = L - 1 - r ,其中 r是原始像素值,s是变换后的像素值,L-1表示图像像素的最大灰度,如8bit图像L为256。
反转变换特别适合增强嵌入在一幅图像暗区域中的白色或灰色细节,特别是在黑色在图像范围占主导地位时。
代码:
void CBmp::invertImage(unsigned char* img_data, int bmpWidth, int bmpHeight, int lineByte)
{
for (int i = 0; i < bmpHeight; i++) {
for (int k = 0; k < bmpWidth; k++) {
img_data[3 * k + 0] = 255 - img_data[3 * k + 0]; // 反转蓝色通道
img_data[3 * k + 1] = 255 - img_data[3 * k + 1]; // 反转绿色通道
img_data[3 * k + 2] = 255 - img_data[3 * k + 2]; // 反转红色通道
}
img_data += lineByte;
}
}
实现效果:
2.2 对数变换(Log Transformations)
对数变换公式为:s=clog(1+r)
r是原始像素值,s是变换后的像素值,c是常数,这个常数的选择是为了确保对数变换后的像素值能够被映射到 [0, 255] 的范围内,保证对比度增强的效果。
图像的对数变换主要的作用是压缩动态范围,原因是对数曲线在像素值较低的区域斜率大,在像素值较高的区域斜率较小,所以图像经过对数变换后,较暗区域的对比度将有所提升,所以就可以增强图像的暗部细节。
对数变换可以将图像的低灰度值部分扩展,显示出低灰度部分更多的细节,将其高灰度值部分压缩,减少高灰度值部分的细节,从而达到图像偏暗的图像增强的目的,其逆变换可以强调高灰度。底数越大,对低灰度部分的强调就越强,对高灰度部分的压缩也就越强。相反的,如果想强调高灰度部分,则用反对数函数就可以了。
代码:
//对数变换
void CBmp::logTransform(unsigned char* img_data, int bmpWidth, int bmpHeight, int lineByte)
{
const double c = 255.0 / log(1.0 + 255.0); // 常数
for (int i = 0; i < bmpHeight; i++) {
for (int k = 0; k < bmpWidth; k++) {
double pixelValue = img_data[3 * k + 0]; // 取蓝色通道作为像素值(你可以选择其他通道)
// 对数变换公式
pixelValue = c * log(1.0 + pixelValue);
// 将变换后的值限制在 [0, 255] 范围内
pixelValue = max(0.0, min(255.0, pixelValue));
img_data[3 * k + 0] = static_cast<unsigned char>(pixelValue);
img_data[3 * k + 1] = static_cast<unsigned char>(pixelValue);
img_data[3 * k + 2] = static_cast<unsigned char>(pixelValue);
}
img_data += lineByte;
}
}
实现效果:
2.3 幂律变换(Power-Law Transformations)
幂律变换的基本形式为:
其中c和γ为常数,习惯上幂律变换的指数称为伽玛(gamma),因此幂律变换又称为伽玛变换。幂律变换,可以使得较窄范围的暗色像素输入值映射为较广范围的输出值,而对高灰度值则会收窄其输出值范围。γ值大于1时则效果与此相反。而当c和γ都等于1时,幂律变换就是恒等变换(identity transformation)。
图像获取、 打印和显示等设备的输入、 输出响应通常为非线性的, 满足幂律关系。 为了得到正确的输出结果而对这种幂律关系进行校正的过程称之为伽玛校正。
伽马变换主要用于图像的校正,将漂白的图片或者是过黑的图片,进行修正。 在低灰度值时,幂律变换使得目标图像灰度值变得更小,因此会使得暗的图像更暗,亮的更亮。
代码:
//幂律变换
void CBmp::powerLawTransform(unsigned char* img_data, int bmpWidth, int bmpHeight, int lineByte, double gamma)
{
const double c = 255.0 / pow(255.0, gamma); // 常数
for (int i = 0; i < bmpHeight; i++) {
for (int k = 0; k < bmpWidth; k++) {
double pixelValue = img_data[3 * k + 0]; // 取蓝色通道作为像素值(你可以选择其他通道)
// Power-Law Transformations 公式
pixelValue = c * pow(pixelValue, gamma);
// 将变换后的值限制在 [0, 255] 范围内
pixelValue = max(0.0, min(255.0, pixelValue));
img_data[3 * k + 0] = static_cast<unsigned char>(pixelValue);
img_data[3 * k + 1] = static_cast<unsigned char>(pixelValue);
img_data[3 * k + 2] = static_cast<unsigned char>(pixelValue);
}
img_data += lineByte;
}
}
实现效果:
参考博文链接:https://blog.csdn.net/qq_40732350/article/details/114368326
https://blog.csdn.net/LaoYuanPython/article/details/117605784
数字图像处理中对数变换与Gamma变换_伽马变换适用于具有什么特点的图像_&星火的博客-CSDN博客
数字图像处理-python基于opencv代码实现 反转变换、对数变换和幂律(伽马)变换_cv2 伽马变换-CSDN博客