opencv:图像变换

一、卷积

void cvFilter2D(const CvArr* src,CvArr* dst,const CvMat* kernel);
//扩大图像的边界
void cvCopyMakeBorder(const CvArr* src,CvArr* dst,CvPoint offset,int bordertype,CvScalar value = cvScalarAll(0));

二、梯度和Sobel导数

cvSobel(const CvArr* src,CvArr* dst,int xorder,int yorder,int aperture_size = 3);

三、拉普拉斯变换

void cvLaplace(const CvArr* src,CvArr* dst,int apertureSize = 3);

四、Canny算子

void cvCanny(const CvArr* edges,double lowThresh,double highThresh,int apertureSize = 3);

五、霍夫变换
1·霍夫线变换

CvSeq* cvHoughLines2(CvArr* image,void* line_storage,int method,double rho,double theta,int threshold,double param1 = 0,double param2 = 0);

2·霍夫圆变换

CvSeq* cvHoughCircles(CvArr* image,void* circle_storage,int method,double dp,double min_dist,double param1 = 100,double param2 = 300,int min_radius = 0,int max_radius = 0);

六、重映射

void cvRemap(const CvArr* src,CvArr* dst,const CvArr* mapx,const CvArr* mapy,int flags = CV_INTER_LINEAR | CV_WARP_FILL_OUTLIERS,CvScalar fillval = cvScalarAll(0));

标志位的值及意义
CV_INTER_NN 最近邻
CV_INTER_LINEAR 双线性(默认)
CV_INTER_AREA 像素区域重新采样
CV_INTER_CUBIC 双三次插值

七、几何转换
1·基于2x3矩阵进行的变换,也叫仿射变换

//稠密仿射变换
void cvWarpAffine(const CvArr* src,CvArr* dst,const CvMat* map_matrix,int flags = CV_INTER_LINEAR | CV_WARP_FILL_OUTLIERS,CvScalar fillval = cvScalrAll(0));
void cvGetQuadrangleSubPix(const CvArr* src,CvArr* dst,const CvMat* map_matrix);
//仿射映射矩阵的计算
CvMat* cvGetAffineTransform(const CvPoint2D32f* pts_src,const CvPoint2d32f* pts_dst,CvMat* map_matrix);
CvMat* cv2DRotationMatrix(CvPoint2D32f center,double angle,double scale,CvMat* map_matrix);
//稀疏仿射变换
void cvTransform(const CvArr* stc,CvArr* dst,const CvMat* transmat,const CvMat* shiftvec = NULL);
#include "cv.h"
#include "highgui.h"

int main(int argc,char** argv)
{
    CvPoint2D32f srcTri[3],dstTri[3];
    CvMat* rot_mat = cvCreateMat(2,3,CV_32FC1);
    CvMat* warp_mat = cvCreateMat(2,3,CV_32FC1);

    IplImage* src,* dst;
    if ((src = cvLoadImage("E:/opencv/lena.png")) != 0)
    {
         dst = cvCloneImage(src);
         dst->origin = src->origin;
         cvZero(dst);

         srcTri[0].x = 0;
         srcTri[0].y = 0;
         srcTri[1].x = src->width - 1;
         srcTri[1].y = 0;
         srcTri[2].x = 0;
         srcTri[2].y = src->height - 1;
         dstTri[0].x = src->width*0.0;
         dstTri[0].y = src->height*0.33;
         dstTri[1].x = src->width*0.85;
         dstTri[1].y = src->height*0.25;
         dstTri[2].x = src->width*0.15;
         dstTri[2].y = src->height*0.7;

        cvGetAffineTransform(srcTri,dstTri,warp_mat);
         cvWarpAffine(src,dst,warp_mat);
         cvCopy(dst,src);

         CvPoint2D32f center = cvPoint2D32f(src->width/2,src->height/2);
         double angle = -50.0;
         double scale = 0.6;
        cv2DRotationMatrix(center,angle,scale,rot_mat);

         cvWarpAffine(src,dst,rot_mat);

         cvNamedWindow("Affine_Transform",1);
         cvShowImage("Affine_Transform",dst);
         cvWaitKey(0);
    }
    cvReleaseImage(&dst);
    cvReleaseMat(&rot_mat);
    cvReleaseMat(&warp_mat);
    return 0;

}

2·基于3x3矩阵进行的变换,也叫透视变换或者单应性变换

//稠密透视变换
void cvWarpPerspective(const CvArr* src,CvArr* dst,const CvMat* map_matrix,int flags = CV_INTER_LINEAR + CV_WARP_FILL_OUTLIERS,CvScalar fillval = cvScalarAll(0));
CvMat* cvGetPerspectiveTransform(const CvPoint2D32f* pts_src,const CvPoint2D32f* pts_dst,CvMat* map_matrix);
//稀疏透视变换
void cvPerspectiveTransform(const CvArr* src,CvArr* dst,const CvMat* mat);
#include "cv.h"
#include "highgui.h"

