c++ - 使用 pow 进行 Gamma 校正

标签 c++ opencv opencv3.0 opencv3.1

我会对图像使用 Gamma 校正。 因此,我必须将源图像的每个像素强度设为 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);

最佳答案

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;
}

关于c++ - 使用 pow 进行 Gamma 校正,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40527333/

相关文章:

c++ - 将集合插入/读取到 map 中

python - 从非连续视频帧创建全景图

python - OpenCV Python 中的距离变换自动将 CV_8UC3 转换为 CV_32SC1,从而产生断言错误

python opencv matchTemplate 是否实现了掩码功能?

c++ - WarpAffine 函数在与 openCL 和 opencv 一起使用时抛出错误

c++ - 在分层窗口的子对话框中未单击 CMFCButton

php - 使用哈希表访问 C 中的 PHP 变量 - 指针间接级别的更改

python - IP 摄像机捕获 RTSP 流大延迟 OPENCV

c++ - 静态调度以纠正具有聚合类型层次结构的成员方法

c++ - OpenCV 表单应用-Mat转Grayscale