Opencv學習手冊(四)--- 影象灰度變換
阿新 • • 發佈:2019-02-08
#include <opencv2/opencv.hpp> using namespace cv; /* 灰度變換函式ImageAdjust 其中,源影象src和目標影象dst均為8位元的灰度影象 預設的引數值有: [low, high] = [0,1]; [bottom, top] = [0,1]; 線性變換:將源灰度值的[low, high]區間線性變換到[bottom, top]區間 如果變換成功,返回0,否則返回非零值。 */ int ImageAdjust(IplImage* src, IplImage* dst, double low, double high, double bottom, double top) { if( low<0 || low>1 || high <0 || high>1 || bottom<0 || bottom>1 || top<0 || top>1 || low>=high) return -1;//輸入引數值不符合函式要求,則返回失敗值 //將輸入引數縮放到8位元影象的灰度級別[0, 255]上 double low2 = low*255; double high2 = high*255; double bottom2 = bottom*255; double top2 = top*255; double k = (top2 - bottom2)/(high2 - low2);//計算直線斜率 int x,y; double val; //對影象中的畫素逐個進行灰度變換 for( y = 0; y < src->height; y++)//y為畫素的縱座標 { for (x = 0; x < src->width; x++)//x為畫素的橫座標 { val= (uchar) src->imageData [ src->widthStep*y + x]; //得到源影象中畫素點(x, y) 的灰度值 if(val>=1&&val<=125) val=0; if(val>125&&val<=255) val=255; //val = (val - low2)* k + bottom2; //val = 255-val;//影象求反 //越界處理,保證灰度值落在有效的灰度級別內 if(val>255) val=255; if(val<0) val=0; dst->imageData[ dst->widthStep*y + x] = val;//對目標影象的畫素點(x, y)重新賦灰度值 } } return 0; } int main( int argc, char** argv ) { argv[1]="test.jpg"; IplImage *src = 0, *dst = 0; if( argc != 2 || (src=cvLoadImage(argv[1], 0)) == NULL)//引數0表示強制轉換為單通道灰度影象 return -1;//指定讀取灰度影象,否則程式退出 cvNamedWindow( "src", 1 ); cvNamedWindow( "result", 1 ); //以下為影象增強過程 //先複製源影象 dst = cvCloneImage(src); //輸入引數 [0,0.5] 和 [0.5,1]進行灰度變換 if( ImageAdjust( src, dst, 0, 0.5, 0.5, 1)!=0) return -1; cvShowImage( "src", src ); cvShowImage( "result", dst ); cvWaitKey(0); cvDestroyWindow("src"); cvDestroyWindow("result"); cvReleaseImage( &src ); cvReleaseImage( &dst ); return 0; }