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

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

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


函数:

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.)对图像、区域、轮廓进行仿射变换


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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HySmiley

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值