OpenCV常用的灰度變換方法

1.圖像的反色

代碼如下:

void MakeMat()  
{  
     IplImage* src = NULL;  
  
     //加載圖片至內存  
     src = cvLoadImage("E:\\圖片\\測試用\\2.jpg");  
     if (NULL == src)  
     {  
         return;  
     }  
  
     //獲取圖片的一些屬性  
     int height = src->height;                     // 圖像高度  
     int width = src->width;                       // 圖像寬度(像素爲單位)  
     int step = src->widthStep;                 // 相鄰行的同列點之間的字節數  
     int channels = src->nChannels;         // 顏色通道數目 (1,2,3,4)  
     uchar *data   = (uchar *)src->imageData;  
  
  
     //創建標題名爲“美女”的對話框  
     cvNamedWindow("原圖",0);  
	 cvResizeWindow("原圖",600,800); 
  
     //創建名爲“反色”的對話框  
     cvNamedWindow("反色",0);  
	 cvResizeWindow("反色",600,800); 
     cvShowImage("原圖",src);  
  
  
     //反色操作  
     for(int i=0;i != height; ++ i)   
     {  
         for(int j=0;j != width; ++ j)  
         {  
             for(int k=0;k != channels; ++ k)  
             {  
              data[i*step+j*channels+k]=255-data[i*step+j*channels+k];   	

             }  
         }
     }   
          
  
     //將圖片顯示到對話框中  
     cvShowImage("反色",src);  
     cvWaitKey(0);  
  
     //釋放內存與對話框銷燬  
     cvReleaseImage(&src);  
     cvDestroyWindow("原圖");  
     cvDestroyWindow("反色");  
  
     //退出  
     exit(0);  
}  
效果如下:


2.伽馬變換

源代碼如下:

int ImageAdjust(IplImage* src, IplImage* dst,  
	double low, double high,   // X方向:low and high are the intensities of src  
	double bottom, double top, // Y方向:mapped to bottom and top of dst  
	double gamma )  
{  
	double low2 = low*255;  
	double high2 = high*255;  
	double bottom2 = bottom*255;  
	double top2 = top*255;  
	double err_in = high2 - low2;  
	double err_out = top2 - bottom2;  
	int x,y;  
	double val;  
	int step = src->widthStep;                 // 相鄰行的同列點之間的字節數  
	 int channels = src->nChannels;         // 顏色通道數目 (1,2,3,4)  
	 uchar *data   = (uchar *)src->imageData;  
	// intensity transform  
	for( y = 0; y < src->height; y++)  
	{  
		for (x = 0; x < src->width; x++)  
		{  
			 for(int k=0;k != channels; ++ k)  
			 {
				val = data[y*step+x*channels+k];  
				val=pow((val - low2)/err_in, gamma)*err_out+bottom2;  
				if(val>255)  
					val=255;  
				if(val<0)  
					val=0; // Make sure src is in the range [low,high]  
				data[y*step+x*channels+k] =  val;  
			 }
		
		}  
	}  
	return 0;  
}  
int _tmain(int argc, _TCHAR* argv[])
{
	char *filename="E:\\圖片\\測試用\\2.jpg";  
	IplImage *dst,*src = cvLoadImage(filename);  
	if(!src)  
	{  
		printf("Couldn't seem to Open %s, sorry/n",filename);  
		return -1;  
	}  

	cvNamedWindow( "src",0); 
	 cvResizeWindow("src",600,800); 
	cvNamedWindow( "result", 0 );  
	 cvResizeWindow("result",600,800); 
	// Image adjust  
	dst = cvCloneImage(src);  
	// 輸入參數 [0,0.5] 和 [0.5,1], gamma=1  
	if( ImageAdjust( src, dst, 0, 0.5, 0.5, 1, 6)!=0)  
		return -1;  

	cvShowImage( "src", src );  
	cvShowImage( "result", dst );  
	cvWaitKey(0);  
	cvDestroyWindow("src");  
	cvDestroyWindow("result");  
	cvReleaseImage( &src );  
	cvReleaseImage( &dst );  
       return 0;
}
效果如下:




















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章