作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

场景需求

在做图像处理时,有时候会需要适当地进行一些裁剪工作,比如我做干涉测量领域,我们所要处理的图像区域是条纹所在区域,而原图又远大于我所想分析的目标区,此时就需要对图像进行裁剪,这样做的好处:

1)缩减计算量,提高程序运行速度;

2)裁剪后的图像尺寸正好是归一化的图像尺寸,如果有归一化的需求,可以直接用裁剪图像尺寸建立归一化数据网格图。

我就是为了计算柱面的拟合系数才写了这个函数,若要得到同光学领域标准一致的系数,需要先归一化数据,而归一化的范围就正好是裁剪的图像大小。

函数通俗易懂,就是用掩膜锁定目标区,再分析掩膜在原图中的上下左右边界,用roi提取出来即可。

话不多说,下方为具体实现函数和测试代码。

功能函数代码

/*** @brief ImageCropping                    图像裁剪* @param phase                            所需裁剪的图像* @return                                 裁剪后图像*/
cv::Mat ImageCropping(const cv::Mat &phase) {// 非测量区一般都进行了NaN处理,所以掩膜绘制只需要判断是否为NaN值即可cv::Mat mask = cv::Mat::zeros(phase.size(), CV_8UC1);mask.setTo(255, phase == phase);int roi_up = 10000;int roi_down = 0;int roi_left = 10000;int roi_right = 0;int row = phase.rows;int col = phase.cols;for (int i = 0; i < row; i++){uchar *m = mask.ptr<uchar>(i);for (int j = 0; j < col; j++){if (m[j] != 0){if (j < roi_left)roi_left = j;if (j > roi_right)roi_right = j;if (i < roi_up)roi_up = i;if (i > roi_down)roi_down = i;}}}int w = roi_right - roi_left;int h = roi_down - roi_up;// 一般提取奇数尺寸,方便计算if (w % 2 == 0)w++;if (h % 2 == 0)h++;cv::Mat crop_phase = phase(cv::Rect(roi_left, roi_up, w, h)).clone();return crop_phase;
}

C++测试代码

#include<iostream>
#include<opencv2/opencv.hpp>
#include<ctime>
using namespace std;
using namespace cv;
cv::Mat ImageCropping(const cv::Mat &phase);
int main(void)
{cv::Mat phase(100, 100, CV_32FC1, nan(""));cv::circle(phase, cv::Point(50, 50), 30, 255, -1);cv::Mat crop = ImageCropping(phase);imshow("original", phase);imshow("result", crop);waitKey(0);system("pause");return 0;
}
/*** @brief ImageCropping                    图像裁剪* @param phase                            所需裁剪的图像* @return                                 裁剪后图像*/
cv::Mat ImageCropping(const cv::Mat &phase) {// 非测量区一般都进行了NaN处理,所以掩膜绘制只需要判断是否为NaN值即可cv::Mat mask = cv::Mat::zeros(phase.size(), CV_8UC1);mask.setTo(255, phase == phase);int roi_up = 10000;int roi_down = 0;int roi_left = 10000;int roi_right = 0;int row = phase.rows;int col = phase.cols;for (int i = 0; i < row; i++){uchar *m = mask.ptr<uchar>(i);for (int j = 0; j < col; j++){if (m[j] != 0){if (j < roi_left)roi_left = j;if (j > roi_right)roi_right = j;if (i < roi_up)roi_up = i;if (i > roi_down)roi_down = i;}}}int w = roi_right - roi_left;int h = roi_down - roi_up;// 一般提取奇数尺寸,方便计算if (w % 2 == 0)w++;if (h % 2 == 0)h++;cv::Mat crop_phase = phase(cv::Rect(roi_left, roi_up, w, h)).clone();return crop_phase;
}

测试效果

图1 裁剪前后对比图

在测试案例中,随机生成了一个100*100的数据矩阵,中间一个30半径的圆,也是我需要的目标区域,运用ImageCropping函数实现了目标区域的提取。

如果函数有什么可以改进完善的地方,非常欢迎大家指出,一同进步何乐而不为呢~

如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

