图像镜像(Mirror)变换分为三种:一种是水平镜像;一种是垂直镜像;一种是对角镜像。图像的镜像变换不改变原图像的形状。
####################################################
void cvFlip()
{
const CvArr* src,
CvArr* dst=NULL,
int flip_mode=0
};
本函数是将图像绕着在X轴或Y轴或者绕着X轴和Y轴上同时旋转。
当参数flip_mode=0时,图像只会绕X轴旋转
当参数flip_mode>0(被设置为正值时),图像会围绕Y轴旋转
当参数flip_mode<0时,图像会围绕X轴和Y轴旋转
####################################################
图像水平镜像变换是将图像左半部分和右半部分以图像的垂直中轴线为中心,进行镜像变换。
void horiMirror(void)//水平镜像变换
{//x=x0, y=N-y0+1 N为列数
int N;
IplImage *src=cvLoadImage("lena.jpg");
if (src == NULL)
exit(0);
IplImage *res=cvCreateImage(cvGetSize(src), src->depth, src->nChannels);
if (res == NULL)
exit(0);
N=src->width;
for (int i=0; i<src->height; i++)
{
for (int j=0; j<src->width; j++)
{
CvScalar color=cvGet2D(src, i, j);
cvSet2D(res, i, N-j-1, color);//注意这里
}
}
cvNamedWindow("src");
cvNamedWindow("res");
cvShowImage("src", src);
cvShowImage("res", res);
cvWaitKey(0);
cvReleaseImage(&src);
cvReleaseImage(&res);
cvDestroyAllWindows();
}
####################################################
图像垂直变换是将图像上半部分和下半部分以图像的水平中轴线为中心,进行镜像对换
void vertiMirror(void)//垂直镜像变换
{//x=M-x0+1, y=y0 M为行数
int M;
IplImage *src=cvLoadImage("lena.jpg");
if (src == NULL)
exit(0);
IplImage *res=cvCreateImage(cvGetSize(src), src->depth, src->nChannels);
if (res == NULL)
exit(0);
M=src->height;
for (int i=0; i<src->height; i++)
{
for (int j=0; j<src->width; j++)
{
CvScalar color=cvGet2D(src, i, j);
cvSet2D(res, M-i-1, j, color);//注意这里
}
}
cvNamedWindow("src");
cvNamedWindow("res");
cvShowImage("src", src);
cvShowImage("res", res);
cvWaitKey(0);
cvReleaseImage(&src);
cvReleaseImage(&res);
cvDestroyAllWindows();
}
#####################################################
图像的对角镜像变换是以原图像水平中轴线和垂直中轴线的交点为中心将图像进行变换,相当于先对图像进行水平镜像变换,再进行垂直镜像变换
void diagonalMirror(void)//对角镜像
{//x=M-x0+1, y=N-y0+1 (M, N)为行列数 相当于先对图像进行水平镜像变换,再进行垂直镜像变换
int M, N;
IplImage *src=cvLoadImage("lena.jpg");
if (src == NULL)
exit(0);
IplImage *res=cvCreateImage(cvGetSize(src), src->depth, src->nChannels);
if (res == NULL)
exit(0);
M=src->height;
N=src->width;
for (int i=0; i<src->height; i++)
{
for (int j=0; j<src->width; j++)
{
CvScalar color=cvGet2D(src, i, j);
cvSet2D(res, M-i-1, N-j-1, color);//注意这里
}
}
cvNamedWindow("src");
cvNamedWindow("res");
cvShowImage("src", src);
cvShowImage("res", res);
cvWaitKey(0);
cvReleaseImage(&src);
cvReleaseImage(&res);
cvDestroyAllWindows();
}