使用 pow 进行伽马校正

Posted

技术标签:

【中文标题】使用 pow 进行伽马校正【英文标题】:Gamma Correction with pow 【发布时间】:2016-11-10 12:12:00 【问题描述】:

我会对图像使用伽马校正。 因此,我必须将源图像的每个像素强度设置为 G = 0.6。 我有问题,因为目标图像完全错误。 当我从源图像中获取像素时,也许我遇到了投射问题。 这是我的代码:

#include <opencv2/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <opencv2/imgproc/imgproc.hpp>

using namespace cv;
using namespace std;


int main() 

    Mat src = imread("spine1.jpeg");


    Mat dst = Mat(src.rows, src.cols, CV_8UC1);
    cvtColor(src, src, CV_8UC1);
    dst = Scalar(0);

    for (int x = 0; x < src.rows; x++) 
        for (int y = 0; y < src.cols; y++) 
            int pixelValue = (int)src.at<uchar>(x, y);

            dst.at<uchar>(x, y) = pow(pixelValue, 0.6);

        
    



    namedWindow("Input", CV_WINDOW_AUTOSIZE);
    namedWindow("Output", CV_WINDOW_AUTOSIZE);

    imshow("Input", src);
    imshow("Output", dst);

    waitKey(0);
    return 0;

编辑:将cvtColor(src, src, CV_8UC1); 更改为cvtColor(src, src, COLOR_BGR2GRAY);

【问题讨论】:

你没有在这段代码中使用pow...你到底想在这里做什么?顺便说一句,cvtColor 错了! cvtColor(src, src, COLOR_BGR2GRAY); 对不起,我复制了错误的代码。我编辑了它 是的!这是错误!谢谢。 很高兴它有帮助,作为答案发布 【参考方案1】:

cvtColor 的调用是错误的。你应该使用:

cvtColor(src, src, COLOR_BGR2GRAY);

此外,您可以使您的代码更简单,更不容易出错:

#include <opencv2/opencv.hpp>

int main()

    // Load the image as grayscale
    cv::Mat1b src = cv::imread("path_to_img", cv::IMREAD_GRAYSCALE);

    // Convert to double for "pow"
    cv::Mat1d dsrc;
    src.convertTo(dsrc, CV_64F);

    // Compute the "pow"
    cv::Mat1d ddst;
    cv::pow(dsrc, 0.6, ddst);

    // Convert back to uchar
    cv::Mat1b dst;
    ddst.convertTo(dst, CV_8U);

    // Show results
    imshow("SRC", src);
    imshow("DST", dst);
    waitKey();

    return 0;

【讨论】:

以上是关于使用 pow 进行伽马校正的主要内容,如果未能解决你的问题,请参考以下文章

VC2012哪里找_mm256_pow_pd?

图形学我理解的伽马校正(Gamma Correction)

OpenGL学习脚印:伽马校正(Gamma Correction)

MATLAB 中的 Gamma 校正实现

图像处理基础基于matlab图像SRGB+Adobe RGB伽马校正含Matlab源码 255期

我是不是需要对现代计算机/显示器上的最终颜色输出进行伽玛校正