图像ROI与mask掩码与图像几何变换

news2024/12/23 9:47:27

图像ROI与mask掩码与图像几何变换

感兴趣区域ROI:

⚫ ROI—(region of interest)—感兴趣区域
⚫ 形状可有矩形,圆形,椭圆形等
⚫ 能够确定分析重点,减少处理时间,提高精度

使用Rect起点终点范围
示例代码:

import cv2
import numpy as np
img = cv2.imread(‘…/datas/fengjing1.png’)
cv2.rectangle(img, (211, 250), (706, 483 ), (0, 255, 255))
cv2 .imshow(‘src’, img)
roi = img[250:483,211:706] #—y1:y2,x1:x2
cv2.imshow(‘ROI’, roi)
cv2.waitKey(0)

注意ROI参数顺序y1, y2, x1, x2

在这里插入图片描述

图像几何变换

图像缩放—cv2.resize()

cv2.resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None)

src: 输入图像
dst: 输出图像
dsize: Size类型,指定输出图像大小,如果它等于0,由下式计算:
dsize = Size(round(fxsrc.cols), round(fysrc.rows))
fx: 沿水平方向的缩放系数,默认值0,等于0时,由下式计算:
(double)dsize.width/src.cols
fy: 沿垂直方向的缩放系数,默认值0,等于0时,由下式计算:
(double)dsize.height/src.rows
interpolation: 用于指定插值方式,默认为cv2.INTER_LINEAR (线性插值)

INTER NEAREST #最邻近插值
INTER LINEAR #线性插值(默认值)(大图像使用–快)INTER AREA #区域插值(小图像推荐使用)
INTER CUBIC #三次样条插值(放大图像使用–慢)
INTER LANCZOS4 #Lanczos插值

使用示例

import cv2
import numpy as np
#图像的缩放

img1 = cv2.imread(‘…/datas/fengjing1.png’)#(546, 820, 3)
print(img1.shape)
dst1 = cv2.resize(img1, None, fx=0.2, fy=0.2)
dst2 = cv2.resize(img1, (164, 109), interpolation=cv2.INTER_AREA)# 输出图像的形状:(w, h)
#cv2.imwrite(‘test1.png’, dst1)
#cv2.imwrite(‘test2.png’, dst2)

print(dst1.shape)
cv2.imshow(‘test’, np.hstack([dst1, dst2]))
cv2.waitKey(0)
cv2.imshow(‘img1’, img1)
cv2.waitKey(0)

dst1 = cv2.resize(img1, None, fx=0.2, fy=0.2)
dst2 = cv2.resize(img1, (164, 109), interpolation=cv2.INTER_AREA)# 输出图像的形状:(w, h)

在这里插入图片描述

图像平移

原理简介

在这里插入图片描述

使用示例

#---平移函数1(原图,X方向位移,Y方向位移)
#---不改变原图大小,会丢失信息
def imgTranslate (img,xoffset,yoffset):
  rows = img.shape[0]
  cols = img.shape[1]
  dst = np.zeros ((rows,cols ,3) ,np.uint8)
  for i in range(0,rows) :
      for j in range(0,cols) :
          x=j+ xOffset
          y=i+ yOffset
          if(x>=0 and y>=0 and x<cols and y<rows) :
             dst[y,x] = img[i,j]
  return dst
#---平移函数2(原图,x方向位移,Y方向位移)#---改变原图大小,不丢失信息
def imgTranslate2 (img,xoffset,yoffset):
   rows = img.shape[0]+abs(yoffset)
   cols = img.shape[1]+abs(xoffset)
   dst = np.zeros ((rows ,cols ,3) ,np.uint8)
   for i in range (0,img.shape[0]) :
      for j in range (0 ,img.shape[1]) :
         x= j + xOffset
         y= i + yOffset
         if(x>=0 and y>=0 and x<cols and y<rows) :
             dst[y,x] = img[i,j]
   return dst

