重映射、仿射变换、直方图均衡化

重映射:把一幅图像中某位置的像素放置到另一个图片指定位置的过程。

完成映射过程,需要获得一些插值为非整数像素的坐标,源图像与目标图像不是一一对应的。


函数:

remap( InputArray src, OutputArray dst,
                         InputArray map1, InputArray map2,
                         int interpolation, int borderMode = BORDER_CONSTANT,
                         const Scalar& borderValue = Scalar());

第一个参数:输入灰度图像

第二个参数:输出图像

第三个参数:Mat 类map1

第四个参数:Mat 类map1

第五个参数:插值方式

第六个参数:边界模式

第七个参数:边界颜色值


示例:

#include
#include
#include
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(j, i) = static_cast(i);
			mapy.at(j, i) = static_cast(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.)对图像、区域、轮廓进行仿射变换


warpAffine( InputArray src, OutputArray dst,
                              InputArray M, Size dsize,
                              int flags = INTER_LINEAR,
                              int borderMode = BORDER_CONSTANT,
                              const Scalar& borderValue = Scalar());

第一个参数:输入图像

第二个参数:输出图像

第三个参数:Mat 类2x3变换矩阵

第四个参数:输出图像尺寸

第五个参数:插值方法

第六个参数:边界像素模式

第七个参数:边界颜色值


getRotationMatrix2D( Point2f center, double angle, double scale );

第一个参数:原图像旋转中心。

第二个参数:旋转角度

第三个参数:缩放系数

示例:

#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 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(srcImage.cols - 1), 0);
	srcTriangle[2] = Point2f(0, static_cast(srcImage.rows - 1));

	dstTriangle[0] = Point2f(static_cast(srcImage.cols*0.0), static_cast(srcImage.rows*0.33));
	dstTriangle[1] = Point2f(static_cast(srcImage.cols*0.65), static_cast(srcImage.rows*0.35));
	dstTriangle[2] = Point2f(static_cast(srcImage.cols*0.15), static_cast(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
#include

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;
}


你可能感兴趣的:(opencv,opencv)