PhotoShop算法实现--图像的镜像变换(十六)
http://blog.csdn.net/kezunhai
图像的镜像变换分为水平镜像和垂直镜像。图像的水平镜像是将图像的左半部分和有半部分以图像的垂直中轴线为中心进行对换;图像的垂直镜像则是以图像的上半部分和下半部分的中轴线为中心进行对换。
对于水平镜像用点(x0, x0)变换后为(widht-x0, y0);对于垂直镜像则有(x0, height-y0)。实现代码如下:
// flag=1:表示水平镜像, flag = -1表示垂直镜像
void PhotoShop:: Mirror(Mat& img, Mat&dst, int flag)
{
if ( dst.empty())
dst.create(img.rows, img.cols, img.type());
int height = img.rows;
int width = img.cols;
int chns = img.channels();
int i, j;
if ( flag == 1) // 水平镜像
{
for ( i=0; i<height; ++i)
{
unsigned char* srcData = (unsigned char*)img.data + img.step* i;
unsigned char* dstData = (unsigned char*)dst.data + dst.step* i;
for ( j=0; j<width; ++j)
{
dstData[j*chns] = srcData[(width-1-j)*chns];
dstData[j*chns+1] = srcData[(width-1-j)*chns+1];
dstData[j*chns+2] = srcData[(width-1-j)*chns+2];
}
}
}
else // 垂直镜像
{
for ( i=0; i<height; ++i)
{
unsigned char* srcData = (unsigned char*)img.data + img.step* i;
unsigned char* dstData = (unsigned char*)dst.data + dst.step*(height-1-i);
for ( j=0; j<width; ++j)
{
dstData[j*chns] = srcData[j*chns];
dstData[j*chns+1] = srcData[j*chns+1];
dstData[j*chns+2] = srcData[j*chns+2];
}
}
}
}
水平镜像如图所示:
垂直镜像如图所示:
水平镜像挺好的玩的,再来一张水平镜像:
作者:kezunhai 出处:http://blog.csdn.net/kezunhai 欢迎转载或分享,但请务必声明文章出处。