功率校正

Gamma Correction with pow

本文关键字:功率      更新时间:2023-10-16

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

编辑:change cvtColor(src, src, CV_8UC1); in 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;
}