重映射:把一幅图像中某位置的像素放置到另一个图片指定位置的过程。
完成映射过程,需要获得一些插值为非整数像素的坐标,源图像与目标图像不是一一对应的。
函数:
remap( InputArray src, OutputArray dst,
InputArray map1, InputArray map2,
int interpolation, int borderMode = BORDER_CONSTANT,
const Scalar& borderValue = Scalar());
第一个参数:输入灰度图像
第二个参数:输出图像
第三个参数:Mat 类map1
第四个参数:Mat 类map1
第五个参数:插值方式
第六个参数:边界模式
第七个参数:边界颜色值
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
using namespace cv;
int main()
{
Mat img, dst;
Mat mapx, mapy;
img = imread("d://temp/1.jpg");
imshow("源图像", img);
dst.create(img.size(), img.type());
mapx.create(img.size(), CV_32FC1);
mapy.create(img.size(), CV_32FC1);
for (int j = 0; j < img.rows; j++)
{
for (int i = 0; i < img.cols; i++)
{
mapx.at<float>(j, i) = static_cast<float>(i);
mapy.at<float>(j, i) = static_cast<float>(img.rows - j);
}
}
remap(img, dst, mapx, mapy, INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0));
imshow("效果图",dst);
waitKey(0);
return 0;
}
仿射变换:旋转、平移、缩放。
要进行仿射变换,必须先获取变换矩阵。要获取变换矩阵,必须先获取特征点坐标、角度等信息,几何匹配和bolb是获取特征点的高效方法,除此之外还有其它方法,只要能稳定的求出特征点即可。
仿射变换流程
(1.)获取特征点坐标、角度
(2.)计算仿射变换矩阵
(3.)对图像、区域、轮廓进行仿射变换
InputArray M, Size dsize,
int flags = INTER_LINEAR,
int borderMode = BORDER_CONSTANT,
const Scalar& borderValue = Scalar());
第一个参数:输入图像
第二个参数:输出图像
第三个参数:Mat 类2x3变换矩阵
第四个参数:输出图像尺寸
第五个参数:插值方法
第六个参数:边界像素模式
第七个参数:边界颜色值
第一个参数:原图像旋转中心。
第二个参数:旋转角度
第三个参数:缩放系数
示例:#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后的图像】" //为窗口标题定义的宏 int angle = -180; int scale = 1; //-----------------------------------【main( )函数】-------------------------------------------- // 描述:控制台应用程序的入口函数,我们的程序从这里开始执行 //----------------------------------------------------------------------------------------------- void on_traker(int, void*) { //【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://temp/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); // 通过上面的旋转细节信息求得旋转矩阵 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); } int main() { //【0】改变console字体颜色 system("color 1F"); namedWindow("自定义", WINDOW_AUTOSIZE); createTrackbar("角度", "自定义", &angle, 180, on_traker); createTrackbar("缩放因子", "自定义", &scale, 10, on_traker); on_traker(angle, 0); // 等待用户按任意按键退出程序 waitKey(0); return 0; }
直方图均衡化:扩大图像的动态范围,通过拉伸像素强度分布范围来增强图像对比度的一种方法。----------------图像增强函数:
void equalizeHist( InputArray src, OutputArray dst );
第一个参数:输入灰度图像
第二个参数:输出图像
示例:
#include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc.hpp> using namespace cv; int main() { Mat img = imread("d://temp/1.jpg"); Mat dst; cvtColor(img, img, COLOR_BGR2GRAY); imshow("原始图", img); equalizeHist(img, dst); imshow("效果图", dst); waitKey(0); return 0; }