我会对图像使用 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/