C++-图像目标区裁剪ImageCropping
作者:翟天保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;
}
测试效果
在测试案例中,随机生成了一个100*100的数据矩阵,中间一个30半径的圆,也是我需要的目标区域,运用ImageCropping函数实现了目标区域的提取。
如果函数有什么可以改进完善的地方,非常欢迎大家指出,一同进步何乐而不为呢~
如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!
C++-图像目标区裁剪ImageCropping相关推荐
- 【OpenCV 例程200篇】09. 图像的裁剪(cv2.selectROI)
[OpenCV 例程200篇]09. 图像的裁剪(cv2.selectROI) 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持 ...
- 【pytorch 】torchvision.transforms.CenterCrop==>从图像中心裁剪图片
transforms.CenterCrop torchvision.transforms.CenterCrop(size) 功能:从图像中心裁剪图片 size: 所需裁剪的图片尺寸 transform ...
- python裁剪图片box并保存_python实现图像随机裁剪
实验条件: 从1张图像随机裁剪100张图像 裁剪出图像的大小为 60 x 60 IoU 大于等于 th=0.6 的裁剪框用红色标出,其它裁剪框用蓝色标出 IoU 比对原始区域用绿框标出 实验代码: i ...
- MATLAB 将图像随机裁剪为N*N的图像块
近期在做实验时想把一张图像随机裁剪为N*N的小图像块,学习后并进行记录. matlab实现将图像依次拆分成64*64的图像块(无重复裁剪) 首先介绍matlab imcrop函数: 第一种用法: [I ...
- 平面设计师之路2——图像的裁剪与拼合还原
开展本教程的目的是兼顾实用性与当前工作的结合,让大家带着目的学习平面设计技术,因此我将第二贴的主题定义为"图像的裁剪与拼合还原".这一技术入门简单,但是在程序员将美工的工作成果代码 ...
- php图像处理类实现缩放 裁剪 加水印,ThinkPHP图像的裁剪、缩放、加水印
ThinkPHP 图片处理函数,需要文字水印字体,可在windows下 控制面板 > 大图标(右上角) > 字体 找到需要的字体 /** * 图像的裁剪.缩放.加水印 * @param s ...
- 一招教你轻松从图像中裁剪出婚纱礼服和面纱
Super PhotoCut Pro是一款简单粗暴的抠图软件,它能够准确地覆盖你想要去除的任何一个细节区域,抠出图片中你最想要的部分,不需要任何的技巧,那么photocut怎么用呢?你只需要在图片上勾 ...
- matlab如何对三维图进行裁剪,一种三维图像的裁剪方法
一种三维图像的裁剪方法 [技术领域] [0001] 本发明涉及图像处理技术领域,尤其涉及一种三维图像的裁剪方法. [背景技术] [0002] 无论是为了获得对象的完美三维(3D)图像,还是需要在对象的 ...
- python图像切割成多边形_python opencv在图像中裁剪任意形状多边形,裁剪镂空多边形, 裁剪多个多边形...
一.裁剪单个多边形 import numpy as np import cv2 # 读取图像 img = cv2.imread("dog.jpg") # 坐标点points pts ...
最新文章
- 文本超出显示省略号/数字英文字母折行有关css 属性/显示两行,第二行省略号显示css方法...
- python能print中文吗_win10中文版,python的print不能打印中文字符?
- 汇编指令长度计算方法
- 分享到facebook链接原格式_神马?!你还不知道Facebook广告怎么操作?
- webpack(1)-简介和基础知识
- Telegraf和Grafana监控多平台上的SQL Server
- 1288:三角形最佳路径问题-2019-07-04
- java多线程构造函数_java线程基础巩固---多线程与JVM内存结构的关系及Thread构造函数StackSize的理解...
- vue(vue-cli+vue-router)+babel+webpack项目搭建入门(四)
- Win7使用之查端口,杀进程
- 九、面向对象三大特征(三)—— 多态
- VS2012安装教程
- 图像分类经典卷积神经网络—SENet论文翻译(纯中文版)—Squeeze-and-Excitation Networks(挤压和激励网络)
- 持久层框架常用关键字 NE GE LE GT LT EQ 等等
- 使用NPOI导出Excel模板
- ubuntu下安装 julia-1.4.2
- 2021物理化学实验4:液体饱和蒸气压的测定
- java实现生成二维码及扫码登录
- 天龙八部服务器端Lua脚本系统
- pthread_cancel引起程序段错误
热门文章
- 安装McAfee EPO 5.10.0
- 手机计算机里面的符号代表什么意思,手机上这些符号是什么意思,全知道的没几个人...
- win10桌面计算机在哪里打开,Win10计算器在哪里?三种可以打开Win10计算器的方法图文介绍...
- 阿里云天池大赛赛题(机器学习)——工业蒸汽量预测(完整代码)
- 简化真值表(根据表绘制电路)
- |PS内置滤镜简介|
- 打造最小的XP系统180M
- 便利贴--23{移动端滑动模块-改良}
- Solidworks中螺纹怎么收尾?
- 数字电子技术基础大作业---电子表、流水灯