opencv学习(二十二)重映射remap/仿射变换getRotationMatrix2D()//getAffineTransform//wapAffine()直方图均衡化equalizeHist()

重映射remap()

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

重映射实例(多重映射见书304,其实就是调用子函数的swtich语句,更改map_x,map_y的值来改变重映射形式)

#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;

int main()
{
    Mat srcimg, dstimg;
    Mat map_x, map_y;

    //载入原图
    srcimg = imread("D://1.jpg", 1);
    imshow("原始图", srcimg);

    //创建与原图一样的效果图,x,y重映射图
    dstimg.create(srcimg.size(), srcimg.type());
    map_x.create(srcimg.size(), CV_32FC1);
    map_y.create(srcimg.size(), CV_32FC1);
    for (int j = 0; j < srcimg.rows; j++)
    {
        for (int i = 0; i < srcimg.cols; i++)
        {
        //改变map_x,map_y的值
            map_x.at<float>(j, i) = static_cast<float>(i);
            map_y.at<float>(j, i) = static_cast<float>(srcimg.rows-j);
        }
    }
    //进行重映射操作
    remap(srcimg, dstimg, map_x, map_y, INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0));
    //显示效果图
    imshow("【程序窗口】", dstimg);
    waitKey();
    return 0;

}

这里写图片描述

仿射变换

实质就是先用getRotationMatrix2D()或getAffineTransform函数求得仿射变换矩阵,然后用进行仿射变换

这里写图片描述
这里写图片描述

1,求仿射变换

这里写图片描述
这里写图片描述
这里写图片描述

2,仿射函数

这里写图片描述
这里写图片描述
这里写图片描述

3,计算旋转变换矩阵

这里写图片描述
这里写图片描述

实例2

#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;

int main()
{
    //【1】定义两组点代表三角形
    Point2f srctriangle[3];
    Point2f dsttriangle[3];
    //【2】定义变量
    Mat rotMat(2, 3, CV_32FC1);
    Mat warpMat(2, 3, CV_32FC1);
    Mat srcimg, dstimg_warp, dstimg_warp_rotete;

    //【3】加载图像并进行初始化
    srcimg = imread("D://11.jpg");
    imshow("原图", srcimg);

    dstimg_warp = Mat::zeros(srcimg.rows, srcimg.cols, srcimg.type());//目标图与原图大小一致

    //【4】设置原图像和目标图像的三组以计算仿射变换
    srctriangle[0] = Point2f(0, 0);
    srctriangle[1] = Point2f(static_cast<float>(srcimg.cols-1),0);
    srctriangle[2] = Point2f(0,static_cast<float>(srcimg.rows - 1));

    dsttriangle[0]== Point2f(static_cast<float>(srcimg.cols *0.0), static_cast<float>(srcimg.rows *0.33));
    dsttriangle[1] == Point2f(static_cast<float>(srcimg.cols *0.65), static_cast<float>(srcimg.rows *0.35));
    dsttriangle[2] == Point2f(static_cast<float>(srcimg.cols *0.15), static_cast<float>(srcimg.rows *0.6));

    //【5】求得仿射变换
    warpMat = getAffineTransform(srctriangle, dsttriangle);

    //【6】应用变换
    warpAffine(srcimg, dstimg_warp, warpMat, dstimg_warp.size());
    imshow("warp图", dstimg_warp);

    //【7】对图像进行缩放后再旋转
//绕中心店顺时针旋转50度缩放因子为0.6的旋转矩阵
    Point center = Point(dstimg_warp.cols / 2, dstimg_warp.rows / 2);
    double angle = -50;
    double scale = 0.6;
    //【8】通过上面旋转信息求得旋转矩阵
    rotMat = getRotationMatrix2D(center, angle, scale);
    //【9】旋转已缩放的图像
    warpAffine(dstimg_warp, dstimg_warp_rotete, rotMat, dstimg_warp.size());

    //【10】显示效果
    imshow("warp+Rotate图", dstimg_warp_rotete);

    waitKey(0);
    return 0;


}

对比一下为何上程序不行



//---------------------------------【头文件、命名空间包含部分】----------------------------
//      描述:包含程序所使用的头文件和命名空间
//------------------------------------------------------------------------------------------------
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
using namespace cv;
using namespace std;


