目录
[1.1 截取部分图像数据(ROI区域)](#1.1 截取部分图像数据(ROI区域))
[1.2 边界填充](#1.2 边界填充)
[1.3 数值计算](#1.3 数值计算)
[1.4 图像融合](#1.4 图像融合)
[2.1 图像阈值](#2.1 图像阈值)
[2.2 图像平滑处理](#2.2 图像平滑处理)
[2.3 高斯滤波:](#2.3 高斯滤波:)
[2.4 中值滤波(效果比较好)](#2.4 中值滤波(效果比较好))
[2.5 trick:展示所有的图片](#2.5 trick:展示所有的图片)
第一章、视频读取与处理
读取视频
python
import cv2
vc = cv2.VideoCapture(r"G:\AI\code\biliLangChain\cv\test.mp4")
VideoCapture可以捕获摄像头,用数字可以空中不同的设备,比如0和1
视频文件直接指定位置就可以
python
# 检查是否可以打开
if vc.isOpened():
open, frame = vc.read()
else:
open = False
python
while open:
ret, frame = vc.read()
if frame is None:
break
if ret == True:
gary = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 轉化成灰度的图片,
cv2.imshow("Gary", gary)
if cv2.waitKey(10) & 0xFF == 27: # esc退出
break
vc.release()
cv2.destroyAllWindows()
1.1 截取部分图像数据(ROI区域)
python
import cv2
img = cv2.imread(r"G:\AI\code\biliLangChain\cv\mycat.jpg")
cat = img[200:600,200:800]
cv2.imshow("cat", cat)
cv2.waitKey(0)
cv2.destroyAllWindows()
python
b,g,r = cv2.split(cat)
b.shape
img = cv2.merge((b,g,r))
img.shape
# 只保留R,将其他通道置位0就可以了
cur_img = img.copy()
cur_img[:,:,0] = 0
cur_img[:,:,1] = 0
cv2.imshow("cat", cur_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
1.2 边界填充
python
import cv2
# 读取图像(确保路径正确)
img = cv2.imread('mycat.jpg')
# 边界宽度
top_size, bottom_size, left_size, right_size = (50, 50, 50, 50)
# 不同边界类型
replicate = cv2.copyMakeBorder(img,
top_size, bottom_size, left_size, right_size,
cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img,
top_size, bottom_size, left_size, right_size,
cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img,
top_size, bottom_size, left_size, right_size,
cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img,
top_size, bottom_size, left_size, right_size,
cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img,top_size, bottom_size, left_size, right_size,cv2.BORDER_CONSTANT,value=0) # 黑色填充
# 保存或显示结果(示例:显示 constant)
cv2.imshow('constant', constant)
cv2.waitKey(0)
cv2.destroyAllWindows()
python
import matplotlib.pyplot as plt
import cv2
# 假设 img / replicate / reflect / reflect101 / wrap / constant 已准备好
plt.subplot(231), plt.imshow(img, 'gray'), plt.title('ORIGINAL')
plt.subplot(232), plt.imshow(replicate,'gray'), plt.title('REPLICATE')
plt.subplot(233), plt.imshow(reflect, 'gray'), plt.title('REFLECT')
plt.subplot(234), plt.imshow(reflect101,'gray'), plt.title('REFLECT_101')
plt.subplot(235), plt.imshow(wrap, 'gray'), plt.title('WRAP')
plt.subplot(236), plt.imshow(constant,'gray'), plt.title('CONSTANT')
plt.tight_layout() # 自动调整间距
plt.show()

1.3 数值计算
python
img_cat = cv2.imread(r"G:\AI\code\LangChain\cv\mycat.jpg")
python
img_cat = img_cat + 10 # 在每个像素点上都加上10
超过255 会自动的取余数
python
img_cat + img_cat[:5,:,0]
这个函数的上限就是255
python
cv2.add(img_cat, img_cat2)[:5,:,0]
1.4 图像融合
python
img_cat = cv2.imread(r"G:\AI\code\biliLangChain\cv\mycat.jpg")
img_dog = cv2.imread(r"G:\AI\code\biliLangChain\cv\img_dog.jpg")
python
# 融合前保证图像的大小是一致的
img_cat = cv2.resize(img_cat,(500,500))
img_dog = cv2.resize(img_dog,(500,500))
img_cat.shape
python
# 图像融合
res = cv2.addWeighted(img_cat,0.8,img_dog,0.4,0) # 权重和偏置
python
plt.imshow(res)

第二章、阈值和平滑处理
2.1 图像阈值
python
ret, dst = cv2.threshold(src, thresh, maxval, type)
-
dst: 输出图
-
thresh: 阈值
-
maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值
-
type:二值化操作的类型,包含以下5种类型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV
-
cv2.THRESH_BINARY 超过阈值部分取maxval(最大值),否则取0
-
cv2.THRESH_BINARY_INV THRESH_BINARY的反转
-
cv2.THRESH_TRUNC 大于阈值部分设为阈值,否则不变
-
cv2.THRESH_TOZERO 大于阈值部分不改变,否则设为0
-
cv2.THRESH_TOZERO_INV THRESH_TOZERO的反转
python
ret, thresh1 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)
ret, thresh2 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY_INV)
ret, thresh3 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TRUNC)
ret, thresh4 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO)
ret, thresh5 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO_INV)
titles = ['Original Image', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']
images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]
for i in range(6):
plt.subplot(2, 3, i + 1), plt.imshow(images[i], 'gray')
plt.title(titles[i])
plt.xticks([]), plt.yticks([])
plt.show()

2.2 图像平滑处理
噪音点平滑处理
python
img = cv2.imread('lenaNoise.png')
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

python
# 均值滤波
# 简单的平均卷积操作
blur = cv2.blur(img, (3, 3))
cv2.imshow('blur', blur)
cv2.waitKey(0)
cv2.destroyAllWindows()

python
# 方框滤波
# 基本和均值一样,可以选择归一化,容易越界
box = cv2.boxFilter(img,-1,(3,3), normalize=True)
cv2.imshow('box', box)
cv2.waitKey(0)
cv2.destroyAllWindows()

方框滤波如果做了归一化,那么和均值滤波是一样的。如果发生越界,那么就把这个值变成255。

2.3 高斯滤波:
就是更重视中间的值,然后其余的值按照重视程度,分配不同的权重系数,然后再相乘。
python
# 高斯滤波
# 高斯模糊的卷积核里的数值是满足高斯分布,相当于更重视中间的
aussian = cv2.GaussianBlur(img, (5, 5), 1)
cv2.imshow('aussian', aussian)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.4 中值滤波(效果比较好)
python
# 中值滤波
# 相当于用中值代替
median = cv2.medianBlur(img, 5) # 中值滤波
cv2.imshow('median', median)
cv2.waitKey(0)
cv2.destroyAllWindows()
拿九宫格中的中间值当成卷积中心的结果


2.5 trick:展示所有的图片
python
np.hstack
python
# 展示所有的
res = np.hstack((blur,aussian,median))
#print (res)
cv2.imshow('median vs average', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
第三章、图像形态学操作
3.1.腐蚀操作(二值)去毛刺(cv2.erode)
原理:就是拿着卷积核一点点平移计算,如果有黑的和白的,那么就把白的腐蚀掉(变成黑色的)。
python
img = cv2.imread('dige.png')
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

腐蚀操作
python
kernel = np.ones((3,3),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 1)
cv2.imshow('erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()

python
pie = cv2.imread('pie.png')
cv2.imshow('pie', pie)
cv2.waitKey(0)
cv2.destroyAllWindows()

使用不同的kernel来显示
python
kernel = np.ones((30,30),np.uint8)
erosion_1 = cv2.erode(pie,kernel,iterations = 1)
erosion_2 = cv2.erode(pie,kernel,iterations = 2)
erosion_3 = cv2.erode(pie,kernel,iterations = 3)
res = np.hstack((erosion_1,erosion_2,erosion_3))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
3.2.膨胀操作(cv2.dilate)
和腐蚀互为逆的运算。 腐蚀操作对图像造成了损害,所以需要膨胀操作将其补全。
python
img = cv2.imread('dige.png')
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

python
kernel = np.ones((3,3),np.uint8)
dige_erosion = cv2.erode(img,kernel,iterations = 1)
cv2.imshow('erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()

python
kernel = np.ones((3,3),np.uint8)
dige_dilate = cv2.dilate(dige_erosion,kernel,iterations = 1)
cv2.imshow('dilate', dige_dilate)
cv2.waitKey(0)
cv2.destroyAllWindows()

python
pie = cv2.imread('pie.png')
kernel = np.ones((30,30),np.uint8)
dilate_1 = cv2.dilate(pie,kernel,iterations = 1)
dilate_2 = cv2.dilate(pie,kernel,iterations = 2)
dilate_3 = cv2.dilate(pie,kernel,iterations = 3)
res = np.hstack((dilate_1,dilate_2,dilate_3))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.开运算和闭运算
python
# 开:先腐蚀,再膨胀
img = cv2.imread('dige.png')
kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
cv2.imshow('opening', opening)
cv2.waitKey(0)
cv2.destroyAllWindows()

python
# 闭:先膨胀,再腐蚀
img = cv2.imread('dige.png')
kernel = np.ones((5,5),np.uint8)
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
cv2.imshow('closing', closing)
cv2.waitKey(0)
cv2.destroyAllWindows()
