一 图像基本
1 调入模块
import cv2
import matplotlib.pyplot as plt
import numpy as np
2 读入图像
图片=cv2.imread(“a01.jpg”) 灰度图片=cv2.imread(“a01.jpg”, cv2.IMREAD_GRAYSCALE)
3 打印图像数据
print(“图片”,图片)
3.1查看图片信息 (宽\高和通道)
print(图片.shape,图片.size)
4 显示图片/视频 列表显示
-
cv2.imshow("",图片) -
cv2.imshow(“影片”,cv2.cvtColor(cv2.read(影片)[1])) 打开,帧=影片.read()
cv2.imshow("影片",帧)
4.1 列表显示 ①
展示=np.hstack((图片,图片2)) # 同通道 同尺寸 cv2.imshow(“zhanshi”,展示))
4.2 列表显示 ②
import cv2
import numpy as np
图片=cv2.imread("a01.jpg")
复制边缘=cv2.copyMakeBorder(图片,100,100,200,200,cv2.BORDER_REPLICATE)
top,bottom,left,right=(100,100,200,200)
反射边缘=cv2.copyMakeBorder(图片,top,bottom,left,right,cv2.BORDER_REFLECT)
反射边缘_101=cv2.copyMakeBorder(图片,top,bottom,left,right,cv2.BORDER_REFLECT_101)
常量边缘=cv2.copyMakeBorder(图片,top,bottom,left,right,cv2.BORDER_CONSTANT,value=0)
展示=np.hstack((复制边缘,反射边缘,反射边缘_101,常量边缘))
cv2.imshow("4in1",展示)
cv2.waitKey(0)
import matplotlib.pyplot as plt
b,r,g=cv2.split(图片)
b,r,g=cv2.split(反射边缘)
b,r,g=cv2.split(复制边缘)
图片_rgb=cv2.merge([g,r,b])
复制边缘_rgb=cv2.merge([g,r,b])
反射边缘_rgb=cv2.merge([g,r,b])
plt.subplot(231),plt.imshow(图片_rgb,"gray"),plt.title("ORIGINAL")
plt.subplot(232),plt.imshow(复制边缘_rgb,"gray"),plt.title("REOLICATE")
plt.subplot(233),plt.imshow(反射边缘_rgb,"gray"),plt.title("REOLICATE101")
plt.show()
4.4 停止 显示 等待时间 毫秒 ,0表示 任意键停止
-cv2.waitKey(100)
4.5 停止 视频
- cv2.waitKey(25)&0xFF==27: # 键盘ESC(27)退出, 否则等待25毫秒
5 关闭所有窗口
cv2.destroyAllWindows()
6 复制图片
图片2=图片.copy()
6.1 颜色空间转换
#彩色图像转为灰度图像 img2 = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY) 灰度图像转为彩色图像 img3 = cv2.cvtColor(img,cv2.COLOR_GRAY2RGB
6.2 用颜色通道 转换 bgr rgb
# 提取颜色通道
b,g,r=cv2.split(图片)
图片通道合成rgb=cv2.merge(r,g,b)
7 保存图像
cv2.imwrite(“z图像保存.jpg”,img1)
8 图像大小 图像类型
print(img1.size,img1.dtype)
8.1改变 图像大小
图片2=cv2.resize(图片,(500,50)) 图片3=cv2.resize(图片,(0,0),fx=倍数,fy=倍数) 图片3=cv2.resize(图片,(int(图片.shape[0]*0.5),int(图片.shape[1]*0.5))) # 好像必须是整数
8.2 截取部分图像
根据对图像的坐标设定
截图=img1[:500,:800]
8.3 边缘 调整
import cv2
图片=cv2.imread("a01.jpg")
cv2.imshow("img",图片)
cv2.waitKey(1000)
print(图片.shape)
top,bottom,left,right=(100,100,200,200)
复制边缘=cv2.copyMakeBorder(图片,top,bottom,left,right,cv2.BORDER_REPLICATE)
反射边缘=cv2.copyMakeBorder(图片,top,bottom,left,right,cv2.BORDER_REFLECT)
反射边缘_101=cv2.copyMakeBorder(图片,top,bottom,left,right,cv2.BORDER_REFLECT_101)
常量边缘=cv2.copyMakeBorder(图片,top,bottom,left,right,cv2.BORDER_CONSTANT,value=0)
import matplotlib.pyplot as plt
b,r,g=cv2.split(图片)
b,r,g=cv2.split(反射边缘)
b,r,g=cv2.split(复制边缘)
图片_rgb=cv2.merge([g,r,b])
复制边缘_rgb=cv2.merge([g,r,b])
反射边缘_rgb=cv2.merge([g,r,b])
plt.subplot(231),plt.imshow(图片_rgb,"gray"),plt.title("ORIGINAL")
plt.subplot(232),plt.imshow(复制边缘_rgb,"gray"),plt.title("REOLICATE")
plt.subplot(233),plt.imshow(反射边缘_rgb,"gray"),plt.title("REOLICATE101")
plt.show()
9 翻转图像
使用函数cv2.flip(img,flipcode)翻转图像,flipcode控制翻转效果。 flipcode = 0:沿x轴翻转 flipcode > 0:沿y轴翻转 flipcode < 0:x,y轴同时翻转
翻转的图片= cv2.flip(原始图片,1)
10 颜色通道提取
b,g,r=cv2.split(图片) print(“通道b”,b,b.shape)
11 用颜色通道 合成 rgb 改 bgr 为 rgb
图片通道合成rgb=cv2.merge(r,g,b)
只保留R
img[:,:,0]=0 img[:,:,1]=0 cv2.imshow(“红色”,img) cv2.waitKey(100)
只保留B
img2=cv2.imread(“a01.jpg”) img2[:,:,1]=0 img2[:,:,2]=0 cv2.imshow(“B”,img2)
12 写字 画画
由于 cv2 不支持中文, 遇到中文的时候还是要用 PIL的, 两种方案的打开方式和 展现方式都不一样的
12.1 cv2 只能英文字体
12.2 PIL 中文字体
import cv2
import numpy as np
画布=np.ones((600,400,3),dtype="uint8")*88
线=cv2.line(画布,(0,0),(390,390),(125,20,0),5)
矩形=cv2.rectangle(画布,(100,300),(300,500),(0,125,20),5)
矩形_实心=cv2.rectangle(画布,(200,420),(250,320),(255,125,20),-1)
圆形=cv2.circle(画布,(200,200),150,(20,20,200),6)
椭圆形=cv2.ellipse(画布,(200,200),(50,20),20,10,300,(20,20,200),-1)
"""======================== 写字==========================================="""
英文文字=cv2.putText(画布,"English",(30,550),cv2.FONT_HERSHEY_DUPLEX,5,(125,0,200),5)
cv2.imwrite("z600.jpg",画布)
from PIL import Image,ImageDraw,ImageFont
画布2=Image.open("z600.jpg")
画笔=ImageDraw.Draw(画布2)
字体=ImageFont.truetype("C:\WINDOWS\FONTS\STHUPO.TTF",44)
画笔.text((30,10),"中文字体",fill="red",font=字体)
画布2.show()
cv2.imshow("English",画布)
cv2.waitKey(0)
二 图像 复杂
3 图片计算"""
#–coding:utf-8– import cv2 # 读入图片 import numpy as np
img1=cv2.imread(“a01.jpg”) img2=cv2.imread(“a03.jpg”)
print(img1[:5,:,0])
各个数值 +10 颜色更黑
img1_new=img1+10 print(img1_new[:5,:,0])
调整成 统一尺寸
print((img1.shape),(img2.shape)) img2_new=cv2.resize(img2,(1023, 683)) #resize(img.(x,y),fx=倍数,fy=倍数)
两个图相加
img_sum=(img1+img2_new)[5:,:,0]
图片数字融合
#img_sum1=(img1,权重,img2,权重,提亮倍数)
print((img1.shape),(img2_new.shape))
import matplotlib.pyplot as plt ### 编号 展示 名字 plt.subplot(131),plt.imshow(img1),plt.title(“img1”) plt.subplot(132),plt.imshow(img1_new),plt.title(“img1_new”) plt.subplot(133),plt.imshow(img_sum),plt.title(“img_num”) plt.show()
4 列表展示
展示=np.hstack((img1,img1_new)) # print(展示) cv2.imshow(“SHOW”,展示) cv2.waitKey(0)
三 形态学 腐蚀和膨胀
腐蚀 膨胀
开运算 先腐蚀后膨胀 去刺
闭运算
顶帽和黑帽 (闭运算- 原始)
import cv2
import numpy as np
img=cv2.imread("a05.png")
盒子=np.ones((3,3))
img_erode=cv2.erode(img,盒子,iterations=3)
img_dilate=cv2.dilate(img_erode,盒子,iterations=3)
img_梯形=cv2.morphologyEx(img,cv2.MORPH_GRADIENT,盒子)
img_open=cv2.morphologyEx(img,cv2.MORPH_OPEN,盒子)
img_closs=cv2.morphologyEx(img,cv2.MORPH_CLOSE,盒子)
img_礼帽=cv2.morphologyEx(img,cv2.MORPH_TOPHAT,盒子)
img_黑帽=cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,盒子)
展示=np.hstack((img,img_open,img_closs))
cv2.imshow("zhanshi",展示)
cv2.waitKey(0)
cv2.destroyAllWindows()
四 视频
思路
VideoCapture读入影片 → ISOpend 判断是否能打开,并未下一步循环 准备 “打开” 显示 每一帧, weitKey 25毫秒, 或者ESC退出
和图片区别
打开 图片=vc2.imread("图片.jpg")
影片=VC2.cvtColor(影片.read()[1])
import cv2
import numpy as np
影片 = cv2.VideoCapture("v02 卡点.mp4")
if 影片.isOpened():
打开,帧=影片.read()
else:打开=False
while 打开:
打开,帧=影片.read()
if 帧 is None:
break
if 打开 is True:
cv2.imshow("gray",帧)
if cv2.waitKey(25)&0xFF==27:
break
影片.release()
cv2.destroyAllWindows()
|