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