本人比較習慣於Opencv1的代碼寫法,看了最新一本關於Opencv2寫法,雖然原理是一樣的但是寫法差別是很大的,所以我看了Opencv2訪問像素寫法後就嘗試改變爲Opencv1代碼寫法。
下面代碼是網上的:修改圖片的對比度與亮度代碼如下所示,是使用Opencv2代碼寫法
Mat image = imread("./6.jpg");
Mat new_image = Mat::zeros( image.size(), image.type() );
/// 初始化
cout << " Basic Linear Transforms " << endl;
cout << "-------------------------" << endl;
cout << "* Enter the alpha value [1.0-3.0]: ";
cin >> alpha;
cout << "* Enter the beta value [0-100]: ";
cin >> beta;
/// 執行運算 new_image(i,j) = alpha*image(i,j) + beta
for( int y = 0; y < image.rows; y++ )
{
for( int x = 0; x < image.cols; x++ )
{
for( int c = 0; c < 3; c++ )
{
new_image.at<Vec3b>(y,x)[c] = saturate_cast<uchar>( alpha*( image.at<Vec3b>(y,x)[c] ) + beta );
}
}
}
/// 創建窗口
namedWindow("Original Image", 1);
namedWindow("New Image", 1);
/// 顯示圖像
imshow("Original Image", image);
imshow("New Image", new_image);
/// 等待用戶按鍵
waitKey();
下面是我根據原理用Opencv1代碼寫法:
IplImage *src, *dst;
src = cvLoadImage("./6.jpg");
dst = cvCreateImage(cvGetSize(src), src->depth, src->nChannels);
cvZero(dst);
/// 初始化
cout << " Basic Linear Transforms " << endl;
cout << "-------------------------" << endl;
cout << "* Enter the alpha value [1.0-3.0]: ";
cin >> alpha;
cout << "* Enter the beta value [0-100]: ";
cin >> beta;
for( int x = 0; x < src->width ; x++ )
{
for( int y = 0; y < src->height; y++ )
{
for( int c = 0; c < 3; c++ )
{
//new_image.at<Vec3b>(y,x)[c] = saturate_cast<uchar>( alpha*( image.at<Vec3b>(y,x)[c] ) + beta );
((uchar *)(dst->imageData + dst->widthStep * y))[x * 3 + c] = saturate_cast<uchar>(alpha*((uchar *)(src->imageData + src->widthStep * y))[x * 3 + c]+beta);
}
}
}
cvNamedWindow("src");
cvNamedWindow("dst");
cvShowImage("src", src);
cvShowImage("dst", dst);
cvWaitKey();
//銷燬窗口與釋放內存
cvDestroyAllWindows();
cvReleaseImage(&src);
cvReleaseImage(&dst);
return 0;
原圖與處理好圖如下所示: