opencv

  • 1 2 3 4
  • 6 7 8 10
  • 12 13 18 19

1.图像生成

1
2
3
4
5
6
7
8
9
10
import cv2
import numpy as np
img = np.zeros((240,320,3),dtype=np.uint8)
img[0:120,0:160,2] = 255 #左上
img[0:120,160:320,0] = 255 #右上
img[120:240,0:160,1] = 255 #左下
img[120:240,160:320] = 255 #右下
cv2.imshow("blue",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.像素遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#像素遍历
import cv2
import numpy as np
img = cv2.imread("task2.png")

#切片
img[:,1::2]= [0,0,0]
img[:,0::2]= [255,255,255]

#遍历
for x in img:
for i in range(1,img.shape[1],2):
img[:,i] = [0,0,0]
for x in img:
for i in range(0,img.shape[1],2):
img[:,i] = [255,255,255]

cv2.imshow("blue",img)
r = cv2.imwrite("task2.png",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.画图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#蓝色直线
for i in range(0,320):
img[60:63,i] = [255,0,0]
#红色圆
img = np.full((240, 320, 3), 255, dtype=np.uint8)

# 定义圆心和半径
center_x = 160
center_y = 120
r = 70

# 遍历以圆心为中心的周围区域
for dx in range(-r, r + 1):
for dy in range(-r, r + 1):
x = center_x + dx
y = center_y + dy
# 检查坐标是否在图像范围内
if 0 <= x < img.shape[1] and 0 <= y < img.shape[0]:
# 判断是否在圆内(距离平方 <= 半径平方)
if dx**2 + dy**2 <= r**2:
img[y, x] = [0, 0, 255] # BGR格式(红色)

#绿色椭圆
if dx**2 + 3*dy**2 <= r**2:(其余同圆)

image-20250404142658741

1.正常情况

image-20250404142822398

part1:读取 保存 关闭

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import cv2

# 读取图片(按原格式加载,包括 Alpha 通道)
path = r"D:\nao\man.png" #r 表示将\解释成路径
photo = cv2.imread(path, -1) # -1 表示 cv2.IMREAD_UNCHANGED

# 检查是否读取成功
if photo is None:
print("错误:图片路径无效!")
else:
cv2.imshow("photo", photo) #显示图片
cv2.waitKey(1000) # 按任意键之后,该语句会被执行
cv2.destroyAllWindows()

r = cv2.imwrite("test_other.png",photo)
if r:
print("I have save the photo")
else:
print("sorry I can't do that")

part2:图像表示

a.二值表示

b.灰度表示

1
2
3
4
5
6
7
8
9
import cv2
import numpy as np
img = np.zeros((1000,1000),dtype = np.uint8)
for i in range(10,100):
for j in range(10,100):
img[i,j] = 255
cv2.imshow("second",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
1
#引入img.item() 和 img.itemset()方法

c.彩色图像(RGB)

1.感兴趣区域(ROI)

1
2
3
4
5
6
7
8
9
10
11
import cv2
import numpy as np
img = np.random.randint(0,256,size = [800,800,3],dtype = np.uint8)
img[:,:] = 0
roi = img[200:400,200:400]
img1 = np.random.randint(0,256,size = [800,800,3],dtype = np.uint8)
img1[:,:] = 255
img1[200:400,200:400] = roi
cv2.imshow("demo",img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.通道操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import cv2
import numpy as np
path = r"D:\nao\man.png"
img = cv2.imread(path,-1)

#索引拆分
b = img[:,:,0]
g = img[:,:,1]
r = img[:,:,2]

cv2.imshow("b",b)
cv2.imshow("g",g)
cv2.imshow("r",r)

#函数拆分
b,g,r = cv2.split(img)
b1 = cv2.split(img)[0]

print("b = \n",b)
cv2.waitKey(0)
cv2.destroyAllWindows()

#合并
import cv2
import numpy as np
path = r"D:\nao\man.png"
img = cv2.imread(path)

img1 = np.zeros((1000,1000),dtype = np.uint8)
#函数拆分
b,g,r = cv2.split(img)

#合并
rgb = cv2.merge([r,g,b])

print("b = \n",b)

#参数
print("img.shape = \n",img.shape)
print("img1.shape = \n",img1.shape)
print("img.size = \n",img.size)
print("img.dtype = \n",img.dtype)
cv2.imshow("rgb",rgb)
cv2.waitKey(0)
cv2.destroyAllWindows()

part3:运算

1.加法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import cv2
import numpy as np

img1 = np.random.randint(0,256,size = [3,3],dtype = np.uint8)
img2 = img1

#两种加法,取余和不取余
print("img1 = \n",img1)
print("img1 + img2 = \n",img1 + img2)
print("img1 + img2 = \n",cv2.add(img1 , img2))

#混合加权
img3 = cv2.imread("picture.png")
res = cv2.addWeighted(img3,0.6,img3,0.4,3)
cv2.imshow("result",res)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.位运算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#掩模
a = cv2.imread("picture.png")
b = np.zeros(a.shape,dtype = np.uint8)
b[100:500,100:400] = 255
c = cv2.bitwise_and(a,b) #
cv2.imshow("c",c)

# 加载两张彩色图像
img1 = cv2.imread("picture.png")
img2 = cv2.imread("circle.jpg")

# 创建一个圆形掩模(中心(100,100),半径50)
mask = np.zeros(img1.shape[:2], dtype=np.uint8) # 单通道
cv2.circle(mask, (100, 100), 50, 255, -1) # 白色圆形区域(255)

# 仅在掩模区域内执行按位或
result_masked = cv2.bitwise_or(img1, img2, mask=mask) #

# 显示结果
cv2.imshow("Masked OR", result_masked)
cv2.waitKey(0)
cv2.destroyAllWindows()

#图像与数值加法

3.位平面和阈值处理

1
2
3
4
5
6
7
8
9
10
11
12
13
img = cv2.imread("circle.png",cv2.IMREAD_GRAYSCALE)
r,c = img.shape
x = np.zeros((r,c,8),dtype = np.uint8)
for i in range(8):
x[:,:,i] = 1 << i
y = np.zeros((r,c,8),dtype = np.uint8)
for i in range(8):
y[:,:,i] = cv2.bitwise_and(img,x[:,:,i])
mask = r[:,:,i] > 0
r[mask] = 255
cv2.imshow(str(i),r[:,:,i])
cv2.waitKey(0)
cv2.destroyAllWindows()

4.图像加密和解密(异或)

* 密钥
* 明文
* 加密 解密

5.水印(对最低有效位进行处理)

part4:色彩空间

1.HSV色彩空间

H:色调(0,360) -> (0,180)

S:饱和度(0,1)

V:亮度(0,1)

2.取特定的颜色

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import cv2
import numpy as np


imgBlue = np.zeros([1,1,3],dtype = np.uint8)
imgBlue[0,0,0] = 255
Blue = imgBlue
BlueHSV = cv2.cvtColor(Blue,cv2.COLOR_BGR2HSV) #颜色转换
print("blue = \n",Blue)
print("blueHSV = \n",BlueHSV)

imgBlue1 = cv2.inRange(imgBlue,5,7)

#对感兴趣区域设置掩模
img = np.ones([5,5],dtype = np.uint8) * 9
mask = np.zeros([5,5],dtype = np.uint8)
mask[0:3,0] = 1
mask[2:5,2:4] = 1
roi = cv2.bitwise_and(img,img,mask = mask)
print("roi = \n",roi)

#显示特定颜色
img = cv2.imread("picture.png")
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

min = np.array([110,50,50])
max = np.array([130,255,255])
mask = cv2.inRange(hsv,min,max)
img1 = cv2.bitwise_and(img,img,mask = mask)
cv2.imshow("ok",img1)
#阈值处理

#取皮肤
img = cv2.imread("me.jpg")
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
h,s,v = cv2.split(hsv)
h_mask = cv2.inRange(h,10,170)
s_mask = cv2.inRange(s,60,166)
new_mask = h_mask & s_mask
roi = cv2.bitwise_and(img,img,mask = new_mask)
cv2.imshow("me",roi)
cv2.waitKey(0)
cv2.destroyAllWindows()

#alpha通道 新增透明度

part5:阈值处理

1.(反)二值化阈值

1
2
3
4
5
6
img = cv2.imread("me.jpg")
t,rst = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
cv2.imwrite("cool_me.jpg",rst)
cv2.imshow("img",rst)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.截断阈值化处理

3.超(低)阈值零处理

4.自适应阈值处理(加权中心化)

5.OTSU处理(自动计算阈值)

1
2
3
4
5
6
img = cv2.imread("me.jpg", cv2.IMREAD_GRAYSCALE)#只对灰度图处理
t,rst = cv2.threshold(img,0,255,cv2.THRESH_BINARY + cv2.THRESH_OTSU)
cv2.imwrite("OK.jpg",rst)
cv2.imshow("img",rst)
cv2.waitKey(0)
cv2.destroyAllWindows()

part6:滤波

1.均值滤波(周围空间的平均值)

1
2
3
4
5
img = cv2.imread("test1.jpg")
dst = cv2.blur(img,(30,30))
cv2.imshow("img",dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.方框滤波(卷积核为平均或1)

1
dst = cv2.boxFilter(img,-1,(2,2),normalize=0)

3.高斯滤波(卷积核的中间更大)

1
dst = cv2.GaussianBlur(img,(5,5),0,0)

4.中值滤波(取周围区域中的中间值)

1
dst = cv2.GaussianBlur(img,(5,5),0,0)

5.双边滤波(颜色差异过大的不考虑)

1
dst = cv2.bilateralFilter(img,25,160,160)

6.自定义卷积核

1
2
kernel = np.ones((9,9),np.float32)/81
dst = cv2.filter2D(img,-1,kernel)

part7:形态学操作

1.腐蚀(缩小)

1
2
kernel = np.ones((10,10),np.uint8)
ero = cv2.erode(img2,kernel,iterations = 5)

2.膨胀

1
dilation = cv2.dilate(img,kernel,iteration = 9)

3.开运算(先腐蚀后膨胀)

1
2
kernel = np.ones((20,20),np.uint8)
ero = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)

4.闭运算(先膨胀后腐蚀)

1
2
kernel = np.ones((20,20),np.uint8)
ero = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)

5.形态学梯度运算(保留边界)

1
2
kernel = np.ones((20,20),np.uint8)
ero = cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)

6.礼帽运算(原图 - 开运算)

1
2
kernel = np.ones((20,20),np.uint8)
ero = cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)

7.黑帽运算(闭运算 - 原图)

1
2
kernel = np.ones((20,20),np.uint8)
ero = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)

8.核函数

1
2
3
kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT,(59,59)) #矩形
kernel1 = cv2.getStructuringElement(cv2.MORPH_CROSS,(59,59)) #十字架
kernel1 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(59,59)) #椭圆

part8:Canny边缘检测

  • 去噪
  • 计算梯度
  • 非极大值抑制
  • 应用双阈值确定边缘
1
r1 = cv2.Canny(img,32,100)

part9:图像轮廓

1.查找并绘制轮廓

  • 灰度二值图 -> 进行阈值分割
  • 对象是白色的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
img = cv2.imread("test1.jpg")
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,bi = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)

contours,hierarchy = contours, hierarchy = cv2.findContours(
bi, # 输入的二值图像(黑白图)
cv2.RETR_EXTERNAL, # 轮廓检索模式
cv2.CHAIN_APPROX_SIMPLE # 轮廓近似方法
)
o = cv2.drawContours(img,contours,-1,(0,0,255),2)

cv2.imshow("img",o)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.矩特征

1
2
3
4
cv2.moments(contours[i]) #矩特征
cv2.moments(contours[i]["m00"]) #面积
cv2.contourArea(contours[i]) #面积
cv2.arcLenth(curve,closed) #轮廓和是否闭合

part10:视频处理