图像控制
读取图像
cv.imread()
(function) def imread(
filename: str, // 文件路径(注意不要包含中文)
flags: int = 1 | 0 | -1 // 彩色(不含alpha通道) | 灰度 | 彩色
) -> MatLike
显示图像
cv.imshow()
:会自动创建窗口并在其中显示图像
(function) def imshow(
winname: str, // 窗口名称
mat: MatLike //读取的图片链接
) -> None
保存图像
cv.imwrite()
:图像保存在工作目录
(function) def imwrite(
filename: str, // 保存后的图像命名
img: MatLike, // 要保存图像
params: Sequence[int] = ...
) -> bool
图像属性
img.shape
:获取图片尺寸
h,w,c = img.shape // 高度,宽度,通道数
img[h,w ?,c]
:获取图片像素在(w,h)处c通道的颜色信息,读取顺序为B,G,Rimg[h1:h2,w1:w2]
:获取图片像素在(w1:w2,h1:h2)处所有颜色信息img[:,:,c]
:获取所有图片像素在c通道的颜色信息img.size
:获取图片像素数量img.dtype
:获取图像数据类型
图像操作
cv.resize()
:改变图像大小cv.spilt()
:拆分图像通道
(function) def split(
m: MatLike,
mv: Sequence[MatLike] | None = ...
) -> Sequence[MatLike]
cv.merge()
:合并图像通道
(function) def merge(
mv: Sequence[MatLike],
dst: MatLike | None = ...
) -> MatLike
cv.addWeighted()
:融合图像cv.copyMakeBorder()
:对图像进行边界填充np.hstack
:图像水平堆叠
图像处理
色彩空间转化
cv.cvtColor()
- HSV:容易跟踪某种颜色的物体,常用于分割指定颜色的物体
- Hue(色调、色相)
- Saturation(饱和度、色彩纯净度)
- Value(明度)
阈值处理
- 功能:加强图像特定部分
cv.threshold()
图像平滑
cv.blur
:均值滤波cv.boxFilter
:盒式滤波cv.GaussianBlur
:高斯滤波cv.medianBlur
:中值滤波
形态学操作
- 腐蚀:去除边界点,图像变暗
cv.erode()
- 膨胀:扩张边界点,图像变亮
cv.dilate()
- 开操作:先腐蚀后膨胀,去除噪点,平滑轮廓
cv.morphologyEx(img, cv.MORPH_OPEN, kernel)
- 闭操作:先膨胀后腐蚀,填充小洞,连接近邻轮廓
cv.morphologyEx(img, cv.MORPH_CLOSE, kernel)
- 梯度:膨胀-腐蚀,显示边缘轮廓
cv.morphologyEx(img, cv.MORPH_GRADIENT, kernel)
- 顶帽:原图像 - 开操作,突出比原图更亮的区域
cv.morphologyEx(img, cv.MORPH_TOPHAT, kernel)
- 黑帽:闭操作 - 原图像,突出比原图更暗的区域
cv.morphologyEx(img, cv.MORPH_BLACKHAT, kernel)
# 读取图像
img = cv.imread("D:/pic/113220184_touxiang_bobopic.jpg", cv.IMREAD_GRAYSCALE)
# 创建结构元素
kernel = np.ones((5,5),np.uint8)
# 形态学操作
erosion = cv.erode(img, kernel, iterations = 1) # 腐蚀
dilation = cv.dilate(img, kernel, iterations = 1) # 膨胀
opening = cv.morphologyEx(img, cv.MORPH_OPEN, kernel) # 开运算 (先腐蚀后膨胀)
closing = cv.morphologyEx(img, cv.MORPH_CLOSE, kernel) # 闭运算 (先膨胀后腐蚀)
gradient = cv.morphologyEx(img, cv.MORPH_GRADIENT, kernel) # 形态学梯度(膨胀-腐蚀)
tophat = cv.morphologyEx(img, cv.MORPH_TOPHAT, kernel) # 顶帽(原图像-开操作)
blackhat = cv.morphologyEx(img, cv.MORPH_BLACKHAT, kernel)# 黑帽(闭操作-原图像)
# 创建显示窗口
plt.figure(figsize=(12,8))
titles = ['Original', 'Erosion', 'Dilation', 'Opening',
'Closing', 'Gradient', 'Top Hat', 'Black Hat']
images = [img, erosion, dilation, opening,
closing, gradient, tophat, blackhat]
# 使用subplot显示所有结果
for i in range(8):
plt.subplot(2,4,i+1)
plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()
边缘检测
- Sobel 算子:计算图像中每个像素点的梯度值来检测边缘
cv.Sobel()
- Scharr 算子:对 Sobel 算子的改进,通过加权平均来增强梯度计算的效果
cv.Scharr()
- Canny 边缘检测:多阶段的边缘检测算法,旨在检测图像中最显著的边缘,同时减少噪声影响
cv.Canny()
- Laplacian of Gaussian (LoG) 算法:结合了高斯滤波和平滑处理,首先对图像进行高斯平滑,然后使用拉普拉斯算子(Laplacian)计算图像的二阶导数,找出灰度变化率最大的点
cv.Laplacian()
sobelx = cv.Sobel(img, cv.CV_64F, 1, 0, ksize=3) # x方向梯度
sobely = cv.Sobel(img, cv.CV_64F, 0, 1, ksize=3) # y方向梯度
sobelx = cv.convertScaleAbs(sobelx) # 梯度值转换为绝对值,并转换为8位无符号整数类型
sobely = cv.convertScaleAbs(sobely)
sobelxy = cv.addWeighted(sobelx, 0.5, sobely, 0.5, 0) # 将x方向和y方向的梯度图像按照0.5的权重进行融合
scharrx = cv.Scharr(img, cv.CV_64F, 1, 0)
scharry = cv.Scharr(img, cv.CV_64F, 0, 1)
scharrx = cv.convertScaleAbs(scharrx)
scharry = cv.convertScaleAbs(scharry)
scharrxy = cv.addWeighted(scharrx, 0.5, scharry, 0.5, 0)
laplacian = cv.Laplacian(img, cv.CV_64F)
laplacian = cv.convertScaleAbs(laplacian)
canny = cv.Canny(img, 100, 200)
图像金字塔
图像轮廓
窗口控制
创建窗口
cv.namedWindow()
(function) def namedWindow(
winname: str, //窗口名称
flags: int = cv.WINDOW_NORMAL | cv.WINDOW_AUTOSIZE ... // 可调整大小 | 图片原尺寸
) -> None
销毁窗口
cv.destroyAllWindows()
:销毁所有窗口cv.destroyWindow()
: 销毁指定窗口
(function) def destroyWindow(winname: str) -> None
交互控制
键盘交互
cv.waitKey()
:阻塞函数,等待获取用户键盘输入
(function) def waitKey(delay: int = ...) -> int // 程序等待时间,输入`0`一直等待,单位毫秒
Last updated on