【OpenCV】计算机视觉图像处理基础知识(下)

简介: 【OpenCV】计算机视觉图像处理基础知识(下)

【OpenCV】计算机视觉图像处理基础知识(上)+https://developer.aliyun.com/article/1502513

3、Scharr算子简介及相关操作

经过大量的科学家验证,发现3*3的Sobel算子可能并不是特别的精确,于是又提出了相应的Scharr算子,其实就是改变了运算的尺度而已。

Sobel算子由原来的121变为了3 10 3,这样的一个组合。其余的操作都是和Sobel算子一致我们来简要的说明一下:

dst=Scharr(src, ddpeth, dx, dy)

这里面少了核的大小,但是和Sobel算子依然一直,参数这里就不解释了,唯一不同的就是我们使用Sobel算子可以设置成dx=1,dy=1。那么对于Scharr算子如果这样设置就会报错。这里需要注意一下。满足条件:

dx >= 0 && dy >= 0 && dx+dy == 1

 

import cv2
import numpy as np
o = cv2.imread('image\\scharr.bmp',cv2.IMREAD_GRAYSCALE)
scharrx = cv2.Scharr(o,cv2.CV_64F,1,0)
scharry = cv2.Scharr(o,cv2.CV_64F,0,1)
scharrx = cv2.convertScaleAbs(scharrx) # 转回uint8 
scharry = cv2.convertScaleAbs(scharry) 
scharrxy = cv2.addWeighted(scharrx,0.5,scharry,0.5,0) 
cv2.imshow("original",o)
cv2.imshow("x",scharrx)
cv2.imshow("y",scharry)
cv2.imshow("xy",scharrxy)
cv2.waitKey()
cv2.destroyAllWindows()

4、Sobel算子和Scharr算子的比较

对于上述我们的测试图,其实看不出来Sobel算子和Scharr算子到底有什么区别,看起来是一致的,那么我们这里使用大美女lena进行一次Sobel和Scharr,得到结果进行对比一下可以知道:

sobelx = cv2.Sobel(o,cv2.CV_64F,1,0,ksize=3)
sobely = cv2.Sobel(o,cv2.CV_64F,0,1,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx) # 转回uint8 
sobely = cv2.convertScaleAbs(sobely) 
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0) 
scharrx = cv2.Scharr(o,cv2.CV_64F,1,0)
scharry = cv2.Scharr(o,cv2.CV_64F,0,1)
scharrx = cv2.convertScaleAbs(scharrx) # 转回uint8 
scharry = cv2.convertScaleAbs(scharry) 
scharrxy = cv2.addWeighted(scharrx,0.5,scharry,0.5,0)

很明显,这里我们看一下了lena的肩膀部分,可以看到使用Shcarr算子进行计算的时候,刻画的更加细致。

5、laplacian算子简介及相关操作

拉普拉斯算子类似于二阶sobel导数。实际上,在OpenCV中通过调用sobel算子来计算拉普拉斯算子。使用的公式为:

∆𝑠𝑟𝑐 = 𝜕2𝑠𝑟𝑐/𝜕𝑥2 + 𝜕2𝑠𝑟𝑐/𝜕𝑦2

使用的卷积核也和Sobel和Shcarr算子的不一致:

看起来有点像高斯的,哈哈哈。

这里我们进行一下讲解,

P5new=(p2+p4+p6+p8)-4*p5

当没有处于边界的时候呢,我们可以得到P5的数值是变化不大的,当处于边界的时候,P5的数值是变化非常大的,这是因为什么呢?

对于拉普拉斯算子的函数估计我们也可以猜到:

dst = cv2.Laplacian( src, ddepth )

自然是没有水平方向和垂直方向的。

实际操作中,计算梯度值可能会出现负数。通常处理的图像是np.uint8类型,如果结果也是该类型,所有负数会自动截断为0,发生信息丢失。所以,通常计算时,使用更高的数据类型cv2.CV_64F,取绝对值后,再转换为np.uint(cv2.CV_8U)类型。