int main(int argc,char** argv)
{
    CvPoint2D32f srcQuad[4],dstQuad[4];
    CvMat* warp_matrix = cvCreateMat(3,3,CV_32FC1);

    IplImage* src,* dst;
    if ((src = cvLoadImage("E:/opencv/lena.png")) != 0)
    {
         dst = cvCloneImage(src);
         dst->origin = src->origin;
         cvZero(dst);

         srcQuad[0].x = 0;
         srcQuad[0].y = 0;
         srcQuad[1].x = src->width - 1;
         srcQuad[1].y = 0;
         srcQuad[2].x = 0;
         srcQuad[2].y = src->height - 1;
         srcQuad[3].y = src->width - 1;
         srcQuad[3].y = src->height - 1;

         dstQuad[0].x = src->width*0.05;
         dstQuad[0].y = src->height*0.33;
         dstQuad[1].x = src->width*0.9;
         dstQuad[1].y = src->height*0.25;
         dstQuad[2].x = src->width*0.2;
         dstQuad[2].y = src->height*0.7;
         dstQuad[3].y = src->width*0.8;
         dstQuad[3].y = src->height*0.9;

        cvGetPerspectiveTransform(srcQuad,dstQuad,warp_matrix);
         cvWarpPerspective(src,dst,warp_matrix);

         cvNamedWindow("Affine_Transform",1);
         cvShowImage("Affine_Transform",dst);
         cvWaitKey(0);
    }
    cvReleaseImage(&dst);
    cvReleaseMat(&warp_matrix);

    return 0;

}

3.坐标转换

//笛卡尔坐标到极坐标
void cvCartToPolar(const CvArr* x,const CvArr* y,CvArr* magnitude,CvArr* angle = NULL,int angle_in_degrees = 0);
//极坐标到笛卡尔坐标
void cvPolarToCart(const CvArr* magnitude,const CvArr* angle,CvArr* x,CvArr* y,int angle_in_degrees = 0);
//对数极坐标转换
void cvLogPolar(const CvArr* src,CvArr* dst,CvPoint2D32f center,double m,int flags = CV_INTER_LINEAR | CV_WARP_FILL_OUTLIERS);
#include "cv.h"
#include "highgui.h"

int main(int argc,char** argv)
{
    IplImage* src;
    double M;
    if((src = cvLoadImage("E:/opencv/lena.png")) != 0)
    {
         M = 10;
         IplImage* dst = cvCreateImage(cvGetSize(src),8,3);
         IplImage* src2 = cvCreateImage(cvGetSize(src),8,3);

        cvLogPolar(src,dst,cvPoint2D32f(src->width/4,src->height/2),M,CV_INTER_LINEAR+
             CV_WARP_FILL_OUTLIERS);
        cvLogPolar(dst,src2,cvPoint2D32f(src->width/4,src->height/2),M,CV_INTER_LINEAR |
             CV_WARP_INVERSE_MAP);
         cvNamedWindow("Example6_4");
         cvShowImage("Example6_4",dst);
         cvNamedWindow("2");
         cvShowImage("2",src2);
         cvWaitKey(0);

    }
    return 0;
}

八、离散傅里叶变换(DFT)

void cvDFT(const CvArr* src,CvArr* dst,int flags,int nonzero_rows = 0);
//频谱乘法
void cvMulSpectrums(const CvArr* src1,const CvArr* src2,CvArr* dst,int flags);
#include "cv.h"
#include "highgui.h"

void speedy_conv(const CvMat* A,const CvMat* B,CvMat* C)
{
    int dft_M = cvGetOptimalDFTSize(A->rows+B->rows-1);
    int dft_N = cvGetOptimalDFTSize(A->rows+B->rows-1);

    CvMat* dft_A = cvCreateMat(dft_M,dft_N,A->type);
    CvMat* dft_B = cvCreateMat(dft_M,dft_N,A->type);
    CvMat tmp;

    cvGetSubRect(dft_A,&tmp,cvRect(0,0,A->cols,A->rows));
    cvCopy(A,&tmp);
    cvGetSubRect(dft_A,&tmp,cvRect(A->cols,0,dft_A->cols-A->cols,A->rows));
    cvZero(&tmp);

    cvDFT(dft_A,dft_A,CV_DXT_FORWARD,A->rows);
    cvGetSubRect(dft_B,&tmp,cvRect(0,0,B->cols,B->rows));
    cvCopy(B,&tmp);
    cvGetSubRect(dft_B,&tmp,cvRect(B->cols,0,dft_B->cols-B->cols,B->rows));
    cvZero(&tmp);
    cvDFT(dft_B,dft_B,CV_DXT_FORWARD,B->rows);

    cvMulSpectrums(dft_A,dft_B,dft_A,0);

    cvDFT(dft_A,dft_A,CV_DXT_INV_SCALE,C->rows);
    cvGetSubRect(dft_A,&tmp,cvRect(0,0,C->cols,C->rows));
    cvCopy(&tmp,C);
    cvReleaseMat(&dft_A);
    cvReleaseMat(&dft_B);

}
int main(int argc,char** argv)
{

}

九、离散余弦变换(DCT)

void cvDCT(const CvArr* src,CvArr* dst,int flags);

十、积分图像

void cvIntegral(const CvArr* image,CvArr* sum,Cvarr* sqsum = NULL,CvArr* tilted_sum = NULL);

十一、距离变换

void cvDistTransfrorm(const CvArr* src,CvArr* dst,int distance_type = CV_DIST_L2,int mask_size = 3,const float* kernel = NULL,CvArr* labels = NULL);

cvDistTransform()中可能采用的距离准则

CV_DIST_L2
CV_DIST_L1
CV_DIST_L12
CV_DIST_FAIR
CV_DIST_WELSCH
CV_DIST_USER

十二、直方图均衡化

void cvEqualizeHist(const CvArr* src,CvArr* dst);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值