C++-图像目标区裁剪ImageCropping相关推荐

  1. 【OpenCV 例程200篇】09. 图像的裁剪(cv2.selectROI)

    [OpenCV 例程200篇]09. 图像的裁剪(cv2.selectROI) 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持 ...

  2. 【pytorch 】torchvision.transforms.CenterCrop==>从图像中心裁剪图片

    transforms.CenterCrop torchvision.transforms.CenterCrop(size) 功能:从图像中心裁剪图片 size: 所需裁剪的图片尺寸 transform ...

  3. python裁剪图片box并保存_python实现图像随机裁剪

    实验条件: 从1张图像随机裁剪100张图像 裁剪出图像的大小为 60 x 60 IoU 大于等于 th=0.6 的裁剪框用红色标出,其它裁剪框用蓝色标出 IoU 比对原始区域用绿框标出 实验代码: i ...

  4. MATLAB 将图像随机裁剪为N*N的图像块

    近期在做实验时想把一张图像随机裁剪为N*N的小图像块,学习后并进行记录. matlab实现将图像依次拆分成64*64的图像块(无重复裁剪) 首先介绍matlab imcrop函数: 第一种用法: [I ...

  5. 平面设计师之路2——图像的裁剪与拼合还原

    开展本教程的目的是兼顾实用性与当前工作的结合,让大家带着目的学习平面设计技术,因此我将第二贴的主题定义为"图像的裁剪与拼合还原".这一技术入门简单,但是在程序员将美工的工作成果代码 ...

  6. php图像处理类实现缩放 裁剪 加水印,ThinkPHP图像的裁剪、缩放、加水印

    ThinkPHP 图片处理函数,需要文字水印字体,可在windows下 控制面板 > 大图标(右上角) > 字体 找到需要的字体 /** * 图像的裁剪.缩放.加水印 * @param s ...

  7. 一招教你轻松从图像中裁剪出婚纱礼服和面纱

    Super PhotoCut Pro是一款简单粗暴的抠图软件,它能够准确地覆盖你想要去除的任何一个细节区域,抠出图片中你最想要的部分,不需要任何的技巧,那么photocut怎么用呢?你只需要在图片上勾 ...

  8. matlab如何对三维图进行裁剪,一种三维图像的裁剪方法

    一种三维图像的裁剪方法 [技术领域] [0001] 本发明涉及图像处理技术领域,尤其涉及一种三维图像的裁剪方法. [背景技术] [0002] 无论是为了获得对象的完美三维(3D)图像,还是需要在对象的 ...

  9. python图像切割成多边形_python opencv在图像中裁剪任意形状多边形,裁剪镂空多边形, 裁剪多个多边形...

    一.裁剪单个多边形 import numpy as np import cv2 # 读取图像 img = cv2.imread("dog.jpg") # 坐标点points pts ...

最新文章

  1. 文本超出显示省略号/数字英文字母折行有关css 属性/显示两行,第二行省略号显示css方法...
  2. python能print中文吗_win10中文版,python的print不能打印中文字符?
  3. 汇编指令长度计算方法
  4. 分享到facebook链接原格式_神马?!你还不知道Facebook广告怎么操作?
  5. webpack(1)-简介和基础知识
  6. Telegraf和Grafana监控多平台上的SQL Server
  7. 1288:三角形最佳路径问题-2019-07-04
  8. java多线程构造函数_java线程基础巩固---多线程与JVM内存结构的关系及Thread构造函数StackSize的理解...
  9. vue(vue-cli+vue-router)+babel+webpack项目搭建入门(四)
  10. Win7使用之查端口,杀进程
  11. 九、面向对象三大特征(三)—— 多态
  12. VS2012安装教程
  13. 图像分类经典卷积神经网络—SENet论文翻译(纯中文版)—Squeeze-and-Excitation Networks(挤压和激励网络)
  14. 持久层框架常用关键字 NE GE LE GT LT EQ 等等
  15. 使用NPOI导出Excel模板
  16. ubuntu下安装 julia-1.4.2
  17. 2021物理化学实验4:液体饱和蒸气压的测定
  18. java实现生成二维码及扫码登录
  19. 天龙八部服务器端Lua脚本系统
  20. pthread_cancel引起程序段错误

热门文章

  1. 安装McAfee EPO 5.10.0
  2. 手机计算机里面的符号代表什么意思,手机上这些符号是什么意思,全知道的没几个人...
  3. win10桌面计算机在哪里打开,Win10计算器在哪里?三种可以打开Win10计算器的方法图文介绍...
  4. 阿里云天池大赛赛题(机器学习)——工业蒸汽量预测(完整代码)
  5. 简化真值表(根据表绘制电路)
  6. |PS内置滤镜简介|
  7. 打造最小的XP系统180M
  8. 便利贴--23{移动端滑动模块-改良}
  9. Solidworks中螺纹怎么收尾?
  10. 数字电子技术基础大作业---电子表、流水灯