【原文:http://blog.csdn.net/yangtrees/article/details/9095731】 ============================================== 小熊不去实验室csdn博客 ============================================== 原理:凸透镜效果算法 [cpp] view plaincopyprint? #includem
【原文:http://blog.csdn.net/yangtrees/article/details/9095731】
==============================================
小熊不去实验室csdn博客
==============================================
原理:凸透镜效果算法
[cpp] view plaincopyprint?
#include #include #include using namespace cv; using namespace std; int main() { mat src = imread(d:/img/face02.jpg,1); int width = src.cols; int heigh = src.rows; point center(width/2,heigh/2); mat img1(src.size(),cv_8uc3); mat img2(src.size(),cv_8uc3); src.copyto(img1); src.copyto(img2); //【1】放大 int r1 = sqrtf(width*width+heigh*heigh)/2; //直接关系到放大的力度,与r1成正比; for (int y=0; y { uchar *img1_p = img1.ptr(y); for (int x=0; x { int dis = norm(point(x,y)-center); if (dis { int newx = (x-center.x)*dis/r1+center.x; int newy = (y-center.y)*dis/r1+center.y; img1_p[3*x]=src.at(newy,newx*3); img1_p[3*x+1]=src.at(newy,newx*3+1); img1_p[3*x+2]=src.at(newy,newx*3+2); } } } //【2】挤压 for (int y=0; y { uchar *img2_p = img2.ptr(y); for (int x=0; x { double theta = atan2((double)(y-center.y),(double)(x-center.x));//使用atan出现问题~ int r2 = sqrtf(norm(point(x,y)-center))*8; //直接关系到挤压的力度,与r2成反比; int newx = center.x+(int)(r2*cos(theta)); int newy = center.y+(int)(r2*sin(theta)); if(newx else if(newx>=width) newx=width-1; if(newy else if(newy>=heigh) newy=heigh-1; img2_p[3*x]=src.at(newy,newx*3); img2_p[3*x+1]=src.at(newy,newx*3+1); img2_p[3*x+2]=src.at(newy,newx*3+2); } } imshow(src,src); imshow(img1,img1); imshow(img2,img2); waitkey(); imwrite(d:/img/扩张.jpg,img1); imwrite(d:/img/挤压.jpg,img2); }
原图:
扩张:
挤压: