画图 opencv
import numpy as np
import cv2
import matplotlib.pyplot as plt
# 显示图片的函数
def show(image):
plt.imshow(image)
plt.axis('off')
plt.show()
1. 画线
g = (0,255,0)
cv2.line(image,(0,0),(300,300),g,5)
# (0,0)开始的点,(300,300)结束位置,g-颜色 5 是线的粗细
show(image)
2.画矩形
cv2.rectangle(image,(10,10),(60,60),(255,0,0),2)
# (10,10) 左上角的点,(60,60)右下角的点
show(image)
cv2.rectangle(image,(10,10),(60,60),(255,0,0),-1)
show(image)
# 这样的话,矩形全部填充了
3.画圆
法1.
image = np.zeros((300,300,3),dtype='uint8')
(cX,cY) = image.shape[1]//2,image.shape[0]//2 # shape[0]高,并且确定圆心
white = (255,255,255)
for r in range(0,151,15):
cv2.circle(image,(cX,cY),r,white,2)
# image在画图的地方,(cX cY)-圆心未知,r--半径,2--粗细
show(image)
法2.
image = np.zeros((300,300,3),dtype='uint8')
for i in range(10):
# 半径取值
r = np.random.randint(5,200)
# 颜色取值
color = np.random.randint(0,255,size=(3)).tolist()# 需要传列表
# 取圆心
pt = np.random.randint(0,300,size=(2))
# 画图
cv2.circle(image,tuple(pt),r,color, -1)
show(image)
一些包
def show(image):
plt.imshow(image)
plt.axis('off')
plt.show()
def imread(image):
image = cv2.imread(image) # cv2.imread(路径,标志)方法从指定的文件加载图像
image = cv2.cvtColor(image,cv2.COLOR_BGR2RGB) # cv2.COLOR_BGR2RGB 将BGR格式转换成RGB格式
return image
图像翻转
# 水平翻转
image = imread('./test.jpg')
image = cv2.flip(image,1) # 1 水平,0垂直,-1# 水平+垂直翻转
show(image)
图像裁剪
# 图片裁剪,把他看成矩阵然后输入矩阵位置
image = imread('./test.jpg')
image = image[0:200,0:200]
show(image)
图像算术
# 图像加法,不会超出255
print(cv2.add(np.uint8([200]),np.uint8([200])))# uint8-->8位无符号整数 (0~255)
# 普通加法
print(np.uint8([200])+np.uint8([100])) # 到255后 255+1 = 0 剩下的继续加
[[255]]
[44]
# 图像减法
print(cv2.subtract(np.uint8([50]),np.uint8([100])))
# 普通减法
print(np.uint8([50])-np.uint8([100]))
[[0]]
[206]
image = imread('./test.jpg')
#
M = np.ones(image.shape,dtype='uint8')*100
# 所有像素加100,image.shape(400,300,3)-->长,宽,3输入口
image = cv2.add(image, M)
show(image)
安位运算
# 生产一个正方形
rectangle = np.zeros((300,300,3), dtype='uint8')
white = (255,255,255)
cv2.rectangle(rectangle,(25,25),(275,275),white,-1)
show(rectangle)
# 生产一个圆
circle = np.zeros((300,300,3),dtype='uint8')
cv2.circle(circle,(150,150),150,white,-1)
show(circle)
and 与操作
# and, 与操作,有黑色就变黑 与操作,有0的就变0
image1 = cv2.bitwise_and(rectangle,circle)
show(image1)
or 或操作
# or 或操作,有白就变白 有1 变1
image1 = cv2.bitwise_or(rectangle,circle)
show(image1)
XOR,异或操作
# XOR,异或操作,黑变白,嘿嘿和白白变黑
image1 = cv2.bitwise_xor(rectangle,circle)
show(image1)
not,取反
# not,非操作,颜色取反
image = cv2.bitwise_not(circle)
show(image)
图像金字塔
意义:同一图像,不同分辨率的子图集合,最大的图片放最下面
高斯金字塔
cv2.pyrDown()
cv2.pyrup()
拉普拉斯金字塔
cv2.pyrDown()
cv2.pyrup()
# 首先导入图片
image = imread('image.jpg')
show(image)
image.shape
------------------------------
<--这是图片片->
(424, 600, 3)
# cv2.pyrDown() 降低分辨率
for i in range(4):
image = cv2.pyrDown(image)
print(image.shape)
show(image)
---------------------
每次降低降低一半
(212, 300, 3)
(106, 150, 3)
(53, 75, 3)
(27, 38, 3)
# cv2.pryUp()提高分辨率
for i in range(4):
image = cv2.pyrUp(image)
print(image.shape)
show(image)
拉普拉斯算法
总结:下降1次为A,升一次为B
A-B
# 拉普拉斯金字塔
image = imread('./image.jpg')
down1 = cv2.pyrDown(image)
down2 = cv2.pyrDown(down1)
up_image = cv2.pyrUp(down2)
laplacian = down1 - up_image
# show(laplacian)
# show(up_image)