所以我们还是要取一次绝对值的运算:

dst = cv2.convertScaleAbs( src )

 

import cv2
import numpy as np
o = cv2.imread('image\\laplacian.bmp',cv2.IMREAD_GRAYSCALE)
laplacian = cv2.Laplacian(o,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian) # 转回uint8 
cv2.imshow("original",o)
cv2.imshow("laplacian",laplacian)
cv2.waitKey()
cv2.destroyAllWindows()

我们对lena进行一次拉普拉斯算子操作,得到的结果是:

6、Canny边缘检测的原理

Canny边缘检测算子是John F. Canny于 1986 年开发出来的一个多级边缘检测算法。更为重要的是 Canny 创立了边缘检测计算理论(Computational theory of edge detection)解释这项技术如何工作。

Canny 的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是:

1.最优检测:算法能够尽可能多地标识出图像中的实际边缘,漏检真实边缘的概率和误检非边缘的概率都尽可能小;

2.最优定位准则:检测到的边缘点的位置距离实际边缘点的位置最近,或者是由于噪声影响引起检测出的边缘偏离物体的真实边缘的程度最小;

3.检测点与边缘点一一对应:算子检测的边缘点与实际边缘点应该是一一对应。

Canny边缘检测的一般步骤:1.去噪 2.梯度运算 3.非极大值抑制 4.滞后阈值。下面我们就分别讲解一下这些操作:

6.1 去噪

边缘检测容易受到噪声的影响。因此,在进行边缘检测前,通常需要先进行去噪。我们一般使用高斯滤波进行图像去噪处理。也就是让临近的像素具有更高的重要度。对周围像素计算加权平均值,较近的像素具有较大的权重值。

比较像我们之间讲到的k近邻算法的意思哈。进行去噪处理之后呢,我们对于平滑图像进行一次Sobel算子梯度运算。

6.2 梯度运算

𝐸𝑑𝑔𝑒𝐺𝑟𝑎𝑑𝑖𝑒𝑛𝑡 𝐺 = 根号下(𝐺𝑥2 + 𝐺𝑦2)
对于方向:𝐴𝑛𝑔𝑙𝑒 𝜃 = 𝑡𝑎𝑛−1(𝐺𝑦/𝐺𝑥)

对于每一个点计算之后的方向就是这样。大小和方向在图中都已经进行了标记。梯度的方向一般总是与边界垂直。梯度方向被归为四类:垂直,水平,和两个对角线。

6.3 非极大值抑制

在获得了梯度和方向后,遍历图像,去除所有不是边界的点。实现方法:逐个遍历像素点,判断当前像素点是否是周围像素点中具有相同方向梯度的最大值。

点A、点B、点C三点具有相同的方向,梯度方向垂直于边缘。判断点A是否为点A、点B、点C的局部最大值 :如果是,保留该点;否则,它被抑制(归零)。

这里就表示在垂直方向上进行了抑制,取出最大值。

6.4 滞后阈值

这里对非极大值抑制之后,我们进行了一次滞后阈值操作,分别取一个最小阈值和一个最大阈值,然后图像像素点的曲线与最大最小阈值相连则保留,如果不相连则抛弃。

我们来看一下边缘检测的结果图:

7、Canny边缘检测的函数及使用

Canny边缘检测的函数是:

edges = cv2.Canny( image, threshold1, threshold2 )

threshold1表示阈值1,threshold2表示阈值2。也就是我们刚刚介绍到的最大最小阈值。

import cv2
import numpy as np
o=cv2.imread("image\\canny.bmp",cv2.IMREAD_GRAYSCALE)
r=cv2.Canny(o,100,200)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()

然后我们在对lena做一次,结果是:

调整阈值,可以控制边缘细节。maxVal、minVal变小,有更多的细节信息。

如果觉得博主的文章还不错或者您用得到的话,可以免费的关注一下博主,如果三连收藏支持就更好啦!这就是给予我最大的支持!

