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