python-opencv 图片的基本变换操作

import cv2 as cv
import numpy as np

img = cv.imread("./shangyi.jpg",cv.IMREAD_COLOR) #960*540 numpy.ndarray
#截取像素区域
print(img[1:,2:3,:])
print(img[100,100,1])
#获取像素点
print(img.item(100,100,0))
#获取图像分辨率
print(img.shape) #(行,列,通道)
#获取图像大小(像素个数)
print(img.size)
#获取图片数据类型
print(img.dtype)

#缩放
small = cv.resize(img,(int(960/100),int(540/2)),interpolation=cv.INTER_CUBIC)
big = cv.resize(img,None,fx=1/20,fy=100,interpolation=cv.INTER_LINEAR)

#平移
M = np.float64([[1,0,100],[0,1,50]]) #[[x轴缩放,x轴斜切,x轴平移],[y轴斜切,y轴缩放,y轴平移]]
rows,cols,alpha = img.shape
#flags?:2*3矩阵的类型,borderMode?:平移后产生的边框的填充模式,borderValue?:只有当borderMode=cv.BORDER_CONSTANT时有效,用值为BGR颜色填充
dst = cv.warpAffine(img,M,(cols,rows),flags=cv.WARP_INVERSE_MAP,borderMode=cv.BORDER_CONSTANT,borderValue=[255,0,0])

#旋转
#center:图片中心坐标,(width/2,height/2),angle:图片旋转角度,scale:图片缩放 => 2*3的变换矩阵
M1 = cv.getRotationMatrix2D((cols/2,rows/2),90,1)
dst1 = cv.warpAffine(img,M1,(cols,rows))

#映射
#3个坐标点确定一个平面,并且确定平行线(网格分割图片区域)的方向
pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]])
M2 = cv.getAffineTransform(pts1,pts2)#变换方向 pts1=>pts2
dst2 = cv.warpAffine(img,M2,(cols,rows),borderMode=cv.BORDER_CONSTANT,borderValue=[255,0,0])

#透视
#以屏幕为参照平面,并以4个坐标点确定一个透视面,变换时遵从近大远小原则.
pts3 = np.float32([[50,50],[910,50],[50,490],[910,490]])
pts4 = np.float32([[100,100],[860,100],[0,540],[960,540]])
M3 = cv.getPerspectiveTransform(pts3,pts4)#变换方向 pts3=>pts4
dst3 = cv.warpPerspective(img,M3,(cols,rows),borderMode=cv.BORDER_CONSTANT,borderValue=[255,0,0])

#灰度图
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)

#中值模糊
#ksize:模糊程度,值为大于1的奇数,这里是51
res = cv.medianBlur(img,51)




cv.namedWindow('img',cv.WINDOW_NORMAL)
cv.resizeWindow('img',200,100)
cv.imshow('img',res)
cv.waitKey(0)
cv.imshow('img',gray)
cv.waitKey(0)
cv.imshow('img',small)
cv.waitKey(0)
cv.imshow('img',big)
cv.waitKey(0)
cv.imshow('img',dst)
cv.waitKey(0)
cv.imshow('img',dst1)
cv.waitKey(0)
cv.imshow('img',dst2)
cv.waitKey(0)
cv.imshow('img',dst3)
cv.waitKey(0)
cv.destroyAllWindows()

其中包含了部分numpy.array的知识:数组的切片等

上一篇:OpenCV 轮廓查找与绘制-最小外接矩形


下一篇:python+opencv图像处理