滤波器和边缘检测
滤波器
之前已经说过了如何使用颜色来隔离图像的一部分或者协助进行图像分类,其实,除了颜色信息外,图像中的灰阶色饱和度图案也非常有用,强度用于测量光暗,和亮度类似,它可以用于探测感兴趣对象的其他区域,可以通过查看色饱和度的突然变化,识别对象的边缘,突然变化是指图像从很暗变化到很亮的区域或反向的变化。要探测这些变化需要使用并创建特定图像滤波,观察一组像素并探测图像的色饱和度的大范围变化,这些滤波器会产生输出至显示所有边缘。
现在要讲到的是高通滤波,高通滤波实现的是锐化图片以及强化图像中的高频区域,也就是相邻像素强度发生突变的区域,比如从极暗过渡到极亮的那些像素区域
边缘就是指图像里强度发生突变的区域,通常暗示着物体边界的存在
过滤器:以矩阵形式存在的,通常称为卷积核,其实就是一些值网络,能对图像进行修改以检测边缘的高通滤波器为例,3*3的核,元素总和为0,这个在边缘检测中很重要。
接下来,我们看看滤波器的相关代码:
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import cv2
import numpy as np
%matplotlib inline
#Read in the image
image = mpimg.imread('images/curved_lane.jpg')
plt.imshow(image)
# Convert to grayscale for filtering
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
plt.imshow(gray, cmap='gray')
# Create a custom kernel
# 3x3 array for edge detection
sobel_y = np.array([[ -1, -2, -1],
[ 0, 0, 0],
[ 1, 2, 1]])
## TODO: Create and apply a Sobel x operator
# Filter the image using filter2D, which has inputs: (grayscale image, bit-depth, kernel)
filtered_image = cv2.filter2D(gray, -1, sobel_y) ### 参数-1是指输入输出图像类型保持一致
plt.imshow(filtered_image, cmap='gray')
retval,binary_image = cv2.threshold(filtered_image,70,255,cv2.THRESH_BINARY)
plt.imshow(binary_image, cmap='gray')
原图:
灰度图:
滤波后的图像:
纯黑白图像:
可以看出来,滤波后,边缘很好的检测出来,但是仍存在一些噪声,因此需要用低通滤波器来对图像进行模糊处理,来实现降噪,具体的降噪和低通滤波器的知识,会在接下来的博客里讲述,欢迎大家跟进~