OpenCV常用的灰度变换方法

21 篇文章 0 订阅
15 篇文章 0 订阅

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;
}
效果如下:




















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值