//-----------------------------------【宏定义部分】-------------------------------------------- 
//      描述:定义一些辅助宏 
//------------------------------------------------------------------------------------------------ 
#define WINDOW_NAME1 "【原始图窗口】"                  //为窗口标题定义的宏 
#define WINDOW_NAME2 "【经过Warp后的图像】"        //为窗口标题定义的宏 
#define WINDOW_NAME3 "【经过Warp和Rotate后的图像】"        //为窗口标题定义的宏 





//-----------------------------------【main( )函数】--------------------------------------------
//      描述:控制台应用程序的入口函数,我们的程序从这里开始执行
//-----------------------------------------------------------------------------------------------
int main()
{
    //【0】改变console字体颜色
    system("color 1F");


    //【1】参数准备
    //定义两组点,代表两个三角形
    Point2f srcTriangle[3];
    Point2f dstTriangle[3];
    //定义一些Mat变量
    Mat rotMat(2, 3, CV_32FC1);
    Mat warpMat(2, 3, CV_32FC1);
    Mat srcImage, dstImage_warp, dstImage_warp_rotate;

    //【2】加载源图像并作一些初始化
    srcImage = imread("D://1.jpg", 1);
    if (!srcImage.data) { printf("读取图片错误,请确定目录下是否有imread函数指定的图片存在~! \n"); return false; }
    // 设置目标图像的大小和类型与源图像一致
    dstImage_warp = Mat::zeros(srcImage.rows, srcImage.cols, srcImage.type());

    //【3】设置源图像和目标图像上的三组点以计算仿射变换
    srcTriangle[0] = Point2f(0, 0);
    srcTriangle[1] = Point2f(static_cast<float>(srcImage.cols - 1), 0);
    srcTriangle[2] = Point2f(0, static_cast<float>(srcImage.rows - 1));

    dstTriangle[0] = Point2f(static_cast<float>(srcImage.cols*0.0), static_cast<float>(srcImage.rows*0.33));
    dstTriangle[1] = Point2f(static_cast<float>(srcImage.cols*0.65), static_cast<float>(srcImage.rows*0.35));
    dstTriangle[2] = Point2f(static_cast<float>(srcImage.cols*0.15), static_cast<float>(srcImage.rows*0.6));

    //【4】求得仿射变换
    warpMat = getAffineTransform(srcTriangle, dstTriangle);

    //【5】对源图像应用刚刚求得的仿射变换
    warpAffine(srcImage, dstImage_warp, warpMat, dstImage_warp.size());

    //【6】对图像进行缩放后再旋转
    // 计算绕图像中点顺时针旋转50度缩放因子为0.6的旋转矩阵
    Point center = Point(dstImage_warp.cols / 2, dstImage_warp.rows / 2);
    double angle = -50.0;
    double scale = 0.6;
    // 通过上面的旋转细节信息求得旋转矩阵
    rotMat = getRotationMatrix2D(center, angle, scale);
    // 旋转已缩放后的图像
    warpAffine(dstImage_warp, dstImage_warp_rotate, rotMat, dstImage_warp.size());


    //【7】显示结果
    imshow(WINDOW_NAME1, srcImage);
    imshow(WINDOW_NAME2, dstImage_warp);
    imshow(WINDOW_NAME3, dstImage_warp_rotate);

    // 等待用户按任意按键退出程序
    waitKey(0);

    return 0;
}

效果图
这里写图片描述

3,直方图均衡化equalizeHist()

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

函数使用方法

这里写图片描述


#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;

//--------------------------------------【main( )函数】-----------------------------------------
//          描述:控制台应用程序的入口函数,我们的程序从这里开始执行
//-----------------------------------------------------------------------------------------------
int main()
{
    Mat srcimg, dstimg,dst2;
    srcimg = imread("D://1.jpg",0);//转化为灰度图后才能直方图均衡化
    imshow("原图", srcimg);
    equalizeHist(srcimg, dstimg);
    GaussianBlur(dstimg, dstimg, Size(3, 3),0,0);

    imshow("均衡化后的图", dstimg);//如何处理完灰度图后恢复成彩色图?
    waitKey(0);

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41553038/article/details/80116894