zoukankan      html  css  js  c++  java
  • OpenCV——PS滤镜算法之Spherize 球面化(凸出效果)

    // define head function
    #ifndef PS_ALGORITHM_H_INCLUDED
    #define PS_ALGORITHM_H_INCLUDED
    
    #include <iostream>
    #include <string>
    #include "cv.h"
    #include "highgui.h"
    #include "cxmat.hpp"
    #include "cxcore.hpp"
    #include "math.h"
    
    using namespace std;
    using namespace cv;
    
    void Show_Image(Mat&, const string &);
    
    #endif // PS_ALGORITHM_H_INCLUDED
    
    
    #include "PS_Algorithm.h"
    #include <time.h>
    
    using namespace std;
    using namespace cv;
    
    #define pi 3.1415926
    
    int main()
    {
        string Img_name("4.jpg");
        Mat Img;
        Img=imread(Img_name);
    
        Mat Img_out(Img.size(), CV_8UC3);
        Img.copyTo(Img_out);
    
        int width=Img.cols;
        int height=Img.rows;
    
        float R;
        float e;
        float a,b;
        float alpha=0.75;
        float K=pi/2;
    
        a=height/2.0; b=width/2.0;
        e=(float)width/(float)height;
        R=std::min(a,b);
    
        Point Center(width/2, height/2);
    
        float radius,Dis,new_x, new_y;
        float p,q,x1,y1,x0,y0;
        float theta;
    
        for (int y=0; y<height; y++)
        {
            for (int x=0; x<width; x++)
            {
                y0=Center.y-y;
                x0=x-Center.x;
                Dis=x0*x0+y0*y0;
                if(Dis<R*R)
                {
                    theta=atan(y0/(x0+0.00001));
                    if(x0<0) theta=theta+pi;
                    radius=asin(sqrt(Dis)/R)*R/K;
                    radius=(sqrt(Dis)-radius)*(1-alpha)+radius;
                    new_x=radius*cos(theta);
                    new_y=radius*sin(theta);
                    new_x=Center.x+new_x;
                    new_y=Center.y-new_y;
    
                    if(new_x<0)         new_x=0;
                    if(new_x>=width-1)  new_x=width-2;
                    if(new_y<0)         new_y=0;
                    if(new_y>=height-1) new_y=height-2;
    
                    x1=(int)new_x;
                    y1=(int)new_y;
    
                    p=new_x-x1;
                    q=new_y-y1;
    
                    for (int k=0; k<3; k++)
                    {
                        Img_out.at<Vec3b>(y, x)[k]=(1-p)*(1-q)*Img.at<Vec3b>(y1, x1)[k]+
                                                (p)*(1-q)*Img.at<Vec3b>(y1,x1+1)[k]+
                                                (1-p)*(q)*Img.at<Vec3b>(y1+1,x1)[k]+
                                                (p)*(q)*Img.at<Vec3b>(y1+1,x1+1)[k];
                    }
    
                }
    
            }
        }
    
        Img_out=Img_out;
        Show_Image(Img_out, "out");
    
        imwrite("Out.jpg", Img_out);
    
    
        waitKey();
    
    }
    
    
    // define the show image
    #include "PS_Algorithm.h"
    #include <iostream>
    #include <string>
    
    using namespace std;
    using namespace cv;
    
    void Show_Image(Mat& Image, const string& str)
    {
        namedWindow(str.c_str(),CV_WINDOW_AUTOSIZE);
        imshow(str.c_str(), Image);
    
    }
    


    原图 


    效果图


  • 相关阅读:
    Palindrome Partitioning
    Minimum Path Sum
    Maximum Depth of Binary Tree
    Minimum Depth of Binary Tree
    Unique Binary Search Trees II
    Unique Binary Search Trees
    Merge Intervals
    Merge Sorted Array
    Unique Paths II
    C++ Primer Plus 笔记第九章
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7055152.html
Copyright © 2011-2022 走看看