• 【C++】pow函数实现的伽马变换详解和示例


    本文通过原理和示例对伽马变换进行详解,并通过改变变换系数展示不同的效果,以帮助大家理解和使用。

    原理

    伽马变换是一种用于图像增强的技术,它可以用来提高或降低图像的对比度,常用于医学图像处理和计算机视觉等领域。伽马变换是通过将图像像素值映射到一个新的值,以达到对比度增强的效果。

    伽马变换步骤具体可分为:
    (1)图像转为灰度或自身便为灰度图像。
    (2)像素值归一化到0-1之间
    (3)计算像素值的gam此幂的值,使用pow函数,得到的值便为新图像的像素值。
    pow()函数示例如下:

    在头文件#include 中,函数原型:
    double pow (double base, double exponent);
    它接受两个参数:base(基数)和exponent(指数)。返回结果是基数的指数次幂。注意,pow函数可以用于浮点数和整数。对于整数,返回的结果也是整数,且只返回最接近的整数。
    
    示例:
    pow(2,3)表示2的3次幂,输出结果为8
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    运行示例

    #include 
    #include 
    
    using namespace cv;
    using namespace std;
    
    void gammaTransform(Mat& img, Mat& result, double gamma) {
        result = img.clone();
        for (int y = 0; y < img.rows; y++) {
            for (int x = 0; x < img.cols; x++) {
                int index = y * img.cols + x;
                double pixel = img.at<uchar>(y, x);
                double transformed = pow((pixel / 255.0), gamma);
                result.at<uchar>(y, x) = round(transformed * 255.0);
            }
        }
    }
    
    int main() {
        // 读取图像
        Mat img = imread("ceshi.jpg", IMREAD_GRAYSCALE);
        if (img.empty()) {
            cout << "Could not open or find the image" << endl;
            return -1;
        }
    
        // 创建目标图像
        Mat result;
    
        // 应用伽马变换,通过改变gam的值改变效果
        double gam = 0.5;
    
        gammaTransform(img, result,gam);
    
        // 显示和保存结果
        namedWindow("Source Image", WINDOW_NORMAL);
        imshow("Source Image", img);
        waitKey(0);
        destroyAllWindows();
    
        namedWindow("Gamma Transformed Image", WINDOW_NORMAL);
        imshow("Gamma Transformed Image", result);
        waitKey(0);
        destroyAllWindows();
        imwrite("grayceshi.jpg", img); // 保存结果图像
        imwrite("output0.5.jpg", result); // 保存结果图像
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    在这段代码中,我们首先使用OpenCV库中的imread函数读取输入图像。然后,我们创建一个新的Mat对象来存储伽马变换后的图像。接着,我们定义了一个名为gammaTransform的函数,该函数接受一个Mat对象(用于读取和写入图像数据)、一个Mat对象(用于存储结果图像)以及一个gamma系数。在函数内部,我们对每个像素应用伽马变换,并将结果存储在结果图像中。最后,我们在主函数中调用gammaTransform函数,显示源图像和变换后的图像,并保存结果图像。
    下面我们通过改变gam的系数值来看具体的变换效果。
    在这里插入图片描述
    上面的为原图(灰度图),下面为改变系数的效果图。

    系数为0.2

    在这里插入图片描述

    系数为0.5

    在这里插入图片描述

    系数为0.8

    在这里插入图片描述

    系数为2

    在这里插入图片描述

    系数为5

    在这里插入图片描述

    总结

    伽马系数γ=1时,图像不变。如果图像整体或者感兴趣区域较暗,则令0<γ<1,可以增加图像对比度;相反,如果图像整体或者感兴趣区域较亮,则令1<γ可以降低图像对比度。
    通过不同系数值的效果展示也可以看出,系数值在0和1之间时,值越小图像越亮。系数值大于1时,值越大图像越暗。

  • 相关阅读:
    快排,代码思路详解
    初阶扫雷(超详解)
    毫米波雷达技术在自动驾驶中的关键作用:安全、精准、无可替代
    Python之Urllib使用
    BlueToolFixup.kext2.6.5(所有蓝牙部分驱动)
    北京筑龙出席安徽省《电子招标投标办法》修订意见研讨会并发言
    详谈跨域问题
    unity基础之协程
    动态路由协议RIP(思科、华为)
    控制输入流,从控制台打印到文件中,更改输出的位置
  • 原文地址:https://blog.csdn.net/qq_22734027/article/details/134503428