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

本是古典 何须时尚 2022-06-15 06:27 275阅读 0赞

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

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

函数:

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

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

第二个参数:输出图像

第三个参数:Mat 类map1

第四个参数:Mat 类map1

第五个参数:插值方式

第六个参数:边界模式

第七个参数:边界颜色值

示例:

  1. #include<opencv2/highgui/highgui.hpp>
  2. #include<opencv2/imgproc/imgproc.hpp>
  3. #include<iostream>
  4. using namespace cv;
  5. int main()
  6. {
  7. Mat img, dst;
  8. Mat mapx, mapy;
  9. img = imread("d://temp/1.jpg");
  10. imshow("源图像", img);
  11. dst.create(img.size(), img.type());
  12. mapx.create(img.size(), CV_32FC1);
  13. mapy.create(img.size(), CV_32FC1);
  14. for (int j = 0; j < img.rows; j++)
  15. {
  16. for (int i = 0; i < img.cols; i++)
  17. {
  18. mapx.at<float>(j, i) = static_cast<float>(i);
  19. mapy.at<float>(j, i) = static_cast<float>(img.rows - j);
  20. }
  21. }
  22. remap(img, dst, mapx, mapy, INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0));
  23. imshow("效果图",dst);
  24. waitKey(0);
  25. return 0;
  26. }

仿射变换:旋转、平移、缩放。

要进行仿射变换,必须先获取变换矩阵。要获取变换矩阵,必须先获取特征点坐标、角度等信息,几何匹配和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 );

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

第二个参数:旋转角度

第三个参数:缩放系数

示例:

  1. #include "opencv2/highgui/highgui.hpp"
  2. #include "opencv2/imgproc/imgproc.hpp"
  3. #include <iostream>
  4. using namespace cv;
  5. using namespace std;
  6. //-----------------------------------【宏定义部分】--------------------------------------------
  7. // 描述:定义一些辅助宏
  8. //------------------------------------------------------------------------------------------------
  9. #define WINDOW_NAME1 "【原始图窗口】" //为窗口标题定义的宏
  10. #define WINDOW_NAME2 "【经过Warp后的图像】" //为窗口标题定义的宏
  11. #define WINDOW_NAME3 "【经过Warp和Rotate后的图像】" //为窗口标题定义的宏
  12. int angle = -180;
  13. int scale = 1;
  14. //-----------------------------------【main( )函数】--------------------------------------------
  15. // 描述:控制台应用程序的入口函数,我们的程序从这里开始执行
  16. //-----------------------------------------------------------------------------------------------
  17. void on_traker(int, void*)
  18. {
  19. //【1】参数准备
  20. //定义两组点,代表两个三角形
  21. Point2f srcTriangle[3];
  22. Point2f dstTriangle[3];
  23. //定义一些Mat变量
  24. Mat rotMat(2, 3, CV_32FC1);
  25. Mat warpMat(2, 3, CV_32FC1);
  26. Mat srcImage, dstImage_warp, dstImage_warp_rotate;
  27. //【2】加载源图像并作一些初始化
  28. srcImage = imread("d://temp/1.jpg", 1);
  29. //if (!srcImage.data) { printf("读取图片错误,请确定目录下是否有imread函数指定的图片存在~! \n"); return false; }
  30. // 设置目标图像的大小和类型与源图像一致
  31. dstImage_warp = Mat::zeros(srcImage.rows, srcImage.cols, srcImage.type());
  32. //【3】设置源图像和目标图像上的三组点以计算仿射变换
  33. srcTriangle[0] = Point2f(0, 0);
  34. srcTriangle[1] = Point2f(static_cast<float>(srcImage.cols - 1), 0);
  35. srcTriangle[2] = Point2f(0, static_cast<float>(srcImage.rows - 1));
  36. dstTriangle[0] = Point2f(static_cast<float>(srcImage.cols*0.0), static_cast<float>(srcImage.rows*0.33));
  37. dstTriangle[1] = Point2f(static_cast<float>(srcImage.cols*0.65), static_cast<float>(srcImage.rows*0.35));
  38. dstTriangle[2] = Point2f(static_cast<float>(srcImage.cols*0.15), static_cast<float>(srcImage.rows*0.6));
  39. //【4】求得仿射变换
  40. warpMat = getAffineTransform(srcTriangle, dstTriangle);
  41. //【5】对源图像应用刚刚求得的仿射变换
  42. warpAffine(srcImage, dstImage_warp, warpMat, dstImage_warp.size());
  43. //【6】对图像进行缩放后再旋转
  44. // 计算绕图像中点顺时针旋转50度缩放因子为0.6的旋转矩阵
  45. Point center = Point(dstImage_warp.cols / 2, dstImage_warp.rows / 2);
  46. // 通过上面的旋转细节信息求得旋转矩阵
  47. rotMat = getRotationMatrix2D(center, angle, scale);
  48. // 旋转已缩放后的图像
  49. warpAffine(dstImage_warp, dstImage_warp_rotate, rotMat, dstImage_warp.size());
  50. //【7】显示结果
  51. imshow(WINDOW_NAME1, srcImage);
  52. imshow(WINDOW_NAME2, dstImage_warp);
  53. imshow(WINDOW_NAME3, dstImage_warp_rotate);
  54. }
  55. int main()
  56. {
  57. //【0】改变console字体颜色
  58. system("color 1F");
  59. namedWindow("自定义", WINDOW_AUTOSIZE);
  60. createTrackbar("角度", "自定义", &angle, 180, on_traker);
  61. createTrackbar("缩放因子", "自定义", &scale, 10, on_traker);
  62. on_traker(angle, 0);
  63. // 等待用户按任意按键退出程序
  64. waitKey(0);
  65. return 0;
  66. }
  67. 直方图均衡化:扩大图像的动态范围,通过拉伸像素强度分布范围来增强图像对比度的一种方法。----------------图像增强
  68. 函数:
  69. void equalizeHist( InputArray src, OutputArray dst );
  70. 第一个参数:输入灰度图像
  71. 第二个参数:输出图像
  72. 示例:
  73. #include<opencv2/highgui/highgui.hpp>
  74. #include<opencv2/imgproc/imgproc.hpp>
  75. using namespace cv;
  76. int main()
  77. {
  78. Mat img = imread("d://temp/1.jpg");
  79. Mat dst;
  80. cvtColor(img, img, COLOR_BGR2GRAY);
  81. imshow("原始图", img);
  82. equalizeHist(img, dst);
  83. imshow("效果图", dst);
  84. waitKey(0);
  85. return 0;
  86. }

发表评论

表情:
评论列表 (有 0 条评论,275人围观)

还没有评论,来说两句吧...

相关阅读

    相关 仿变换

    仿射变换是平移、缩放、旋转、对称、错切五种变换的组合,其数学表达形式如下: ⎧⎩⎨⎪⎪x′=a11x\+a12y\+x0y′=a12x\+a22y\+y0 采用

    相关 GDAL仿变换

    一、仿射变换(Affine GeoTransform)有六个参数,描述的是栅格行列号和地理坐标之间的关系。 在GDAL中可以通过函数GDALDataset::GetGeoTr

    相关 pytorch---仿变换

    一、仿射变换 图片的旋转、平移、缩放等可以看做一个像素的重采样过程。将原图的像素映射到目标图像的对应位置上,可以