主要用到三个函数cv2.imread()、cv2.imshow()、cv2.imwrite().
代码示例
import cv2 as cv
image=cv.imread("D:/picture/9.jpg")
cv.namedWindow("picture",cv.WINDOW_AUTOSIZE)
print(f"width:{image.shape[1]} pixels")
print(f"height:{image.shape[0]} pixels")
print(f"height:{image.shape[2]}")
cv.imshow("picture",image)
cv.waitKey(0)
cv.imwrite("new_image.jpg",image)
cv.destroyAllWindows()
上述代码,用cv.imread()读入图像,两个参数(1)简单的传入一个图像的地址参数,并返回一个代表图片的Numpy数组.(2)读取图片返回的形式,有三种选择:cv2.IMRE AD_COLOR、cv2.IMREAD_GRAYSCALE和cv2.IMREAD_UNCHANGED,其中IMREAD_UNCHANGED表示不变,比如有alpha通道,它会读取。alpha通道的作用是按比例将前景像素和背景像素进行混合,来衡量图像的透明度。也可以使用数字来表达读图模式,比如1,0或-1分别表示COLOR、GRAYSCALE和UNCHANGED
OpenCV采用的格式为HWC,即高度宽度通道数,通道数顺序为BGR,与Python的Pillow库(RGB)不同。
imshow()函数有两个参数(1)第一个参数为窗口名字的字符串,(2)第二个参数为OpenCV读入图片返回的Numpy对象。waitKey(0)表示停止图片显示,执行后续语句,数字0表示按键后0毫秒执行。
imwrite()函数表示保存为新的图片,参数为保存地址和图像对象。
局部图像
import cv2 as cv
image=cv.imread("D:/picture/9.jpg")
x=image.shape[0]
y=image.shape[1]
hh=image[0:330,0:330]
cv.namedWindow("picture",cv.WINDOW_AUTOSIZE)
cv.imshow("picture",image)
cv.imshow("hh",hh)
print("x=",x)
print("y=",y)
cv.waitKey(0)
cv.destroyAllWindows()
修改后图像
import cv2 as cv
image=cv.imread("D:/picture/9.jpg")
x=image.shape[0]
y=image.shape[1]
hh=image[0:330,0:330]
image[0:33,0:30]=(255,0,255)
cv.namedWindow("picture",cv.WINDOW_AUTOSIZE)
cv.imshow("picture",image)
cv.imshow("hh",hh)
print("x=",x)
print("y=",y)
cv.waitKey(0)
cv.destroyAllWindows()
import cv2 as cv
import numpy as np
pit=np.zeros((700,600,3),dtype='uint8')
for _ in range(0,25):
radius=np.random.randint(5,200)
color=np.random.randint(0,256,size=(3,)).tolist()
pt=np.random.randint(30,200,size=(2,))
cv.circle(pit,tuple(pt),radius,color,-1)
cv.imshow('canvas',pit)
cv.waitKey(0)
pit=np.zeros((700,600,3),dtype='uint8')
调用zeros()方法,生成700*300的全零数组(3个700行600列的全零矩阵),dtype定义数据类型为uint8,(默认numpy.float64),
for _ in range(0,25):
调用range()函数,函数原型:range(start, end, scan):起始,终止,步长。从0到24.
radius=np.random.randint(5,200)
函数原型numpy.random.randint(low, high=None, size=None, dtype='l')
size表示返回数的类型(默认为none,表示返回单数值)。
color=np.random.randint(0,256,size=(3,)).tolist()
返回3个随机数,randint—产生[low,high)中的随机整数
cv.circle(pit,tuple(pt),radius,color,-1)
函数原型:circle(img, center, radius, color, thickness=None, lineType=None, shift=None)
详解:链接:https://blog.csdn.net/kun1280437633/article/details/84540849
结果:
import cv2 as cv
import numpy as np
image=cv.imread('D:/picture/5.jpg')
M=np.float32([[1,1,25],[0,1,50]])
shift_pit=cv.warpAffine(image,M,(image.shape[1],image.shape[0]))
cv.imshow('gg',shift_pit)
cv.imshow('first',image)
cv.waitKey(0)
cv.destroyAllWindows()
M=np.float32([[1,1,25],[0,1,50]])
M中的参数[1,1,25]表示向[1,1]方向移动25个像素。[0,1,50]同理,表示向下移动50像素。
shift_pit=cv.warpAffine(image,M,(image.shape[1],image.shape[0]))
image要平移的图像,M平移矩阵。image[],高度和宽度。根据平移矩阵进行仿射变换。
代码
import cv2 as cv
import numpy as np
image=cv.imread('D:/picture/5.jpg')
(h,w,_)=image.shape[:3]
center=(w/3,h/2)
M=cv.getRotationMatrix2D(center,180,2.0)
Rotated_image=cv.warpAffine(image,M,(h,w))
cv.imshow('Rotated_image',Rotated_image)
cv.imshow('first',image)
cv.waitKey(0)
cv.destroyAllWindows()
(h,w,_)=image.shape[:3]
调用shape函数返回3个元素
center=(w/3,h/2)
定义旋转中心点(像素点)
M=cv.getRotationMatrix2D(center,180,2.0)
创建旋转矩阵M,cv.getRotationMatrix2D有三个参数:第一个为旋转时固定的点;第二个为旋转角度;第三个为图片缩放尺度。
Rotated_image=cv.warpAffine(image,M,(h,w))
根据旋转矩阵进行仿射变换
缩放使用cv2.resize()函数。
import cv2 as cv
import numpy as np
image=cv.imread('D:/picture/5.jpg')
new_w,new_h=1000,200
resized_image=cv.resize(image,(new_w,new_h),interpolation=cv.INTER_AREA)
cv.imshow('resized_image',resized_image)
cv.imshow('first',image)
cv.waitKey(0)
cv.destroyAllWindows()
resized_image=cv.resize(image,(new_w,new_h),interpolation=cv.INTER_AREA)
cv.resize()函数可使用三个参数,第一个图像对象,第二个参数为缩放尺寸,第三个参数为插值选项,(关于插值选项:https://blog.csdn.net/guyuealian/article/details/85097633)使用cv.INTER_AREA插值方式,将原图image缩放为1000px*200px的新图。
简要说明一下,缩小就是删除其中某些像素,直接达到需要缩小的目标尺寸,所以存在信息丢失的现象,放大就是在图像中添加一些像素,使图像变大到目标尺寸。插值就是寻找最优删除或添加像素的放法。
对于OpenCV而言,官方建议缩小使用cv.INTER_AREA,放大使用cv.INTER_LINEAR。cv.INTER_CUBIC相对较慢。cv.resize会默认使用cv.INTER_LINEAR插值公式.
翻转分为水平翻转和垂直翻转,API为cv.flip(),第二个参数1表示水平翻转,0表示垂直翻转,-1表示水平加垂直翻转。
import cv2 as cv
import numpy as np
image=cv.imread('D:/picture/5.jpg')
second_image=cv.flip(image,0)
thrid_image=cv.flip(image,1)
four_image=cv.flip(image,-1)
cv.imshow('first_image',image)
cv.imshow('second_image',second_image)
cv.imshow('thrid_image',thrid_image)
cv.imshow('four_image',four_image)
cv.imshow('first',image)
cv.waitKey(0)
cv.destroyAllWindows()
代码
import cv2 as cv
import numpy as np
image=cv.imread('D:/picture/2.jpg')
print(image.shape)
cropped_image=image[0:1000,0:1000]
cv.imshow('cropped_image',cropped_image)
cv.waitKey(0)
cv.destroyAllWindows()
cropped_image=image[0:1000,0:1000]
裁剪坐标为[x1:x2, y1:y2],即左上角为坐标原点。
代码
import numpy as np
import cv2 as cv
rectangle=np.zeros((300,300),dtype='uint8')
cv.rectangle(rectangle,(30,30),(60,60),255,-1)
cv.imshow("Rectangle",rectangle)
circle=np.zeros((300,300),dtype='uint8')
cv.circle(circle,(45,45),19,255,-1)
cv.imshow('circle',circle)
bitwisedAnd=cv.bitwise_and(rectangle,circle)
cv.imshow("And",bitwisedAnd)
bitwisedOr=cv.bitwise_or(rectangle,circle)
cv.imshow("bitwise0r",bitwisedOr)
bitwiseXor=cv.bitwise_xor(rectangle,circle)
cv.imshow("bitwiseXor",bitwiseXor)
bitwiseNot=cv.bitwise_not(rectangle,circle)
cv.imshow('bitwiseNot',bitwiseNot)
cv.waitKey(0)
cv.destroyAllWindows()
cv.rectangle(rectangle,(30,30),(60,60),255,-1)
定义矩形,(30,30)为起始点,(60,60)为矩形对角线上的点,255为线条颜色(255,0,0),-1为填充效果,为正数时数值越大线条越粗。
cv.bitwise_xor,cv.bitwise_and,cv.bitwise_or,cv.bitwise_not
对两张图片分别做了交集(And),并集(Or),异或(Xor),对园做了一次非(Not)操作。
OpenCV 按位bitwise运算、掩膜mask运算详解 表格+图解 Python代码实例详解 基础实用款