简单快速平移方法

平移就是将对象换一个位置。如果你要沿(X,y)方向移动,移动的距离是(tx,ty),你可以以下面的方式构建移动矩阵:
在这里插入图片描述

你可以使用 Numpy 数组构建这个矩阵(数据类型是 np.float32),然后把它传给函数cv2.warpAffine()

exl:
#读取图像1
img1=cv2 .imread('lena.jpg')
cv2.imshow('srcl',img1)
rows,cols,channel = img1.shape #获取图像属性
M = np.float32([[1,0,100],[0,1,50]])
dst = cv2 .warpAffine (img1,M,(cols ,rows))

图像旋转

图示简介

在这里插入图片描述
⚫OpenCV没有提供直接旋转图像的函数

⚫图像旋转可能会造成图像信息丢失

⚫图像旋转可以用仿射变换来实现

⚫主要用到函数:cv2.getRotationMatrix2D() cv2.warpAffine()

旋转矩阵M:

在这里插入图片描述
在这里插入图片描述
参数分别对应为:旋转中心,旋转角度,旋转后的缩放因子。

使用实例

在这里插入图片描述

img1=cv2.imread('lena.jpg') #读取图像1
cv2 .imshow('src1', img1)
rows,cols,channel = img1.shape #获取图像属性
M = cv2.getRotationMatrix2D ((cols/2,rows/2),45,1)
dst = cv2.warpAffine(img1,M,(cols,rows)) #仿射变换
cv2.imshow('dst',dst) #结果显示
cv2 .waitKey(0)
cv2.destroyAllwindows ()

转置和镜像

⚫用到的函数 cv2.transpose()、cv2.flip()

⚫可以实现转置和镜像变换,以及90°,180°旋转
在这里插入图片描述
flipCode = 0, 垂直翻转(沿X轴翻转);
flipCode > 0, 水平翻转(沿Y轴翻转);
flipCode < 0, 水平垂直翻转(180°中心对称);
在这里插入图片描述

重映射—cv2.remap():

cv2.remap()函数
重映射是指把一个图像中的一个位置的像素通过映射关系转换到另一图像的指定位置。对于输入原图像f(x, y), 目标图像g(x, y), 映射关系为T, 则满足下式:
g(x, y) = T(f(x, y))
在这里插入图片描述
⚫map1: 表示(x, y)点的坐标或x坐标,CV_16SC2, CV_32FC1,CV_32FC2类型
⚫map2: 表示(x, y)点y坐标,如果map1为(x, y),map2可以选择不用,可以是CV_16UC1, CV_32FC1
⚫interpolation: 表示插值方法
⚫borderMode: 表示边界插值类型
⚫borderValue: 表示插值数值

使用实例

xMap = np.zeros (img1 . shape [:2],np .float32)
yMap = np.zeros (img1 . shape[:2] ,np .float32)
rows = img1 .shape[0]
cols = img1 .shape[1]
for i in range(0,rows) :
    for j in range(0,cols):
       xMap .itemset((i,j) ,j)
       yMap.itemset((i,j) ,i+5*math.sin (j/10.0))
