使用IplImage的图像对比度和亮度



请查看以下代码

using namespace cv;
double alpha = 1.6;
int beta = 50;
int i = 0;
IplImage* input_img = cvLoadImage("c:\Moori.jpg", CV_LOAD_IMAGE_GRAYSCALE);
IplImage* imageGray = cvCreateImage(cvSize(input_img->width, input_img->height), IPL_DEPTH_8U, 1);
    for( int y = 0; y < input_img->height; y++ )
    { 
        for( int x = 0; x < input_img->width; x++ )
        { 
            i = y * imageGray->width + x;
            imageGray->imageData[i] = (alpha * input_img->imageData[i]) + beta;
        }
    }
cvNamedWindow("Image IplImage", 1);
cvShowImage("Image IplImage", imageGray);
waitKey();
cvReleaseImage(&imageGray);
cvReleaseImage(&input_img);
cvDestroyWindow("Image IplImage");

当我运行这个代码时,它显示了一个带有许多暗像素的图像。但是,当我运行代码时,该代码位于:http://docs.opencv.org/doc/tutorials/core/basic_linear_transform/basic_linear_transform.html它运行良好。我想通过IplImage来做。请帮助

satellite_cast适用于c++。http://docs.opencv.org/modules/core/doc/intro.html

终于,我解决了这个问题。

IplImage* img;
cvNamedWindow("Display");
while(true)
{
    img = cvLoadImage("Moori.jpg");
    CvScalar brVal = cvScalarAll(abs(10.0));
    cvAddS(img, brVal, img, NULL);
    IplImage *pTempImg = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, img->nChannels);
    cvSet( pTempImg, cvScalarAll(1), NULL );
    double scale = 1.5;
    cvMul(img, pTempImg, img, scale);
    cvReleaseImage(&pTempImg);
    cvShowImage("Display", img);
    cvReleaseImage(&img);
    int c=cvWaitKey(10);              
    if(c==27) break;
}
cvDestroyWindow("Display");

您不必图像值强制转换为uchar。您必须值重新解释为uchar。这意味着您必须假设数据位实际上表示unsigned char,而不考虑指针的类型。可以按如下方式进行:

uchar* ptr = reinterpret_cast<uchar*>(imageGray->imageData);
ptr[i] = saturate_cast<uchar>(alpha * ptr[i] + beta);

如果您使用C++,我不知道为什么有人会想要使用IplImage。但你的问题是这条线

 imageGray->imageData[i] = (alpha * input_img->imageData[i]) + beta;

它可能会溢出。此外,imageData是一个char*,并且一个char可能是有符号的,也可能是无符号的,您需要使其无符号。您需要使用saturate_cast来防止溢出,并使用强制转换来消除签名的char:

imageGray->imageData[i] = saturate_cast<uchar>((alpha * static_cast<uchar>(input_img->imageData[i])) + beta);

你可以使用这个小程序来看看发生了什么:

#include <opencv2/core/core.hpp>
#include <iostream>     // std::cout
#include <vector>       // std::vector
int main(int argc, char** argv)
{
    double alpha = 1.6;
    int beta = 50;
    std::vector<uchar> z;
    for(int i = 0; i <= 255; ++i)
        z.push_back(i);
    char* zp = reinterpret_cast<char *>(&z[0]);
    for(int i = 0; i <= 255; ++i)
        std::cout << i << " -> " << int(cv::saturate_cast<uchar>(alpha * static_cast<uchar>(zp[i]) + beta))  << std::endl;
}

相关内容

  • 没有找到相关文章

最新更新