相关文章
|
4天前
|
算法 计算机视觉
基于qt的opencv实时图像处理框架FastCvLearn实战
本文介绍了一个基于Qt的OpenCV实时图像处理框架FastCvLearn,通过手撕代码的方式详细讲解了如何实现实时人脸马赛克等功能,并提供了结果展示和基础知识回顾。
基于qt的opencv实时图像处理框架FastCvLearn实战
|
3月前
|
机器学习/深度学习 人工智能 算法
Python在计算机视觉(CV)中扮演重要角色,得益于其丰富的库如OpenCV、Pillow和Scikit-image。
【7月更文挑战第5天】Python在计算机视觉(CV)中扮演重要角色,得益于其丰富的库如OpenCV、Pillow和Scikit-image。CV涉及图像处理、模式识别和机器学习,用于图像理解和生成。Python的跨平台特性和活跃社区使其成为CV的理想工具。基本流程包括图像获取、预处理、特征提取、分类识别及图像生成。例如,面部识别通过预处理图像,使用如`cv2.CascadeClassifier`进行检测;物体检测类似,但需适应不同目标;图像生成则利用GAN创造新图像。
52 4
WK
|
2月前
|
计算机视觉 Python
如何使用OpenCV进行基本图像处理
使用OpenCV进行基本图像处理包括安装OpenCV,读取与显示图像,转换图像颜色空间(如从BGR到RGB),调整图像大小,裁剪特定区域,旋转图像,以及应用图像滤镜如高斯模糊等效果。这些基础操作是进行更复杂图像处理任务的前提。OpenCV还支持特征检测、图像分割及对象识别等高级功能。
WK
33 4
|
2月前
|
机器学习/深度学习 并行计算 算法
Ebsynth:利用图像处理和计算机视觉的视频风格转换技术工具
EbSynth 是一款基于视频风格转换技术的工具,专注于将静态艺术风格应用到视频中的每一帧,使视频具有独特的艺术效果。它利用图像处理和计算机视觉技术,将用户提供的参考图像或绘画风格转换为视频效果。
81 2
|
4月前
|
机器学习/深度学习 算法 Java
计算机视觉——opencv快速入门(一) opencv的介绍与安装
OpenCV是开源计算机视觉库,支持C++, Python, Java等,用于图像处理、视频分析等。建议使用较早版本如3.4.3,因高版本部分算法需付费。通过Anaconda创建Python虚拟环境来安装,选择合适的Python和OpenCV版本。激活环境后,用`pip`安装`opencv-python`。基本环境配置完成后,通过显示图像的Python代码测试安装是否成功。
计算机视觉——opencv快速入门(一) opencv的介绍与安装
|
3月前
|
机器学习/深度学习 XML 计算机视觉
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
|
4月前
|
机器学习/深度学习 人工智能 算法
Java图像处理与计算机视觉应用
Java图像处理与计算机视觉应用
|
4月前
|
机器学习/深度学习 数据可视化 算法
探索MATLAB世界:掌握基础知识与实用技能(1. MATLAB环境与基本操作 2. 数据类型与变量 3. 条件与循环,1. 数据分析与统计 2. 图像处理与计算机视觉 3. 信号处理与控制系统)
探索MATLAB世界:掌握基础知识与实用技能(1. MATLAB环境与基本操作 2. 数据类型与变量 3. 条件与循环,1. 数据分析与统计 2. 图像处理与计算机视觉 3. 信号处理与控制系统)
36 0
|
4月前
|
算法 计算机视觉 Python
openCV 3计算机视觉 Python语言实现 笔记 第4章 深度估计与分割
openCV 3计算机视觉 Python语言实现 笔记 第4章 深度估计与分割
|
4月前
|
算法 计算机视觉 Python
openCV 3计算机视觉 Python语言实现 笔记 第三章 使用OpenCV 3处理图像
openCV 3计算机视觉 Python语言实现 笔记 第三章 使用OpenCV 3处理图像

热门文章

最新文章

下一篇
无影云桌面