Opencv总结1——视频读取与处理,图像阈值和平滑处理,图像形态学操作

目录

第一章、视频读取与处理

[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:展示所有的图片)

第三章、图像形态学操作

3.1.腐蚀操作(二值)去毛刺(cv2.erode)

3.2.膨胀操作(cv2.dilate)

3.开运算和闭运算


第一章、视频读取与处理

读取视频

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()
相关推荐
艾醒(AiXing-w)2 小时前
大模型原理剖析——拆解预训练、微调、奖励建模与强化学习四阶段(以ChatGPT构建流程为例)
人工智能·chatgpt
币圈菜头2 小时前
GAEA Carbon-Silicon Symbiotism NFT 解析:它在系统中扮演的角色,以及与空投权重的关系
人工智能·web3·去中心化·区块链
Deepoch2 小时前
从“飞行相机”到“空中智能体”:无人机如何重构行业生产力
人工智能·科技·机器人·无人机·开发板·具身模型·deepoc
OAK中国_官方2 小时前
OAK HUB:您通往视觉AI的门户!
人工智能·计算机视觉·depthai
鲨莎分不晴2 小时前
独立学习 (IQL):大道至简还是掩耳盗铃
人工智能·深度学习·学习
audyxiao0012 小时前
如何用Gemini“上车”自动驾驶?通过视觉问答完成自动驾驶任务
人工智能·机器学习·自动驾驶·大语言模型·多模态·gemini
free-elcmacom2 小时前
深度学习<2>从“看单帧”到“懂故事”:视频模型的帧链推理,藏着机器读懂时间的秘密
人工智能·python·深度学习·音视频
wxdlfkj2 小时前
从算法溯源到硬件极限:解决微小球面小角度拟合与中心定位的技术路径
人工智能·算法·机器学习
高洁012 小时前
基于Tensorflow库的RNN模型预测实战
人工智能·python·算法·机器学习·django