OpenCV——PS滤镜算法之 Ellipsoid (凹陷)
// 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 e;
    float a,b, a0, b0, a1,b1;
    float alpha=1.0;
    float K=pi/2;
    a=width/2; b=height/2;
    e=(float)width/(float)height;
    Point2i Center(width/2, height/2);
    float 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;
            theta=atan(y0*e/(x0+0.0001));
            if(x0<0)   theta=theta+pi;
            a0=x0/cos(theta);
            b0=y0/sin(theta+0.0001);
            if(a0>a || b0>b)  continue;
            a1=a*sin(a0/a*K);
            b1=b*sin(b0/b*K);
            a1=(a1-a0)*(alpha)+a0;
            b1=(b1-b0)*(alpha)+b0;
            new_x=a1*cos(theta);
            new_y=b1*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];
            }
        }
    }
   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);
}
原图
效果图
OpenCV——PS滤镜算法之 Ellipsoid (凹陷)的更多相关文章
- OpenCV——PS滤镜算法之 球面化 (凹陷效果)
		// define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include < ... 
- OpenCV——PS滤镜算法之 Ellipsoid (凸出)
		// define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include < ... 
- OpenCV——PS 滤镜算法之极坐标变换到平面坐标
		// define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include < ... 
- OpenCV——PS 滤镜算法之平面坐标到极坐标的变换
		// define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include < ... 
- OpenCV——PS滤镜算法之Spherize 球面化(凸出效果)
		// define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include < ... 
- OpenCV——PS 滤镜, 浮雕效果
		具体的算法原理可以参考: PS 滤镜, 浮雕效果 // define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITH ... 
- OpenCV——PS 滤镜, 曝光过度
		算法原理可以参考: PS 滤镜,曝光过度 #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include <io ... 
- PS 滤镜算法原理——染色玻璃
		%%%% 完成PS 中的染色玻璃滤镜特效 clc; clear all; close all; Image=imread('4.jpg'); Image=double(Image); Gray_Ima ... 
- PS 滤镜算法原理 ——马赛克
		% method : 利用邻域的随意一点取代当前邻域全部像素点 %%%% mosaic clc; clear all; addpath('E:\PhotoShop Algortihm\Image Pr ... 
随机推荐
- jQuery on() 和 live
			<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script sr ... 
- MongoDB数据类型查询与修改
			MongoDB数据类型和对应的代码如下: MongoDB可以根据字段类型进行文档查询: 可以看到,friend集合的文档中,age字段有32位int类型的,也有double类型的.如果需要把doubl ... 
- flowable资料
			flowable-modeler画流程图:https://www.youtube.com/watch?v=0pqD50pySJg 这个视频跳过创建用户那一步了:https://www.youtube. ... 
- web开发规范文档
			Web前端开发规范文档 规范目的: 使开发流程更加规范化. 通用规范: TAB键用两个空格代替(windos下tab键占四个空格,linux下TAB键占八个空格). CSS样式属性或者JAVASCR ... 
- Ajax 实现文件的下载
			JQuery的ajax函数的返回类型只有xml.text.json.html等类型,没有“流”类型,所以我们要实现ajax下载,不能够使用相应的ajax函数进行文件下载.但可以用js生成一个form, ... 
- 2018 ICPC 沈阳网络赛预赛 Supreme Number(找规律)
			[传送门]https://nanti.jisuanke.com/t/31452 [题目大意]:给定一个数字(最大可达10100),现在要求不超过它的最大超级质数.超级质数定义:对于一个数,把它看成数字 ... 
- T1245 最小的N个和    codevs
			http://codevs.cn/problem/1245/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 有两个长度 ... 
- CAN 和 CANopen的区别和联系
			1.CAN与CANopen的共同点与不同点: CAN只定义了物理层与链路层,而没有定义用户层,用户可根据自己的需要定义一些网络上的通信约定: CANopen是在CAN的基础上定义了用户层,即规定了 ... 
- Shannon-Fano-Elias编码的C语言实现
			Shannon-Fano-Elias编码 一.理论分析 Shannon-Fano-Elias编码是利用累积分布函数来分配码字. 不失一般性,假定取X={1,2,-m}.如果对于全部的x,有p(x)&g ... 
- 如何使用RDP跳过网络隔离?
			简介 本文我将向大家演示,如何通过RDP跳转盒进入隔离/受保护的网络.下图是我为该场景制作的拓扑图: 简要说明: LAN是一种扁平的工作站和服务器网络. 一些服务器(包括RDP跳转盒)无法与Inter ... 
