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[1:][99:100,100:101])
print(img[100,100,1])
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)

#高斯模糊  ^_^近视的感觉
#ksize:模糊大小,值为正奇数 type:tuple,这里是(51,51)
#sigmaX:X方向上的高斯核标准差,值为0则会从ksize算出
#sigmaY?:Y方向上的高斯核标准差,不填则引用sigmaX的值,同样值为0则会从ksize算出
res1 = cv.GaussianBlur(img,(51,51),0)


cv.namedWindow('img',cv.WINDOW_NORMAL)
cv.resizeWindow('img',200,100)
cv.imshow('img',res)
cv.waitKey(0)
cv.imshow('img',res1)
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的知识:数组的切片等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值