图像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