dst = cv2.remap (img1,xMap,yMap,interpolation=cv2.INTER LINEAR

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/455332.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

条码控件Aspose.BarCode入门教程(8):C#从图像中读取条形码

Aspose.BarCode for .NET 是一个功能强大的API&#xff0c;可以从任意角度生成和识别多种图像类型的一维和二维条形码。开发人员可以轻松添加条形码生成和识别功能&#xff0c;以及在.NET应用程序中将生成的条形码导出为高质量的图像格式。 Aspose API支持流行文件格式处理&am…

【对话ChatGPT】如何看待java行业内卷的问题?

本文首发自「慕课网」&#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注"慕课网"&#xff01; 作者&#xff1a;ccLoveStudy 当今大环境&#xff0c;编程行业火热&#xff0c;而java行业更是首当其冲&#xff0c;但是为此&#xff0…

( “树” 之 Trie) 208. 实现 Trie (前缀树) ——【Leetcode每日一题】

知识点回顾 &#xff1a; Trie&#xff0c;又称前缀树或字典树&#xff0c;用于判断字符串是否存在或者是否具有某种字符串前缀。 ❓208. 实现 Trie (前缀树) 难度&#xff1a;中等 Trie&#xff08;发音类似 “try”&#xff09;或者说 前缀树 是一种树形数据结构&#xff…

基于ArcGIS Pro、R、INVEST等多技术融合下生态系统服务权衡与协同动态分析实践应用

生态系统服务是指生态系统所形成的用于维持人类赖以生存和发展的自然环境条件与效用&#xff0c;是人类直接或间接从生态系统中得到的各种惠益。联合国千年生态系统评估&#xff08;Millennium ecosystem assessment&#xff0c;MA&#xff09;提出生态系统服务包括供给、调节、…

SequoiaDB分布式数据库2023.3月刊

本月看点速览 赋能行业&#xff0c;参编《分布式数据库金融应用发展报告》 脱颖而出&#xff0c;入选2022专精特新黑马大赛年度十强 激烈角逐&#xff0c;成功晋级全国信创优秀解决方案决赛 新穗新彩&#xff0c;多家权威媒体走进巨杉 青杉计划2023持续进行&#xff0c;一起…

Java中字符串的初始化详解

前言 在深入学习字符串类之前&#xff0c;我们先搞懂JVM是怎样处理新生字符串的。当你知道字符串的初始化细节后&#xff0c;再去写String s "hello"或String s new String("hello")等代码时&#xff0c;就能做到心中有数。 首先得搞懂字符串常量池的概…

【流畅的Python学习笔记】2023.4.24

此栏目记录我学习《流畅的Python》一书的学习笔记&#xff0c;这是一个自用笔记&#xff0c;所以写的比较随意&#xff0c;随缘更新 用bisect来管理已排序的序列 bisect 模块包含两个主要函数&#xff0c;bisect 和 insort&#xff0c;两个函数都利用二分查找算法来在有序序列…

【Golang开发入门】你会真的会用Go写“Hello world“吗?

博主简介&#xff1a;努力学习的大一在校计算机专业学生&#xff0c;热爱学习和创作。目前在学习和分享&#xff1a;数据结构、Go&#xff0c;Java等相关知识。博主主页&#xff1a; 是瑶瑶子啦所属专栏: Go语言核心编程近期目标&#xff1a;写好专栏的每一篇文章 目录 一、Go项…

Linux下版本控制器(SVN) -命令行客户端

文章目录 进阶知识-Linux下版本控制器(SVN)5、命令行客户端5.1 创建两个工作区目录模拟两个开发人员5.2 检出5.3 添加5.4 提交5.5 查看服务器端文件内容5.6 更新操作5.7 冲突5.7.1 过时的文件5.7.2 冲突的产生5.7.3 冲突的表现5.7.4 冲突的手动解决5.7.5 冲突的半自动解决5.7.6…

ERTEC200P-2 PROFINET设备完全开发手册(10)

10. 固化程序 固件在SPI Flash的结构 由于绝大多数的设计都是使用SPI Flash&#xff0c;因此这里只介绍SPI Flash的烧写。ERTEC200P-2的固件在SPI Flash中的Layout如下图所示&#xff1a; 其中ROM Header&#xff1a;格式如下图所示&#xff1a; Firmware Binary: 协议栈固件…

【TypeScript】TS中type和interface在类型声明时的区别

🐱 个人主页:不叫猫先生 🙋‍♂️ 作者简介:2022年度博客之星前端领域TOP 2,前端领域优质作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀! 💫优质专栏:vue3从入门到精通、TypeScript从入门到实践 📢 资料领取:前端进阶资料可以找我免…

RxJava中DISPOSED状态的被观察者任务执行onError/onSuccess导致的崩溃问题

RxJava中写了doOnError但还是导致应用崩溃问题记录 一、问题背景1.1 崩溃堆栈1.2 写demo代码复现相同逻辑 二、问题等价还原-复现2.1 代码位置&#xff1a;io.reactivex.internal.operators.single.SingleCreate.Emitter#onError 三、修复方法3.1 方案一&#xff1a;设置全局的…

springboot +flowable,处理 flowable 的用户和用户组(二)

一.简介 对于flowable是什么以及关于此框架的具体信息可以参看此项目的官方文档&#xff1a;https://www.flowable.org/docs/userguide/index.html Flowable is a light-weight business process engine written in Java.这是官网文档对此框架的完美解释&#xff1a;Flowable…

4·26世界知识产权日,Adobe助力认知和解决知识产权的那些事

2023年是中国与世界知识产权组织(WIPO)合作50周年&#xff0c;在第23个世界知识产权日来临之际&#xff08;每年4月26日定为世界知识产权日&#xff09;&#xff0c;让我们先来了解一下知识产权的相关知识吧&#xff01; ①“知识产权”的定义是什么&#xff1f; 知识产权是指…

FVM初启,Filecoin生态爆发着力点在哪?

Filecoin 小高潮 2023年初&#xff0c;Filecoin发文分享了今年的三项重大变更&#xff0c;分别是FVM、数据计算和检索市场的更新&#xff0c;这些更新消息在发布后迅速吸引了市场的广泛关注。 特别是在3月14日&#xff0c;Filecoin正式推出了FVM&#xff0c;这一变革使得File…

对比度亮度调整与通道分离合并

对比度亮度调整与通道分离合并 对比度亮度调整: 1)原理介绍: g’ g * Mult Add ⚫ g 表示原图像像素 ⚫ g’ 表示输出图像像素 ⚫ Mult 被称为增益(gain), 通常用来控制图像的对比度 ⚫ Add 通常被称为偏置(bias), 通常用来控制图像的亮度 g’(i,j) Mult * g(i,j) Add …

