Sobel算子实现边缘检测
# 在OpenCV中内,使用函数cv2.Sobel()实现Sobel算子的运算,其语法格式为:
# dst = cv2.sobel(src, ddepth, dx, dy[, ksize[, scale[, delta[, borderType]]]])
# 式中dst 表示目标图像。 src 代表原始图像。 ddepth代表输出图像的深度。(具体见 p191 表格9-1)。 dx 代表x方向上的求导阶数。
# dy 代表y方向上的求导阶数。 ksize代表Sobel核的大小,该值为-1时,则会使用Scharr算子进行运算。
# scale 代表计算导数值时所采用的缩放因子, 默认情况下该值是1, 是没有缩放的。
# delta 代表加在目标图像dst上的值,该值是可选的,默认为0。
# borderType 代表边界样式,该参数的具体类型及值如表 p192 表9-2。
# 使用不同方式处理图像在两个方向的边缘信息。
# 方式一: 分别使用dx=1,dy=0 和 dx=0,dy=1 计算图像在水平方向和垂直方向的边缘信息,然后将二者相加,构成两个方向的边缘信息。
# 方式二: dx=1,dy=1获取图像的边缘信息。
import cv2
o = cv2.imread('text.jpg', -1) # 读取灰度图像
Sobelx = cv2.Sobel(o, cv2.CV_64F, 1, 0)
Sobely = cv2.Sobel(o, cv2.CV_64F, 0, 1)
Sobelx = cv2.convertScaleAbs(Sobelx)
Sobely = cv2.convertScaleAbs(Sobely)
Sobelxy = cv2.addWeighted(Sobelx, 0.5, Sobely, 0.5, 0)
Sobelxy11 = cv2.Sobel(o, cv2.CV_64F, 1, 1)
Sobelxy11 = cv2.convertScaleAbs(Sobelxy11)
cv2.imshow('o', o)
cv2.imshow('Sobelxy', Sobelxy)
cv2.imshow('Sobelxy11', Sobelxy11)
cv2.waitKey()
效果图
Scharr算子实现边缘检测
# OpenCV中提供了cv2.Scharr()来计算Scharr算子,其语法格式如下:
# dst = cv2.Scharr(src, ddepth, dx, dy, scale, delta, borderType)
# 式中:
# dst代表输出图像。
# src代表原始图像。
# ddepth代表输出图像深度,该值与函数cv2.Sobel()中的参数ddepth的含义相同,具体参考表格。
# dx代表x方向上的导数。
# dy代表y方向上的导数。
# scale代表计算导数时的放缩因子,该项是可选项,默认值为1,表示没有放缩。
# delta代表加到目标图像上的亮度值,该项是可选项,默认值是0.
# borderType代表边界样式,具体可以参考表9-2.
# 语句dst = cv2.Scharr(src, ddepth, dx, dy) 和 dst = cv2.Sobel(src, ddepth, dx, dy, -1)是等价的。
# 另外需要注意的是,在函数cv2.Scharr()中dx和dy只有一下组合形式。
# dx = 1, dy = 0
# dx = 0, dy = 1
# 计算x方向与y方向的边缘叠加: 通过组合方式实现。
# Sobel算子和Scharr算子的比较。
# 分别使用Sobel算子和Scharr算子计算一幅图像的水平和垂直边缘叠加信息。
import cv2
o = cv2.imread('text.jpg', 0)
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) # 绝对值化
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) # 绝对值化
Scharry = cv2.convertScaleAbs(Scharry) # 绝对值化
Scharrxy = cv2.addWeighted(Scharrx, 0.5, Scharry, 0.5, 0)
cv2.imshow('o', o)
cv2.imshow('Sobelxy', Sobelxy)
cv2.imshow('Scharrxy', Scharrxy)
cv2.waitKey()
效果图
Laplacian算子实现边缘检测
# Laplacian算子及函数使用。
# Laplacian(拉普拉斯)算子是一种二阶导数算子,其具有旋转不变性,可以满足不同方向的图像边缘锐化(边缘检测)的要求。
# 语法格式。
# dst = cv2.Laplacian(src, ddepth, ksize, scale, delta, borderType)。
# dst代表目标图像。
# src代表原始图像。
# ddepth代表目标图像的深度。
# ksize代表用于计算Laplacian值的放缩比例因子,该参数是可选的。默认情况下,该值为1,代表不同的缩进。
# delta代表加到目标图像上的可选信息,默认为0.
# borderType代表边界样式。
# 使用函数cv2.Laplacian()函数计算图像的边缘信息。
import cv2
o = cv2.imread('text.jpg', 0)
Laplacian = cv2.Laplacian(o, cv2.CV_64F)
Laplacian = cv2.convertScaleAbs(Laplacian)
cv2.imshow('Laplacian', Laplacian)
cv2.imshow('o', o)
cv2.waitKey()
效果图
Canny边缘实现检测
# Canny边缘检测分为如下几个步骤:
# 步骤一: 去噪。噪声会影响边缘检测的准确性,因此首先要将噪声过滤掉。
# 步骤二: 计算梯度的幅度与方向。
# 步骤三: 非极大值抑制,及适当地让边缘“变瘦”。
# 步骤四: 确定边缘。使用双阈值算法确定最终的边缘信息。
# cv2.Canny()实现Canny边缘检测,其语法格式:
# edges = cv2.Canny(image, thresholdl, threshold2, apertureSize, L2gradient).
# edges 为计算得到的边缘函数
# image为8位输入图像
# threshold1表示处理过程中的第一个阈值
# threshold2表示处理过程中的第二个阈值
# apertureSize表示Sobel算子的孔径大小
# L2gradient为计算图像梯度幅度的标识,其默认值为False。如果未True,则使用更精确的L2范围数进行计算
# 使用函数cv2.Canny()获取图像的边缘,并尝试使用不同大小的threshold1和threshold2,观察获取到的边缘有何不同。
import cv2
o = cv2.imread('text.jpg', 0)
r1 = cv2.Canny(o, 128, 200) # 效果更好一些。
r2 = cv2.Canny(o, 32, 128) # 效果不是很好。
cv2.imshow('o', o)
cv2.imshow('r1', r1)
cv2.imshow('r2', r2)
cv2.waitKey()
# 结论: 当函数cv2.Canny()的参数threshold1和threshold2的值较小时,能够捕获更多的边缘信息。
效果图
傅里叶变换
理论基础
图像处理一般分为: 空间域处理和频率域处理。
空间域处理是直接对图像内的像素进行处理。
频率域处理是先将图像变换到频率域,然后在频率域对图像进行处理,最后再通过反变换将图像从频率域变换到空间域。
法国数学家傅里叶指出,任何周期函数都可以表示为不同频率的正弦函数和的形式。
傅里叶变换就是从频域的角度完整地表述时域信息。
在图像处理的过程中,傅里叶变换就是将图像分解为正弦分量和余弦分量两部分,即将图像从空间域转换到频率域(简称频域),数字图像经过傅里叶变换后,得到的频域值
是复数。因此,显示傅里叶变换的结果需要使用实数图像加虚数图像 或者 幅度图像加相位图像的形式。
对图像进行傅里叶变换后,我们会得到图像中的低频和高频信息,低频信息对应图像内变化缓慢的灰度分量。高频信息对应图像内变化越来越快的灰度分量,是由灰度的尖锐过渡
造成的,例如,在一幅大草原上的图像上有一头狮子, 低频信息就对应着广袤的颜色趋于一致的草原等细节信息,而高频信息则对应着狮子的轮廓等各种边缘及噪声信息。
傅里叶变换的目的,就是为了将图像从空域转换到频域,并在频域内实现对图像内特定对象的处理,然后再对经过处理的频域图像进行逆傅里叶变换得到空域图像,傅里叶变换在图像
处理领域发挥着非常关键的作用,可以实现图像增强,图像去噪,边缘检测,特征提取,图像压缩,和加密等。
Numpy实现傅里叶变换
# 本节介绍如何使用Numpy模块实现图像的傅里叶变换,以及在频域内过滤图像的低频信息保留高频信息,实现高通滤波。
#
# 返回值 = numpy.fft.fft2(原始图像) 注意: 参数“原始类型”的类型是灰度图像,函数的返回值是一个复数数组 为了显示图像,需要将它们的值调回到[0, 255]的灰度空间内
# 使用公示: 像素新值 = 20*np.log(np.abs(频谱值))。
# 使用Numpy实现傅里叶变换,观察得到的频谱图像。
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('text.jpg', 0)
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
magnitude_spectrum = 20*np.log(np.abs(fshift))
plt.subplot(121)
plt.imshow(img, cmap='gray')
plt.title('original')
plt.axis('off')
plt.subplot(122)
plt.imshow(magnitude_spectrum, cmap='gray')
plt.title('result')
plt.axis('off')
plt.show()
效果图
以上就是暑假第二周的部分学习代码
后面继续加油!!