2016-11-10 34 views
2

我會對圖像使用伽馬校正。 所以,我必須用G = 0.6來激發我的源圖像的每個像素強度。 我有問題導致目標圖像完全錯誤。 也許我從源圖像中獲取像素時遇到了投射問題。 這裏我的代碼:帶有pow的伽瑪校正

#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);

+1

你不是在這個代碼中使用'pow'什麼...你真的想在這裏做什麼?順便說一句,'cvtColor'是錯誤的! 'cvtColor(src,src,COLOR_BGR2GRAY);' – Miki

+0

對不起,我複製了錯誤的代碼。我編輯它 – Vito

+0

是的!這是錯誤!謝謝。 – Vito

回答

0

的調用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; 
}