九龙证券|两日连涨,猪价或见底!二季度末生猪养殖有望扭亏为盈

猪肉产品质量和价格涨跌备受商场重视。 猪肉指数接连下行 4月20日&#xff0c;A股大盘全天弱势。猪肉指数继续下行&#xff0c;收跌0.65%。成份股中&#xff0c;仅新五丰、温氏股份等上涨&#xff0c;大多个股录得跌落。天域生态跌4.46%&#xff0c;海大集团、禾丰股份跌逾3%。…

Ubuntu 20.04 安装 Latex 并使用 vscode 作为文本编辑器

Ubuntu 20.04 安装 Latex 并使用 vscode 作为文本编辑器 1 Texlive 下载与安装1.1 镜像文件下载1.2 安装步骤1.3 查看是否安装成功1.4 相关依赖安装 2 安装 windows 字体3 vscode 编辑与编译环境配置3.1 vscode 安装3.2 编辑相关插件安装3.3 编译环境配置附录&#xff1a; 因为…

【Redis】Redis持久化

介绍 ​ Redis是一个内存数据库&#xff0c;数据保存在内存中&#xff0c;但是我们都知道内存的数据变化是很快的&#xff0c;也容易发生丢失。Redis提供了持久化的机制&#xff0c;分别是RDB(Redis DataBase)和AOF(Append Only File)。 ​ 既然redis的数据可以保存在磁盘上&…

STL : 栈 stack 与 队列 queue

Stack #include<stack> using namespace std; 栈&#xff1a;LIFO&#xff0c;先进后出&#xff1b; 不允许遍历&#xff0c;仅仅一个出口&#xff0c;只有栈顶元素可被访问到。 Member functions NameRoleNotice&#xff08;constructor&#xff09;基本构造函数指…