开启生长之旅!这是我参加「日新计划 12 月更文应战」的第28天,点击检查活动详情
卷积操作的首要意图便是对图画进行降维以及特征提取;
1.卷积核往往是行数和列数均为奇数的矩阵,这样中心较好定位;
2.卷积核元素的总和体现出输出的亮度,若元素总和为1,卷积后的图画与原图画亮度根本共同;若元素总和为0,则卷积后的图画根本上是黑色,其间较亮的部分往往便是提取出图画的某种特征;
3.滤波实际上便是Same模式的卷积操作,也便是说滤波后图画的巨细不变,各种滤镜和照片的风格化便是运用不同的滤波器对图画进行操作。因而卷积核、滤波器本质上都是一个东西;
4.高通滤波器(High Pass Filter, HPF)表明仅答应图画中高频部分(即图片中改变较剧烈的部分)经过,往往用于对图画进行锐化处理、增强图画中物体边际等。如Sobel算子、Prewitt算子、锐化滤波器等;
5.低通滤波器(Low Pass Filter, LPF)表明仅答应图画中低频部分(即图片中改变较平缓的部分)经过,往往用于对图画进行含糊/滑润处理、消除噪点等。如高斯滤波器、均值滤波器等;
低通滤波器:
均值滤波
特点:滤波器中元素之和为1,输出亮度与输入根本共同;
均为低通滤波器,首要用于图画含糊/滑润处理、消除噪点;
核越大,含糊程度越大;
其间均值滤波器从名字就能够看出,每个元素值都一样,是卷积核元素个数的倒数,这样每个输出像素便是其周围像素的均值。一个3 3 的均值滤波器如下所示:
高斯滤波
特点:滤波器中元素之和为1,输出亮度与输入根本共同;
均为低通滤波器,首要用于图画含糊/滑润处理、消除噪点;
核越大,含糊程度越大;
高斯滤波器虽然元素总和也为1,但每个方位的权重不一样,权重内行和列上的散布均服从高斯散布,故称高斯滤波器。高斯散布的标准差越大,则含糊程度越大。一个3 3 标准差为1的高斯滤波器如下所示:
高斯和均值滤波器实例
这两个滤波器首要效果均为含糊图画,或在图画预处理中消除图画中的噪点:
高通滤波器:
锐化卷积核
概念:
锐化卷积核从名字就能够看出,首要效果便是对图片进行锐化操作,也便是让图画的边际愈加锐利。图画的边际往往便是改变较大的地方,也便是图画的高频部分,因而锐化卷积核便是一种高通滤波器。一个3 3的锐化卷积核如下所示:
可见该卷积核便是核算中心方位像素与周围像素的差值,差值越大则表明该元素邻近的改变越大(频率越大),输出值也就越大,因而是高频滤波器的一种。锐化卷积核元素总和如果是0,则有提取图画边际信息的效果。
锐化卷积核示例
锐化卷积核效果为杰出图画中物体的边际,相当于给物体描边:
一阶微分算子
概念
图画中物体的边际往往便是改变较为剧烈的部分(高频部分),关于一个函数来说,改变越剧烈的地方,对应的导数的绝对值也就越大。图画便是一种二元函数,f ( x , y )表明( x , y ))处像素的值,因而导数除了巨细,还有方向。那么求图画在某方向上的一阶导数(或称图画的梯度),也就能够反映出图画在该处的改变程度,改变程度越快,在该方向的垂直方向可能就存在物体的边际。
一阶微分算子能够核算出某个方向上物体的边际
但往往对噪声较为敏感,且边际检测敏感度依赖于物体的巨细。
Prewitt算子
Prewitt算子便是对图画进行差分来近似对图画的某个部分求一阶导数。Prewitt算子合适用来辨认噪声较多、灰度突变的图画
例如 像素点P5处 x 和 y 方向上的梯度巨细 g_x 和 g_y 别离核算为
# -*- coding: utf-8 -*-
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图画
img = cv2.imread('C:/Users/123/Pictures/66.png')
img_RGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 灰度化处理图画
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Prewitt算子
kernelx = np.array([[1, 1, 1], [0, 0, 0], [-1, -1, -1]], dtype=int)
kernely = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]], dtype=int)
x = cv2.filter2D(grayImage, cv2.CV_16S, kernelx)
y = cv2.filter2D(grayImage, cv2.CV_16S, kernely)
# 转uint8
absX = cv2.convertScaleAbs(x)
absY = cv2.convertScaleAbs(y)
Prewitt = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)
# 用来正常显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']
# 显示图形
plt.subplot(121),plt.imshow(img_RGB),plt.title('原始图画'), plt.axis('off') #坐标轴封闭
plt.subplot(122),plt.imshow(Prewitt, cmap=plt.cm.gray ),plt.title('Prewitt算子'), plt.axis('off')
plt.show()
Sobel算子
Sobel算子则是Prewitt算子的改进版,对中间的元素恰当进行了加权,Sobel算子与Prewitt算子类似。Sobel算子包括两组33的滤波器,别离对水平及垂直方向上的边际敏感。
让两个方向模板别离沿着x轴、y轴与图画做卷积,方向是从上到下和从左到右。将模板的中 心和图画上的某个像素重合,并将该像素周围的点 与模板上对应的系数相乘,如图所示,其 中Gx及Gy别离代表经横向及纵向边际检测的图画梯度值。
图画上每个像素点的横向及纵向梯度值经过如 下式结合,来核算该点梯度值G的巨细:
为了削减运算时间,进步运算功率,能够运用绝 对值求和近似的方法代替开平方:
由于Sobel算 子关于象素的方位的影响做了加权,能够下降边际 含糊程度,与Prewitt算子、Roberts算子相比效果更好
from skimage import data,filters,img_as_ubyte
import matplotlib.pyplot as plt
import cv2
# 图画读取
img = data.camera()
plt.imshow(img,plt.cm.gray)
'''**********skimage*************'''
# sobel边际检测
edges = filters.sobel(img)
# 浮点型转成uint8型
edges = img_as_ubyte(edges)
# 显示图画
plt.figure()
plt.imshow(edges,plt.cm.gray)
# sobel 水平方向边际检测
edgesh = filters.sobel_h(img)
edgesh = img_as_ubyte(edgesh)
plt.figure()
plt.imshow(edgesh,plt.cm.gray)
# sobel 竖直方向边际检测
edgesv = filters.sobel_v(img)
edgesv = img_as_ubyte(edgesv)
plt.figure()
plt.imshow(edgesv,plt.cm.gray)
'''**********opencv*************'''
# sobel边际检测
edges = cv2.Sobel(img,cv2.CV_16S,1,1)
# 浮点型转成uint8型
edges = cv2.convertScaleAbs(edges)
plt.figure()
plt.imshow(edges,plt.cm.gray)
# sobel 水平方向边际检测
edges = cv2.Sobel(img,cv2.CV_16S,1,0)
edgesh = cv2.convertScaleAbs(edgesh)
plt.figure()
plt.imshow(edgesh,plt.cm.gray)
# sobel 竖直方向边际检测
edges = cv2.Sobel(img,cv2.CV_16S,0,1)
edgesv = cv2.convertScaleAbs(edgesv)
plt.figure()
plt.imshow(edgesv,plt.cm.gray)
别离是原图 全方向solab算子
竖直方向sobel检测 水平向sobel检测