文章目录
基本处理
读取图像
存储图像
import cv2
color_img=cv2.imread('test.png')
print(color_img.shape)
# 读取单通道
gray_img=cv2.imread('test.png',cv2.IMREAD_GRAYSCALE)
print(gray_img.shape)
#把单通道图像保存后,再读取,仍然是3通道,相当于将单通道复制到3个通道保存
cv2.imwrite('grayscale_test.png',gray_img)
reload_grayscale=cv2.imread('grayscale_test.png')
print(reload_grayscale.shape)
# 指定jpg质量,范围从1~100,默认95,值越高画质越好,文件越大
cv2.imwrite('anglababy.jpg',color_img,(cv2.IMWRITE_JPEG_QUALITY,20))
#(1321, 738, 3)
#(1321, 738)
#(1321, 738, 3)
缩放、补边、裁边
import cv2
img=cv2.imread('test.png')
# 缩小为200x200的正方形
img_200x200=cv2.resize(img,(200,200))
# 不直接指定缩放后的大小,通过fx和fy指定缩放比例,0.5表示长宽各一半
# 插值方法默认为cv2.INTER_LINEAR,这里指定为最近邻插值
img_half=cv2.resize(img,(0,0),fx=0.5,fy=0.5,interpolation=cv2.INTER_NEAREST)
# 上下各贴50像素的黑边
img_add=cv2.copyMakeBorder(img,50,50,0,0,cv2.BORDER_CONSTANT,value=(0,0,0))
# 裁剪
patch_img=img[20:150,-180:-50]
cv2.imshow("image",img_200x200)
cv2.imshow("img_half",img_half)
cv2.imshow("img_add",img_add)
cv2.imshow("patch_img",patch_img)
cv2.waitKey(0)
色调、明暗
import cv2
img=cv2.imread('test.png')
# 通过cv2.cvtcolor把图像从RGB转到HSV
img_hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
# H空间中,绿色比黄色值高,所以给每个像素+15,黄色的就会变绿
turn_green_hsv=img_hsv.copy()
turn_green_hsv[:,:,0]=(turn_green_hsv[:,:,0]+15)
turn_green_img=cv2.cvtColor(turn_green_hsv,cv2.COLOR_HSV2BGR)
cv2.imshow("turn_green_img",turn_green_img)
# 减小饱和度会让图像损失鲜艳,变得更灰
colorless_hsv=img_hsv.copy()
colorless_hsv[:,:,1]=0.5*colorless_hsv[:,:,1]
colorless_img=cv2.cvtColor(colorless_hsv,cv2.COLOR_HSV2BGR)
cv2.imshow("colorless_img",colorless_img)
# 减小为原来的一半
darker_hsv=img_hsv.copy()
darker_hsv[:,:,2]=0.5*darker_hsv[:,:,2]
darker_img=cv2.cvtColor(darker_hsv,cv2.COLOR_HSV2BGR)
cv2.imshow("darker_img",darker_img)
cv2.waitKey(0)
仿射变换
图像的仿射变换涉及到图像的形状位置角度的变化,是深度学习预处理中常到的功能,在此简单回顾一下。仿射变换具体到图像中的应用,主要是对图像的缩放,旋转,剪切,翻转和平移的组合。在OpenCV中,仿射变换的矩阵是一个2×3的矩阵,其中左边的2×2子矩阵是线性变换矩阵,右边的2×1的两项是平移项:
需要注意的是,对于图像而言,宽度方向是x,高度方向是y,坐标的顺序和图像像素对应下标一致。所以原点的位置不是左下角而是右上角,y的方向也不是向上,而是向下。在OpenCV中实现仿射变换是通过仿射变换矩阵和cv2.warpAffine()这个函数:
import numpy as np
import cv2
img = cv2.imread('test.png')
# 沿着横纵轴放大1.6倍,之后平移(-150,-240),最后沿原图大小截取,等效于剪裁并放大
M_crop_dog = np.array([
[1.6, 0, -150],
[0, 1.6, -240]
], dtype=np.float32)
# cv2.warpAffine(原始图像, 变换矩阵,变换后的图像大小)
img_dog = cv2.warpAffine(img, M_crop_dog,(400, 400))
cv2.imshow("img_dog", img_dog)
# x轴的剪切变换,逆时针旋转角度15°
theta=15*np.pi/180
M_shear=np.array([
[1,np.tan(theta),0],
[0,1,0]
],dtype=np.float32)
img_sheared=cv2.warpAffine(img,M_shear,(400,600))
cv2.imshow("img_sheared",img_sheared)
# 顺时针旋转,角度15°
M_rotate=np.array([
[np.cos(theta),-np.sin(theta),0],
[np.sin(theta),np.cos(theta),0]
],dtype=np.float32)
im_rotate=cv2.warpAffine(img,M_rotate,(400,600))
cv2.imshow("im_rotate",im_rotate)
# 旋转+缩放+旋转组合,可以通过SVD分解理解
M=np.array([
[1,1.5,-400],
[0.5,2,-100]
],dtype=np.float32)
img_tr
ansformed=cv2.warpAffine(img,M,(400,600))
cv2.imshow("img_transformed",img_transformed)
cv2.waitKey(0)