重映射remap()

重映射实例(多重映射见书304,其实就是调用子函数的swtich语句,更改map_x,map_y的值来改变重映射形式)
#include
using namespace std;
using namespace cv;
int main()
{
Mat srcimg, dstimg;
Mat map_x, map_y;
srcimg = imread("D://1.jpg", 1);
imshow("原始图", srcimg);
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.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;
}

仿射变换

1,求仿射变换

2,仿射函数

3,计算旋转变换矩阵

实例2
#include
using namespace std;
using namespace cv;
int main()
{
Point2f srctriangle[3];
Point2f dsttriangle[3];
Mat rotMat(2, 3, CV_32FC1);
Mat warpMat(2, 3, CV_32FC1);
Mat srcimg, dstimg_warp, dstimg_warp_rotete;
srcimg = imread("D://11.jpg");
imshow("原图", srcimg);
dstimg_warp = Mat::zeros(srcimg.rows, srcimg.cols, srcimg.type());
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));
warpMat = getAffineTransform(srctriangle, dsttriangle);
warpAffine(srcimg, dstimg_warp, warpMat, dstimg_warp.size());
imshow("warp图", dstimg_warp);
Point center = Point(dstimg_warp.cols / 2, dstimg_warp.rows / 2);
double angle = -50;
double scale = 0.6;
rotMat = getRotationMatrix2D(center, angle, scale);
warpAffine(dstimg_warp, dstimg_warp_rotete, rotMat, dstimg_warp.size());
imshow("warp+Rotate图", dstimg_warp_rotete);
waitKey(0);
return 0;
}
对比一下为何上程序不行
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include
using namespace cv;
using namespace std;
#define WINDOW_NAME1 "【原始图窗口】"
#define WINDOW_NAME2 "【经过Warp后的图像】"
#define WINDOW_NAME3 "【经过Warp和Rotate后的图像】"
int main()
{
system("color 1F");
Point2f srcTriangle[3];
Point2f dstTriangle[3];
Mat rotMat(2, 3, CV_32FC1);
Mat warpMat(2, 3, CV_32FC1);
Mat srcImage, dstImage_warp, dstImage_warp_rotate;
srcImage = imread("D://1.jpg", 1);
if (!srcImage.data) { printf("读取图片错误,请确定目录下是否有imread函数指定的图片存在~! \n"); return false; }
dstImage_warp = Mat::zeros(srcImage.rows, srcImage.cols, srcImage.type());
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));
warpMat = getAffineTransform(srcTriangle, dstTriangle);
warpAffine(srcImage, dstImage_warp, warpMat, dstImage_warp.size());
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());
imshow(WINDOW_NAME1, srcImage);
imshow(WINDOW_NAME2, dstImage_warp);
imshow(WINDOW_NAME3, dstImage_warp_rotate);
waitKey(0);
return 0;
}
效果图

3,直方图均衡化equalizeHist()

函数使用方法

#include
using namespace std;
using namespace cv;
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;
}