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

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

感兴趣区域ROI:

⚫ROI—(region of interest)—感兴趣区域
⚫一般为矩形区域
⚫能够确定分析重点,减少处理时间,提高精度
⚫定义方法:
使用Rect起点终点范围

img= cv2 .imread('1 .jpg')
cv2 .imshow('src', img)
roi = img[250:483,211:706] #---y1:y2,x1:x2
cv2.imshow('ROI', roi)

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

在这里插入图片描述

图像几何变换

图像缩放—cv2.resize()

在这里插入图片描述

⚫ src: 输入图像
⚫ dst: 输出图像
⚫ dsize: Size类型,指定输出图像大小,如果它等于0,由下式计算:
dsize = Size(round(fx*src.cols), round(fy*src.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插值

使用示例

exl:
dst=cv2.resize(img1,None,fx=2,fy=2,interpolation=cv2.INTER LINEAR)
ex2:
dst=cv2.resize(img1,(320,320) ,interpolation=cv2.INTER AREA)

在这里插入图片描述

图像平移

原理简介

在这里插入图片描述

使用示例

#---平移函数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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_40911806/article/details/129958167
今日推荐