OPENCV基础操作
提示:本专栏所用版本仅供参考,其他版本也可
库 | 版本 |
---|---|
python | Python 3.9.3 |
opencv | 4.5.5 |
matplotlib | 3.4.3 |
numpy | 1.19.5 |
(一)阀值处理
1:相关函数
相关函数内容 | |
函数原型 | 参数 |
---|---|
单一阀值处理 cv2.threshold (src,thresh,maxval,type) | src:输入图像 |
thresh:阀值 | |
maxVal: THRESH_BINARY/_INV 需要设定的最大值 | |
type: 分割类型 | |
自适应阀值处理 adaptiveThreshold (src,maxValue,adaptMethod,Type,blockSize,C) | src:输入图像 |
maxValue:最大值 | |
adaptMethod:自适应方法 | |
Type:处理方式 | |
blockSize:块大小: 表一个像素在计算阀值时所使用的的领域尺寸 (如3,5,7) | |
C:常量 | |
返回值:rst,dst | 阀值和分割图像 |
2:相关方法
代码:
import matplotlib.pyplot as plt #导入模块
import cv2
import numpy as np
filename = '111.jpg'#保存图片路径
img = cv2.imread(filename,0)#以灰度的形式读取图片111
C = np.zeros((img.shape[0],img.shape[1],3,6),np.uint8)
ret,C[:,:,0,0] = cv2.threshold(img,127,255,cv2.THRESH_BINARY)#二值化阀值处理
ret,C[:,:,0,1] = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)#反二值阀值化处理
ret,C[:,:,0,2] = cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)#超阀值化处理
ret,C[:,:,0,3] = cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)#超阀值化处理
ret,C[:,:,0,4] = cv2.threshold(img,127,255,cv2.THRESH_TOZERO)#低阀值化处理
ret,C[:,:,0,5] = cv2.threshold(img,0,255,cv2.THRESH_TOZERO+cv2.THRESH_OTSU)#Otsu方法:低阀值化处理
for i in range(6):
plt.subplot(2,3,i+1)#将画布分为两行四列,当前图像显示到第i+1个区块
plt.imshow(C[:,:,0,i],cmap='gray')#把图像加载到plt画布中
plt.title(i)#设置当前图像标题
plt.show()
运行结果:(预览模式下不可见面)
3:扩展
扩展
上述程序所用:Otus方法
>>>>>作用:根据图像给出最佳的分割阀值(遍历所有可能阀值)
(二)图像平滑处理
内容:在尽量保持图像信息的情况下,过滤掉图像内部的噪声
原理:处理图像中与周围像素值差值较大的的像素点,将其调整为与周围像素点像素值近似的点
学习任务:
1:认识几种常见的滤波方式:
2:了解滤波的原理
3:了解卷积算法
1:{均值、方框、双边、中值、高斯 }滤波
程序合集:
import cv2
import numpy as np
import matplotlib.pyplot as plt
#1:获取灰度图像
filename = 'aa.png'#保存图片路径
img = cv2.imread(filename)#以灰度的形式读取图片111
C = np.zeros((img.shape[0],img.shape[1],3,6),np.uint8)
C[:,:,:,0] = img
#均值滤波:参数(原始图像,卷积核)
C[:,:,:,1] = cv2.blur(img,(5,5))
#方框滤波:参数(原始图像,图像深度,卷积核,是否归一化处理)
C[:,:,:,2] = cv2.boxFilter(img,-1,(5,5),normalize=1)
#高斯滤波:参数(原始图像,滤波核,卷积核在X方向的标准差,卷积核在Y方向的标准差)
C[:,:,:,3] = cv2.GaussianBlur(img,(5,5),0,0)
#中值滤波:参数(原始图像,滤波核(必须是大于1的奇数))
C[:,:,:,4] = cv2.medianBlur(img,3)
#双边滤波:参数(原始图像,滤波选取的空间距离参数
# 滤波时选取的颜色差值范围:决定了哪些范围的颜色可参与
# 坐标空间中的sigma值,值越大说明有越多点参与滤波进来)
C[:,:,:,5] = cv2.bilateralFilter(img,25,100,100)
T = ("img","blur","boxFilter","GaussianBlur","medianBlur","bilateralFilter")
for i in range(6):
plt.subplot(2,3,i+1)#将画布分为两行四列,当前图像显示到第i+1个区块
plt.imshow(C[:,:,:,i],cmap='gray')#把图像加载到plt画布中
plt.title(T[i])#设置当前图像标题
plt.show()
运行结果:
2:2D卷积
内容: 用特定的卷积核实现卷积操作的一种自定义卷积
函数:
dst = cv2.filter2D(src,ddepth,kernel,anchor,delta,borderType)
参数组成:
原始图像,图像深度,单一通道的卷积核
anchor:锚点:默认-1
delta:修正值:加上该值作为最终值
borderType:边界样式(决定了以何种情况处理边界)
运行程序:
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 1:读取图片
filename = '111.jpg'#保存图片路径
img = cv2.imread(filename)#以灰度的形式读取图片111
C = np.zeros((img.shape[0],img.shape[1],3,2),np.uint8)
C[:,:,:,0] = img
# 2:自定义一个卷积核
D = np.ones((9,9),np.float32)/54
# 3:卷积操作
C[:,:,:,1] = cv2.filter2D(img,-1,D)
T = ("img","filter2D")
for i in range(2):
plt.subplot(1,2,i+1)#将画布分为两行四列,当前图像显示到第i+1个区块
plt.imshow(C[:,:,:,i],cmap='gray')#把图像加载到plt画布中
plt.title(T[i])#设置当前图像标题
plt.show()
运行结果:
(五)结束语
以上就是今天所要分享的内容了
学习路漫漫,我们仍需负重前行……
为此博主新创建了一个群,期待你们的加入:
欢迎加入我们的大家庭:928357277