7月12日--7月18日(暑假第二周)学习总结

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()

效果图

在这里插入图片描述

以上就是暑假第二周的部分学习代码

后面继续加油!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想清楚再敲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值