1. 程式人生 > >Opencv學習手冊(四)--- 影象灰度變換

Opencv學習手冊(四)--- 影象灰度變換

#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;
}