本人比較習慣於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;
原圖與處理好圖如下所示: