赞
踩
import cv2 import numpy as np """ 高通滤波器--锐化图像,增强图像中的高频成分, 如边缘(边缘检测:旨在找出图像中亮度变化显著的区域,大幅度地减少了数据量,并剔除了可以认为不相关的信息,保留了图像的重要结构属性)和细节。 """ """ sobel算子,对图像求一阶导数,一阶导数越大,像素在该方向上的变化越大,边缘信号越强。 采用离散差分算子计算图像像素亮度值的近似梯度 """ img = cv2.imread('./img/cat.jpeg') # 计算x轴方向的梯度,只有垂直方向的边缘 ,cv2.CV_64F:位深 dx=1, dy=0:x轴和y轴的梯度要分开计算 dx = cv2.Sobel(img, cv2.CV_64F, dx=1, dy=0, ksize=3) # 计算y轴方向的梯度,只有水平方向的边缘 dy = cv2.Sobel(img, cv2.CV_64F, dx=0, dy=1, ksize=3) # # xy轴梯度合并 addWeighted也可以 dst = cv2.add(dx, dy) cv2.imshow('img', img) cv2.imshow('com', np.hstack((dx, dy))) cv2.imshow('dst', dst) """ Scharr算子,对sobel的改进(卷积核大小为3时,会产生误差),其余类似 卷积核大小只能是3 """ dx1 = cv2.Scharr(img, cv2.CV_64F, dx=1, dy=0) dy1 = cv2.Scharr(img, cv2.CV_64F, dx=0, dy=1) """ 拉普拉斯算子-通过计算图像灰度函数的二阶导数来检测图像中的边缘和纹理等变化 拉普拉斯算子利用二阶差分来计算图像的边缘。一阶差分可以检测边缘存在的可能性,而二阶差分能确定边缘的存在性。 具体而言,二阶差分是通过找出灰度值变化的拐点来确定边缘的位置。 效果比前面都要好,但是容易受到噪声影响 """ dst1 = cv2.Laplacian(img, cv2.CV_64F, ksize=3) """ 边缘检测--Canny--步骤如下: 噪声抑制:首先,使用高斯滤波器对图像进行平滑处理,以减少图像中的噪声。 高斯滤波器是一种线性平滑滤波器,可以有效地去除图像中的高频噪声,使得图像更加平滑。 梯度计算:计算图像的梯度幅值和方向。 这通常使用Sobel算子来实现,它计算图像中每个像素点灰度变化的强度和方向。梯度幅值表示灰度变化的强度,而梯度方向表示灰度变化的方向。 非极大值抑制:接下来,对图像中的每个像素点进行检查,以确定其是否为边缘点。 通过比较每个像素点在其梯度方向上的两侧像素点的幅值,如果当前像素点的幅值最大,则将其保留为边缘点,否则将其抑制。 这一步骤的目的是剔除大部分非边缘点,保留真正的边缘点。 高低阈值检测:使用高低阈值来确定最终的边缘。 只有当像素点的梯度幅值超过高阈值时,才会被认为是强边缘;而当像素点的梯度幅值低于低阈值时,则会被认为是弱边缘。 强边缘会被保留,而弱边缘中如果与强边缘相连的部分也会被保留,其余的弱边缘则会被抑制。 """ # 100, 200高低阈值, 阈值小的话可以得到更细致的边缘 dst2 = cv2.Canny(img, 100, 200) cv2.waitKey(0) cv2.destroyAllWindows()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。