请查看以下代码
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来做。请帮忙
答案 0 :(得分:1)
saturate_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");
答案 1 :(得分:0)
如果您使用的是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;
}
答案 2 :(得分:0)
您不必将强制图像值转换为uchar
。您必须重新解释值为uchar
。它意味着您必须假设数据位实际上代表unsigned char
,而不管指针的类型。它可以按如下方式完成:
uchar* ptr = reinterpret_cast<uchar*>(imageGray->imageData);
ptr[i] = saturate_cast<uchar>(alpha * ptr[i] + beta);