Opencv-Python学习(三)

Opencv-Python学习(三),第1张

目录

一、Sobel 算子

二、Scharr算子 

 三、Laplacian算子

 四、Canny边缘检测

 五、图像金字塔


一、Sobel 算子

        在边缘检测中,常用的一种模板是Sobel 算子。Sobel 算子有两个,一个是检测水平边缘的 ;另一个是检测垂直边缘的。

       该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。如果以A代表原始图像,Gx及Gy分别代表经横向及纵向边缘检测的图像,其公式如下:

图像的每一个像素的横向及纵向梯度近似值可用以下的公式结合,来计算梯度的大小。

 

然后可用以下公式计算梯度方向。

实现代码: 

import cv2 as cv


def show(name, img):            # 显示函数
    cv.imshow(name, img)
    cv.waitKey(0)


cat1 = cv.imread(r'../de/cat.jpg')
cat1 = cv.resize(cat1, (0, 0), fx=0.5, fy=0.5)

catx = cv.Sobel(cat1, cv.CV_64F, 1, 0, ksize=3) # cv.CV_64F扩大像素的取值范围,可以为负
catx = cv.convertScaleAbs(catx)      # 将负的像素取绝对值
caty = cv.Sobel(cat1, cv.CV_64F, 0, 1, ksize=3) # (1, 0)表示水平方向,(0, 1)表示竖直方向
caty = cv.convertScaleAbs(caty)
cat_Sobel = cv.addWeighted(catx, 0.5, caty, 0.5, 0)
show('cat', cat_Sobel)

效果图:

二、Scharr算子 

        原理和sobel算子是一样的,只不过是卷积核有些区别,

 实现代码:

import numpy as np


def show(name, img):
    cv.imshow(name, img)
    cv.waitKey(0)


cat1 = cv.imread(r'../de/cat.jpg')
cat1 = cv.resize(cat1, (0, 0), fx=0.5, fy=0.5)
catx = cv.Scharr(cat1, cv.CV_64F, 1, 0)
catx = cv.convertScaleAbs(catx)
caty = cv.Scharr(cat1, cv.CV_64F, 0, 1)
caty = cv.convertScaleAbs(caty)
cat_Scharr = cv.addWeighted(catx, 0.5, caty, 0.5, 0)
show('cat', cat_Scharr)

效果图:

 三、Laplacian算子

        Laplacian 算子是n维欧几里德空间中的一个二阶微分算子,定义为梯度grad的散度div。可使用运算模板来运算这定理定律。

       函数的拉普拉斯算子也是该函数的黑塞矩阵的迹,可以证明,它具有各向同性,即与坐标轴方向无关,坐标轴旋转后梯度结果不变。如果邻域系统是4 邻域,Laplacian 算子的模板为:

      如果邻域系统是8 邻域,Laplacian 算子的模板为:

        Laplacian 算子对噪声比较敏感,所以图像一般先经过平滑处理,因为平滑处理也是用模板进行的,所以,通常的分割算法都是把Laplacian 算子和平滑算子结合起来生成一个新的模板。

实现代码:

import cv2 as cv
import numpy as np

def show(name, img):
    cv.imshow(name, img)
    cv.waitKey(0)


cat1 = cv.imread(r'../de/cat.jpg')
cat1 = cv.resize(cat1, (0, 0), fx=0.5, fy=0.5)
cat_lap = cv.Laplacian(cat1, cv.CV_64F, )
cat_lap = cv.convertScaleAbs(cat_lap)
show('cat', cat_lap)

效果图:

 四、Canny边缘检测
  1. 利用高斯滤波对图片进行平滑处理
  2. 计算每个像素的梯度和方向(用Sobel算子,方向:arctan(Gy/Gx))
  3. 运用非极大值抑制来消除边缘检测带来的杂项影响
  4. 应用双阈值检测来确定真实的和潜在的边缘
  5. 通过抑制孤立的弱边缘检测最终完成边缘检测

实现代码:

import cv2 as cv
import numpy as np


def show(name, img):
    cv.imshow(name, img)
    cv.waitKey(0)


cat1 = cv.imread(r'../de/cat.jpg')
cat1 = cv.resize(cat1, (0, 0), fx=0.5, fy=0.5)
img_ganny = cv.Canny(cat1, 100, 120) # 双阈值
img_ganny1 = cv.Canny(cat1, 150, 200)
res = np.hstack((img_ganny, img_ganny1))
show('canny', res)

当双阈值不同时,效果也不相同,当双阈值比较小时,显示的细节会更多,但噪声也就也多,具体效果如下图:

 五、图像金字塔

        图像金字塔是图像多尺度表达的一种,是一种以多分辨率来解释图像的有效但概念简单的结构。一幅图像的图像金字塔是一系列以金字塔形状(自下而上)逐步降低,且来源于同一张原始图的图像分辨率集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低。

(1)高斯金字塔

        向下采样(缩小):将图像与高斯内核进行卷积,然后将所有的偶数行和偶数列去除

       向上采样(放大):首先将每个方向扩大原来的两倍,新增的行和列用0进行填充,然后使用先前一样的卷积核(乘4),与放大后的图像卷积,获得近似值。

 实现代码:

import cv2 as cv

def show(name, img):
    cv.imshow(name, img)
    cv.waitKey(0)


cat1 = cv.imread(r'../de/cat.jpg')
cat1 = cv.resize(cat1, (0, 0), fx=0.5, fy=0.5)
up = cv.pyrUp(cat1)
down = cv.pyrDown(cat1)
show('up', up)
show('down', down)

(2)拉普拉斯金字塔

         拉普拉斯金字塔用来从金字塔低层图像重建上层未采样图像,在数字图像处理中也便是预测残差,能够对图像进行最大程度的还原,配合高斯金字塔一块儿使用。

拉普拉斯金字塔:每一层执行:Li = Gi - PyrUp(PyrDown(Gi))

实现代码:


import cv2 as cv


def show(name, img):
    cv.imshow(name, img)
    cv.waitKey(0)


cat1 = cv.imread(r'../de/cat.jpg')
cat1 = cv.resize(cat1, (0, 0), fx=0.5, fy=0.5)
down = cv.pyrDown(cat1)
down_up = cv.pyrUp(down)
cat1 = cv.resize(cat1,  (600, 376), -1)
res = cat1-down_up
show('res', res)

效果图: 

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/719357.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存